diff --git a/Gruntfile.js b/Gruntfile.js
index b3b8ac7..e4c2b5d 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -11,27 +11,29 @@ module.exports = function(grunt) {
srcFiles = [
'<%= dirs.src %>/Intro.js',
'<%= dirs.src %>/Pixi.js',
- '<%= dirs.src %>/Point.js',
- '<%= dirs.src %>/Rectangle.js',
- '<%= dirs.src %>/Polygon.js',
- '<%= dirs.src %>/DisplayObject.js',
- '<%= dirs.src %>/DisplayObjectContainer.js',
- '<%= dirs.src %>/Sprite.js',
- '<%= dirs.src %>/MovieClip.js',
+ '<%= dirs.src %>/core/Point.js',
+ '<%= dirs.src %>/core/Rectangle.js',
+ '<%= dirs.src %>/core/Polygon.js',
+ '<%= dirs.src %>/core/Matrix.js',
+ '<%= dirs.src %>/display/DisplayObject.js',
+ '<%= dirs.src %>/display/DisplayObjectContainer.js',
+ '<%= dirs.src %>/display/Sprite.js',
+ '<%= dirs.src %>/display/MovieClip.js',
'<%= dirs.src %>/text/Text.js',
'<%= dirs.src %>/text/BitmapText.js',
- '<%= dirs.src %>/Text.js',
'<%= dirs.src %>/InteractionManager.js',
- '<%= dirs.src %>/Stage.js',
+ '<%= dirs.src %>/display/Stage.js',
'<%= dirs.src %>/utils/Utils.js',
'<%= dirs.src %>/utils/EventTarget.js',
- '<%= dirs.src %>/utils/Matrix.js',
'<%= dirs.src %>/utils/Detector.js',
- '<%= dirs.src %>/renderers/WebGLShaders.js',
- '<%= dirs.src %>/renderers/WebGLRenderer.js',
- '<%= dirs.src %>/renderers/WebGLBatch.js',
- '<%= dirs.src %>/renderers/WebGLRenderGroup.js',
- '<%= dirs.src %>/renderers/CanvasRenderer.js',
+ '<%= dirs.src %>/renderers/webgl/WebGLShaders.js',
+ '<%= dirs.src %>/renderers/webgl/WebGLGraphics.js',
+ '<%= dirs.src %>/renderers/webgl/WebGLRenderer.js',
+ '<%= dirs.src %>/renderers/webgl/WebGLBatch.js',
+ '<%= dirs.src %>/renderers/webgl/WebGLRenderGroup.js',
+ '<%= dirs.src %>/renderers/canvas/CanvasRenderer.js',
+ '<%= dirs.src %>/renderers/canvas/CanvasGraphics.js',
+ '<%= dirs.src %>/primitives/Graphics.js',
'<%= dirs.src %>/extras/Strip.js',
'<%= dirs.src %>/extras/Rope.js',
'<%= dirs.src %>/extras/TilingSprite.js',
@@ -116,7 +118,8 @@ module.exports = function(grunt) {
'examples/example 9 - Tiling Texture',
'examples/example 10 - Text',
'examples/example 11 - RenderTexture',
- 'examples/example 12 - Spine'
+ 'examples/example 12 - Spine',
+ 'examples/example 13 - Graphics'
]
},
connect: {
diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js
index 95e4690..21e9a00 100644
--- a/bin/pixi.dev.js
+++ b/bin/pixi.dev.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/bin/pixi.js b/bin/pixi.js
index 913b16e..e0f06cb 100644
--- a/bin/pixi.js
+++ b/bin/pixi.js
@@ -4,11 +4,11 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
*/
-(function(){function t(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function e(){return n.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,n.Matrix}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,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],m=e[4],v=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+m*h,i[4]=f*a+m*l,i[5]=f*o+m*u+v,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,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var n=this.interactiveItems[i];n.visible&&(n.mouseover||n.mouseout||n.buttonMode)&&(n.__hit=this.hitTest(n,this.mouse),n.__hit?(n.buttonMode&&(this.target.view.style.cursor="pointer"),n.__isOver||(n.mouseover&&n.mouseover(this.mouse),n.__isOver=!0)):n.__isOver&&(n.mouseout&&n.mouseout(this.mouse),n.__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(){var t=this.interactiveItems.length;this.mouse.global,this.stage;for(var e=0;t>e;e++){var i=this.interactiveItems[e];if((i.mousedown||i.click)&&(i.__mouseIsDown=!0,i.__hit=this.hitTest(i,this.mouse),i.__hit&&(i.mousedown&&i.mousedown(this.mouse),i.__isDown=!0,!i.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 m=t.hitArea;if(t.hitArea instanceof n.Polygon){for(var v=!1,g=0,x=t.hitArea.points.length-1;t.hitArea.points.length>g;x=g++){var b=t.hitArea.points[g].x,T=t.hitArea.points[g].y,y=t.hitArea.points[x].x,w=t.hitArea.points[x].y,_=T>f!=w>f&&(y-b)*(f-T)/(w-T)+b>p;_&&(v=!v)}if(v)return r&&(e.target=t),!0}else{var R=m.x;if(p>R&&R+m.width>p){var A=m.y;if(f>A&&A+m.height>f)return r&&(e.target=t),!0}}}else if(r){var A,S=t.texture.frame.width,L=t.texture.frame.height,R=-S*t.anchor.x;if(p>R&&R+S>p&&(A=-L*t.anchor.y,f>A&&A+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},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){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(e){this.backgroundColor=e||0,this.backgroundColorSplit=t(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)}},e(),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],m=e[3],v=e[4],g=e[5],x=e[6],b=e[7],T=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]=m*r+v*a+g*l,i[4]=m*n+v*o+g*u,i[5]=m*s+v*h+g*c,i[6]=x*r+b*a+T*l,i[7]=x*n+b*o+T*u,i[8]=x*s+b*h+T*c,i},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],m=t[12],v=t[13],g=t[14],x=t[15],b=e[0],T=e[1],y=e[2],w=e[3];return i[0]=b*r+T*o+y*c+w*m,i[1]=b*n+T*h+y*d+w*v,i[2]=b*s+T*l+y*p+w*g,i[3]=b*a+T*u+y*f+w*x,b=e[4],T=e[5],y=e[6],w=e[7],i[4]=b*r+T*o+y*c+w*m,i[5]=b*n+T*h+y*d+w*v,i[6]=b*s+T*l+y*p+w*g,i[7]=b*a+T*u+y*f+w*x,b=e[8],T=e[9],y=e[10],w=e[11],i[8]=b*r+T*o+y*c+w*m,i[9]=b*n+T*h+y*d+w*v,i[10]=b*s+T*l+y*p+w*g,i[11]=b*a+T*u+y*f+w*x,b=e[12],T=e[13],y=e[14],w=e[15],i[12]=b*r+T*o+y*c+w*m,i[13]=b*n+T*h+y*d+w*v,i[14]=b*s+T*l+y*p+w*g,i[15]=b*a+T*u+y*f+w*x,i},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.shaderFragmentSrc=["precision mediump float;","varying vec2 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 mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],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._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)}this.initShaders();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),this.projectionMatrix=n.mat4.create(),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.initShaders=function(){var t=this.gl,e=n.CompileFragmentShader(t,n.shaderFragmentSrc),i=n.CompileVertexShader(t,n.shaderVertexSrc);n.shaderProgram=t.createProgram();var r=n.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler")},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(this.projectionMatrix),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);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},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)},n.WebGLRenderGroup.prototype.renderSpecific=function(t,e){n.WebGLRenderer.updateTextures();var i=this.gl;this.checkVisibility(t,t.visible),i.uniformMatrix4fv(n.shaderProgram.mvMatrixUniform,!1,e);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):l instanceof n.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof n.Strip?l.visible&&this.renderStrip(l,e):l instanceof n.CustomRenderable&&l.visible&&l.renderWebGL(this,e),void 0;s=this.batchs.indexOf(l),o=this.batchs.indexOf(c),l instanceof n.WebGLBatch?l.render(r):l instanceof n.TilingSprite?l.visible&&this.renderTilingSprite(l,e):l instanceof n.Strip?l.visible&&this.renderStrip(l,e):l instanceof n.CustomRenderable&&l.visible&&l.renderWebGL(this,e);for(var f=s+1;o>f;f++)renderable=this.batchs[f],renderable instanceof n.WebGLBatch?this.batchs[f].render():renderable instanceof n.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable,e):renderable instanceof n.Strip?renderable.visible&&this.renderStrip(renderable,e):renderable instanceof n.CustomRenderable&&renderable.visible&&renderable.renderWebGL(this,e);c instanceof n.WebGLBatch?c.render(0,a+1):c instanceof n.TilingSprite?c.visible&&this.renderTilingSprite(c):c instanceof n.Strip?c.visible&&this.renderStrip(c):c instanceof n.CustomRenderable&&c.visible&&c.renderWebGL(this,e)},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));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,s=n.mat3.toMat4(t.worldTransform);n.mat4.transpose(s),n.mat4.multiply(e,s,s),i.uniformMatrix4fv(r.mvMatrixUniform,!1,s),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.uniformMatrix4fv(r.mvMatrixUniform,!1,e)},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);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,m=r[a+4]*t.texture.width,v=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+v*m+f*x-g*m-v*f-p*x,T=o*g+v*l+h*x-g*l-v*h-o*x,y=p*h+o*m+f*l-h*m-o*f-p*l,w=p*g*l+v*h*m+o*f*x-o*g*m-v*f*l-p*h*x,_=u*g+v*d+c*x-g*d-v*c-u*x,R=p*c+u*m+f*d-c*m-u*f-p*d,A=p*g*d+v*c*m+u*f*x-u*g*m-v*f*d-p*c*x;e.transform(T/b,_/b,y/b,R/b,w/b,A/b),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},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,m=3*(i-n)+1,v=6*t,g=this.curves;g[v]=e*h+d*l+f*o,g[v+1]=i*h+p*l+m*o,g[v+2]=d*u+f*c,g[v+3]=p*u+m*c,g[v+4]=f*c,g[v+5]=m*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,m=h+(r[a+2]-h)*p,v=l+(r[a+3]-l)*p,g=c+(r[a+4]-c)*p;1>i?(n.r+=(f-n.r)*i,n.g+=(m-n.g)*i,n.b+=(v-n.b)*i,n.a+=(g-n.a)*i):(n.r=f,n.g=m,n.b=v,n.a=g)}}},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,m=s*o+this.y,v=s*h,g=this.offset;g[0]=l-d,g[1]=c+u,g[2]=l-v,g[3]=m+u,g[4]=p-v,g[5]=m+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}},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 m=p[f],v=new u.Skin(f);for(var g in m)if(m.hasOwnProperty(g)){var x=e.findSlotIndex(g),b=m[g];for(var T in b)if(b.hasOwnProperty(T)){var y=this.readAttachment(v,T,b[T]);null!=y&&v.addAttachment(x,T,y)}}e.skins.push(v),"default"==v.name&&(e.defaultSkin=v)}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=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,m=c.length;m>f;f++){var v=c[f];d.setFrame(p,v.time,v.angle),u.SkeletonJson.readCurve(d,p,v),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,g=1;"scale"==l?d=new u.ScaleTimeline(c.length):(d=new u.TranslateTimeline(c.length),g=this.scale),d.boneIndex=o;for(var p=0,f=0,m=c.length;m>f;f++){var v=c[f],x=(v.x||0)*g,b=(v.y||0)*g;d.setFrame(p,v.time,x,b),u.SkeletonJson.readCurve(d,p,v),p++}r.push(d),n=Math.max(n,d.frames[3*d.getFrameCount()-3])}}}var T=e.slots;for(var y in T)if(T.hasOwnProperty(y)){var w=T[y],_=i.findSlotIndex(y);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=_;for(var p=0,f=0,m=c.length;m>f;f++){var v=c[f],R=v.color,A=u.SkeletonJson.toColor(R,0),S=u.SkeletonJson.toColor(R,1),L=u.SkeletonJson.toColor(R,2),C=u.SkeletonJson.toColor(R,3);d.setFrame(p,v.time,A,S,L,C),u.SkeletonJson.readCurve(d,p,v),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+" ("+y+")";var d=new u.AttachmentTimeline(c.length);d.slotIndex=_;for(var p=0,f=0,m=c.length;m>f;f++){var v=c[f];d.setFrame(p++,v.time,v.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.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();for(var s=0,a=r.length;a>s;s++)r[s].updateTransform();var o=t.__renderGroup;o?t==o.root?o.render(this.projectionMatrix):o.renderSpecific(t,this.projectionMatrix):(this.renderGroup||(this.renderGroup=new n.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render(this.projectionMatrix))},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
+(function(){function t(){return o.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,o.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]}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
diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html
index 5bd93e7..018c1bb 100644
--- a/docs/classes/BitmapText.html
+++ b/docs/classes/BitmapText.html
@@ -602,7 +602,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObjectContainer.js:41
+ src/pixi/display/DisplayObjectContainer.js:41
@@ -692,7 +692,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObjectContainer.js:73
+ src/pixi/display/DisplayObjectContainer.js:73
@@ -791,7 +791,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObject.js:106
+ src/pixi/display/DisplayObject.js:106
@@ -820,7 +820,7 @@ http://www.bmglyph.com/ for mac.
-
+
@@ -875,7 +875,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObjectContainer.js:168
+ src/pixi/display/DisplayObjectContainer.js:168
@@ -959,7 +959,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObject.js:112
+ src/pixi/display/DisplayObject.js:112
@@ -988,7 +988,7 @@ http://www.bmglyph.com/ for mac.
-
+
@@ -1043,7 +1043,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObject.js:138
+ src/pixi/display/DisplayObject.js:138
@@ -1072,7 +1072,7 @@ http://www.bmglyph.com/ for mac.
-
+
@@ -1127,7 +1127,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObject.js:132
+ src/pixi/display/DisplayObject.js:132
@@ -1156,7 +1156,7 @@ http://www.bmglyph.com/ for mac.
-
+
@@ -1211,7 +1211,7 @@ http://www.bmglyph.com/ for mac.
- src/pixi/DisplayObject.js:118
+ src/pixi/display/DisplayObject.js:118
@@ -1241,7 +1241,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1296,7 +1296,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
- src/pixi/DisplayObject.js:125
+ src/pixi/display/DisplayObject.js:125
@@ -1326,7 +1326,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1381,7 +1381,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObjectContainer.js:186
+ src/pixi/display/DisplayObjectContainer.js:186
@@ -1465,7 +1465,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObject.js:190
+ src/pixi/display/DisplayObject.js:190
@@ -1494,7 +1494,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1760,7 +1760,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObjectContainer.js:128
+ src/pixi/display/DisplayObjectContainer.js:128
@@ -1859,7 +1859,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObject.js:149
+ src/pixi/display/DisplayObject.js:149
@@ -1889,7 +1889,7 @@ basically a touch version of click
-
+
@@ -1944,7 +1944,7 @@ basically a touch version of click
- src/pixi/DisplayObject.js:162
+ src/pixi/display/DisplayObject.js:162
@@ -1973,7 +1973,7 @@ basically a touch version of click
-
+
@@ -2028,7 +2028,7 @@ basically a touch version of click
- src/pixi/DisplayObject.js:168
+ src/pixi/display/DisplayObject.js:168
@@ -2058,7 +2058,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2113,7 +2113,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:156
+ src/pixi/display/DisplayObject.js:156
@@ -2142,7 +2142,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2186,7 +2186,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:40
+ src/pixi/display/DisplayObject.js:40
@@ -2227,7 +2227,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:95
+ src/pixi/display/DisplayObject.js:95
@@ -2268,7 +2268,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObjectContainer.js:16
+ src/pixi/display/DisplayObjectContainer.js:16
@@ -2309,7 +2309,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:69
+ src/pixi/display/DisplayObject.js:69
@@ -2351,7 +2351,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:55
+ src/pixi/display/DisplayObject.js:55
@@ -2392,7 +2392,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:26
+ src/pixi/display/DisplayObject.js:26
@@ -2433,7 +2433,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:12
+ src/pixi/display/DisplayObject.js:12
@@ -2474,7 +2474,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:33
+ src/pixi/display/DisplayObject.js:33
@@ -2515,7 +2515,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:19
+ src/pixi/display/DisplayObject.js:19
@@ -2556,7 +2556,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:62
+ src/pixi/display/DisplayObject.js:62
@@ -2597,7 +2597,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:47
+ src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html
index ec90416..d769647 100644
--- a/docs/classes/CanvasRenderer.html
+++ b/docs/classes/CanvasRenderer.html
@@ -142,7 +142,7 @@
@@ -225,7 +225,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:6
+ src/pixi/renderers/canvas/CanvasRenderer.js:6
@@ -442,7 +442,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:66
+ src/pixi/renderers/canvas/CanvasRenderer.js:66
@@ -518,7 +518,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:55
+ src/pixi/renderers/canvas/CanvasRenderer.js:55
@@ -562,7 +562,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:31
+ src/pixi/renderers/canvas/CanvasRenderer.js:31
@@ -608,7 +608,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:41
+ src/pixi/renderers/canvas/CanvasRenderer.js:41
@@ -652,7 +652,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
- src/pixi/renderers/CanvasRenderer.js:24
+ src/pixi/renderers/canvas/CanvasRenderer.js:24
diff --git a/docs/classes/CustomRenderable.html b/docs/classes/CustomRenderable.html
index 86c0ec9..1c3558a 100644
--- a/docs/classes/CustomRenderable.html
+++ b/docs/classes/CustomRenderable.html
@@ -458,7 +458,7 @@
- src/pixi/DisplayObject.js:106
+ src/pixi/display/DisplayObject.js:106
@@ -487,7 +487,7 @@
-
+
@@ -542,7 +542,7 @@
- src/pixi/DisplayObject.js:112
+ src/pixi/display/DisplayObject.js:112
@@ -571,7 +571,7 @@
-
+
@@ -626,7 +626,7 @@
- src/pixi/DisplayObject.js:138
+ src/pixi/display/DisplayObject.js:138
@@ -655,7 +655,7 @@
-
+
@@ -710,7 +710,7 @@
- src/pixi/DisplayObject.js:132
+ src/pixi/display/DisplayObject.js:132
@@ -739,7 +739,7 @@
-
+
@@ -794,7 +794,7 @@
- src/pixi/DisplayObject.js:118
+ src/pixi/display/DisplayObject.js:118
@@ -824,7 +824,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -879,7 +879,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
- src/pixi/DisplayObject.js:125
+ src/pixi/display/DisplayObject.js:125
@@ -909,7 +909,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -964,7 +964,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObject.js:190
+ src/pixi/display/DisplayObject.js:190
@@ -993,7 +993,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1048,7 +1048,7 @@ for this callback to be fired, The touch must have started over the displayObjec
- src/pixi/DisplayObject.js:149
+ src/pixi/display/DisplayObject.js:149
@@ -1078,7 +1078,7 @@ basically a touch version of click
-
+
@@ -1133,7 +1133,7 @@ basically a touch version of click
- src/pixi/DisplayObject.js:162
+ src/pixi/display/DisplayObject.js:162
@@ -1162,7 +1162,7 @@ basically a touch version of click
-
+
@@ -1217,7 +1217,7 @@ basically a touch version of click
- src/pixi/DisplayObject.js:168
+ src/pixi/display/DisplayObject.js:168
@@ -1247,7 +1247,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1302,7 +1302,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:156
+ src/pixi/display/DisplayObject.js:156
@@ -1331,7 +1331,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1375,7 +1375,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:40
+ src/pixi/display/DisplayObject.js:40
@@ -1416,7 +1416,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:95
+ src/pixi/display/DisplayObject.js:95
@@ -1457,7 +1457,7 @@ for this callback to be fired, The touch must have started over the sprite
- src/pixi/DisplayObject.js:69
+ src/pixi/display/DisplayObject.js:69
@@ -1499,7 +1499,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:55
+ src/pixi/display/DisplayObject.js:55
@@ -1540,7 +1540,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:26
+ src/pixi/display/DisplayObject.js:26
@@ -1581,7 +1581,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:12
+ src/pixi/display/DisplayObject.js:12
@@ -1622,7 +1622,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:33
+ src/pixi/display/DisplayObject.js:33
@@ -1663,7 +1663,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:19
+ src/pixi/display/DisplayObject.js:19
@@ -1704,7 +1704,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:62
+ src/pixi/display/DisplayObject.js:62
@@ -1745,7 +1745,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
- src/pixi/DisplayObject.js:47
+ src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html
index d9531c8..e213086 100644
--- a/docs/classes/DisplayObject.html
+++ b/docs/classes/DisplayObject.html
@@ -142,7 +142,7 @@
@@ -196,7 +196,7 @@
- src/pixi/DisplayObject.js:5
+ src/pixi/display/DisplayObject.js:5
@@ -244,15 +244,6 @@
-
- autoDetectRenderer
-
-
- static
-
-
-
-
click
@@ -424,159 +415,6 @@
Methods
-
-
autoDetectRenderer
-
-
-
-
(
-
-
-
- width
-
-
-
-
-
- height
-
-
-
-
-
- view
-
-
-
-
-
- transparent
-
-
-
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
static
-
-
-
-
-
-
-
-
-
-
This helper function will automatically detect which renderer you should be using.
-WebGL is the preferred renderer as it is a lot fastest. If webGL is not supported by the browser then this function will return a canvas renderer
-
-
-
-
-
Parameters:
-
-
-
-
-
- width
- Number
-
-
-
-
-
-
the width of the renderers view
-
-
-
-
-
-
-
- height
- Number
-
-
-
-
-
-
the height of the renderers view
-
-
-
-
-
-
-
- view
- Canvas
-
-
-
-
-
-
the canvas to use as a view, optional
-
-
-
-
-
-
-
- transparent
- Boolean
-
-
-
-
-
-
the transparency of the render view, default false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
click
@@ -619,7 +457,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -648,7 +486,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
+
@@ -706,7 +544,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -735,7 +573,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
+
@@ -793,7 +631,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -822,7 +660,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
+
@@ -880,7 +718,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -909,7 +747,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
+
@@ -967,7 +805,7 @@ WebGL is the preferred renderer as it is a lot fastest. If webGL is not supporte
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -997,7 +835,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1055,7 +893,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1085,7 +923,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1143,7 +981,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1172,7 +1010,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1230,7 +1068,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1260,7 +1098,7 @@ basically a touch version of click
-
+
@@ -1318,7 +1156,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -1347,7 +1185,7 @@ basically a touch version of click
-
+
@@ -1405,7 +1243,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -1435,7 +1273,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1493,7 +1331,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -1522,7 +1360,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1569,7 +1407,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -1613,7 +1451,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -1657,7 +1495,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -1702,7 +1540,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -1746,7 +1584,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -1790,7 +1628,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -1834,7 +1672,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -1878,7 +1716,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -1922,7 +1760,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -1966,7 +1804,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html
index 0d1e17b..13d76d9 100644
--- a/docs/classes/DisplayObjectContainer.html
+++ b/docs/classes/DisplayObjectContainer.html
@@ -146,7 +146,7 @@
@@ -200,7 +200,7 @@
-
src/pixi/DisplayObjectContainer.js:6
+
src/pixi/renderers/webgl/WebGLGraphics.js:6
@@ -503,7 +503,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -596,7 +596,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -695,7 +695,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -724,7 +724,7 @@
-
+
@@ -782,7 +782,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -866,7 +866,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -895,7 +895,7 @@
-
+
@@ -950,7 +950,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -979,7 +979,7 @@
-
+
@@ -1034,7 +1034,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1063,7 +1063,7 @@
-
+
@@ -1118,7 +1118,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1148,7 +1148,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1203,7 +1203,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1233,7 +1233,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1291,7 +1291,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1375,7 +1375,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1404,7 +1404,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1468,7 +1468,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -1567,7 +1567,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1597,7 +1597,7 @@ basically a touch version of click
-
+
@@ -1652,7 +1652,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -1681,7 +1681,7 @@ basically a touch version of click
-
+
@@ -1736,7 +1736,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -1766,7 +1766,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1821,7 +1821,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -1850,7 +1850,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1894,7 +1894,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -1935,7 +1935,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -1979,7 +1979,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2020,7 +2020,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2062,7 +2062,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2103,7 +2103,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2144,7 +2144,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2185,7 +2185,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2226,7 +2226,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2267,7 +2267,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2308,7 +2308,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html
index 4c26c7c..df4b990 100644
--- a/docs/classes/InteractionData.html
+++ b/docs/classes/InteractionData.html
@@ -142,7 +142,7 @@
@@ -196,7 +196,7 @@
-
src/pixi/InteractionManager.js:513
+
src/pixi/InteractionManager.js:519
@@ -335,7 +335,7 @@
-
src/pixi/InteractionManager.js:537
+
src/pixi/InteractionManager.js:543
@@ -424,7 +424,7 @@
-
src/pixi/InteractionManager.js:519
+
src/pixi/InteractionManager.js:525
@@ -468,7 +468,7 @@
-
src/pixi/InteractionManager.js:529
+
src/pixi/InteractionManager.js:535
diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html
index 9669e2e..d75b60d 100644
--- a/docs/classes/InteractionManager.html
+++ b/docs/classes/InteractionManager.html
@@ -259,6 +259,8 @@ This manager also supports multitouch.
Index
+
Methods
+
Properties
@@ -271,6 +273,23 @@ This manager also supports multitouch.
Item Index
+
+
@@ -309,6 +328,165 @@ This manager also supports multitouch.
+
+
Methods
+
+
+
+
autoDetectRenderer
+
+
+
+
(
+
+
+
+ width
+
+
+
+
+
+ height
+
+
+
+
+
+ view
+
+
+
+
+
+ transparent
+
+
+
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
static
+
+
+
+
+
+
+
+
+
+
This helper function will automatically detect which renderer you should be using.
+WebGL is the preferred renderer as it is a lot fastest. If webGL is not supported by the browser then this function will return a canvas renderer
+
+
+
+
+
Parameters:
+
+
+
+
+
+ width
+ Number
+
+
+
+
+
+
the width of the renderers view
+
+
+
+
+
+
+
+ height
+ Number
+
+
+
+
+
+
the height of the renderers view
+
+
+
+
+
+
+
+ view
+ Canvas
+
+
+
+
+
+
the canvas to use as a view, optional
+
+
+
+
+
+
+
+ transparent
+ Boolean
+
+
+
+
+
+
the transparency of the render view, default false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html
index 229a09b..cdfa393 100644
--- a/docs/classes/MovieClip.html
+++ b/docs/classes/MovieClip.html
@@ -146,7 +146,7 @@
@@ -210,7 +210,7 @@
-
src/pixi/MovieClip.js:5
+
src/pixi/display/MovieClip.js:5
@@ -645,7 +645,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -735,7 +735,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -834,7 +834,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -863,7 +863,7 @@
-
+
@@ -918,7 +918,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -1005,7 +1005,7 @@
-
src/pixi/MovieClip.js:94
+
src/pixi/display/MovieClip.js:94
@@ -1092,7 +1092,7 @@
-
src/pixi/MovieClip.js:81
+
src/pixi/display/MovieClip.js:81
@@ -1176,7 +1176,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -1205,7 +1205,7 @@
-
+
@@ -1260,7 +1260,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1289,7 +1289,7 @@
-
+
@@ -1344,7 +1344,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1373,7 +1373,7 @@
-
+
@@ -1428,7 +1428,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1458,7 +1458,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1513,7 +1513,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1543,7 +1543,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1591,7 +1591,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/MovieClip.js:72
+
src/pixi/display/MovieClip.js:72
@@ -1652,7 +1652,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1736,7 +1736,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1765,7 +1765,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1820,7 +1820,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/Sprite.js:103
+
src/pixi/display/Sprite.js:103
@@ -1897,7 +1897,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/MovieClip.js:63
+
src/pixi/display/MovieClip.js:63
@@ -1964,7 +1964,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -2063,7 +2063,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -2093,7 +2093,7 @@ basically a touch version of click
-
+
@@ -2148,7 +2148,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -2177,7 +2177,7 @@ basically a touch version of click
-
+
@@ -2232,7 +2232,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -2262,7 +2262,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2317,7 +2317,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -2346,7 +2346,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2390,7 +2390,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -2431,7 +2431,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/Sprite.js:21
+
src/pixi/display/Sprite.js:21
@@ -2478,7 +2478,7 @@ Setting the anchor to 1,1 would mean the textures origin points will be the bott
-
src/pixi/MovieClip.js:30
+
src/pixi/display/MovieClip.js:30
@@ -2519,7 +2519,7 @@ Setting the anchor to 1,1 would mean the textures origin points will be the bott
-
src/pixi/Sprite.js:38
+
src/pixi/display/Sprite.js:38
@@ -2561,7 +2561,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -2602,7 +2602,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2646,7 +2646,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/MovieClip.js:23
+
src/pixi/display/MovieClip.js:23
@@ -2687,7 +2687,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/Sprite.js:53
+
src/pixi/display/Sprite.js:53
@@ -2728,7 +2728,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2773,7 +2773,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/MovieClip.js:37
+
src/pixi/display/MovieClip.js:37
@@ -2817,7 +2817,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/MovieClip.js:44
+
src/pixi/display/MovieClip.js:44
@@ -2858,7 +2858,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2899,7 +2899,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2943,7 +2943,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/MovieClip.js:51
+
src/pixi/display/MovieClip.js:51
@@ -2984,7 +2984,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -3025,7 +3025,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -3066,7 +3066,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -3107,7 +3107,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -3148,7 +3148,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:31
+
src/pixi/display/Sprite.js:31
@@ -3192,7 +3192,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/MovieClip.js:16
+
src/pixi/display/MovieClip.js:16
@@ -3233,7 +3233,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
@@ -3274,7 +3274,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:46
+
src/pixi/display/Sprite.js:46
diff --git a/docs/classes/Point.html b/docs/classes/Point.html
index 87114ce..a259733 100644
--- a/docs/classes/Point.html
+++ b/docs/classes/Point.html
@@ -142,7 +142,7 @@
@@ -212,7 +212,7 @@
-
src/pixi/Point.js:5
+
src/pixi/core/Point.js:5
@@ -379,7 +379,7 @@
-
src/pixi/Point.js:29
+
src/pixi/core/Point.js:29
@@ -443,7 +443,7 @@
-
src/pixi/Point.js:14
+
src/pixi/core/Point.js:14
@@ -489,7 +489,7 @@
-
src/pixi/Point.js:21
+
src/pixi/core/Point.js:21
diff --git a/docs/classes/Polygon.html b/docs/classes/Polygon.html
index 6669a83..d40772b 100644
--- a/docs/classes/Polygon.html
+++ b/docs/classes/Polygon.html
@@ -142,7 +142,7 @@
@@ -206,7 +206,7 @@
-
src/pixi/Polygon.js:5
+
src/pixi/core/Polygon.js:5
@@ -334,7 +334,7 @@
-
src/pixi/Polygon.js:15
+
src/pixi/core/Polygon.js:15
diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html
index 18a02b4..9207097 100644
--- a/docs/classes/Rectangle.html
+++ b/docs/classes/Rectangle.html
@@ -142,7 +142,7 @@
@@ -224,7 +224,7 @@
-
src/pixi/Rectangle.js:5
+
src/pixi/core/Rectangle.js:5
@@ -435,7 +435,7 @@
-
src/pixi/Rectangle.js:45
+
src/pixi/core/Rectangle.js:45
@@ -499,7 +499,7 @@
-
src/pixi/Rectangle.js:37
+
src/pixi/core/Rectangle.js:37
@@ -545,7 +545,7 @@
-
src/pixi/Rectangle.js:30
+
src/pixi/core/Rectangle.js:30
@@ -591,7 +591,7 @@
-
src/pixi/Rectangle.js:16
+
src/pixi/core/Rectangle.js:16
@@ -637,7 +637,7 @@
-
src/pixi/Rectangle.js:23
+
src/pixi/core/Rectangle.js:23
diff --git a/docs/classes/Spine.html b/docs/classes/Spine.html
index 5ef8e25..5068686 100644
--- a/docs/classes/Spine.html
+++ b/docs/classes/Spine.html
@@ -538,7 +538,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -628,7 +628,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -727,7 +727,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -756,7 +756,7 @@ When loaded this class will dispatch a "loaded" event
-
+
@@ -811,7 +811,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -895,7 +895,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -924,7 +924,7 @@ When loaded this class will dispatch a "loaded" event
-
+
@@ -979,7 +979,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1008,7 +1008,7 @@ When loaded this class will dispatch a "loaded" event
-
+
@@ -1063,7 +1063,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1092,7 +1092,7 @@ When loaded this class will dispatch a "loaded" event
-
+
@@ -1147,7 +1147,7 @@ When loaded this class will dispatch a "loaded" event
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1177,7 +1177,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1232,7 +1232,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1262,7 +1262,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1317,7 +1317,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1401,7 +1401,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1430,7 +1430,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1491,7 +1491,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -1590,7 +1590,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1620,7 +1620,7 @@ basically a touch version of click
-
+
@@ -1675,7 +1675,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -1704,7 +1704,7 @@ basically a touch version of click
-
+
@@ -1759,7 +1759,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -1789,7 +1789,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1844,7 +1844,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -1873,7 +1873,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1917,7 +1917,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -1958,7 +1958,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -1999,7 +1999,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2040,7 +2040,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2082,7 +2082,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2123,7 +2123,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2164,7 +2164,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2205,7 +2205,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2246,7 +2246,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2287,7 +2287,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2328,7 +2328,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html
index 1219a2e..739bc40 100644
--- a/docs/classes/Sprite.html
+++ b/docs/classes/Sprite.html
@@ -146,7 +146,7 @@
@@ -210,7 +210,7 @@
-
src/pixi/Sprite.js:10
+
src/pixi/display/Sprite.js:10
@@ -593,7 +593,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -683,7 +683,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -782,7 +782,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -811,7 +811,7 @@
-
+
@@ -875,7 +875,7 @@
-
src/pixi/Sprite.js:135
+
src/pixi/display/Sprite.js:135
@@ -982,7 +982,7 @@
-
src/pixi/Sprite.js:151
+
src/pixi/display/Sprite.js:151
@@ -1080,7 +1080,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -1164,7 +1164,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -1193,7 +1193,7 @@
-
+
@@ -1248,7 +1248,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1277,7 +1277,7 @@
-
+
@@ -1332,7 +1332,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1361,7 +1361,7 @@
-
+
@@ -1416,7 +1416,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1446,7 +1446,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1501,7 +1501,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1531,7 +1531,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1586,7 +1586,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1670,7 +1670,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1699,7 +1699,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1757,7 +1757,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/Sprite.js:103
+
src/pixi/display/Sprite.js:103
@@ -1847,7 +1847,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -1946,7 +1946,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1976,7 +1976,7 @@ basically a touch version of click
-
+
@@ -2031,7 +2031,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -2060,7 +2060,7 @@ basically a touch version of click
-
+
@@ -2115,7 +2115,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -2145,7 +2145,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2200,7 +2200,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -2229,7 +2229,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2273,7 +2273,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -2317,7 +2317,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/Sprite.js:21
+
src/pixi/display/Sprite.js:21
@@ -2364,7 +2364,7 @@ Setting the anchor to 1,1 would mean the textures origin points will be the bott
-
src/pixi/Sprite.js:38
+
src/pixi/display/Sprite.js:38
@@ -2406,7 +2406,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -2447,7 +2447,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2491,7 +2491,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/Sprite.js:53
+
src/pixi/display/Sprite.js:53
@@ -2532,7 +2532,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2574,7 +2574,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2615,7 +2615,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2656,7 +2656,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2697,7 +2697,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2738,7 +2738,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2779,7 +2779,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2823,7 +2823,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:31
+
src/pixi/display/Sprite.js:31
@@ -2864,7 +2864,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
@@ -2908,7 +2908,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:46
+
src/pixi/display/Sprite.js:46
diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html
index fe5c754..e8e5ff1 100644
--- a/docs/classes/Stage.html
+++ b/docs/classes/Stage.html
@@ -146,7 +146,7 @@
@@ -216,7 +216,7 @@
-
src/pixi/Stage.js:5
+
src/pixi/display/Stage.js:5
@@ -575,7 +575,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -665,7 +665,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -764,7 +764,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -793,7 +793,7 @@
-
+
@@ -848,7 +848,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -929,7 +929,7 @@
-
src/pixi/Stage.js:76
+
src/pixi/display/Stage.js:76
@@ -1003,7 +1003,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -1032,7 +1032,7 @@
-
+
@@ -1087,7 +1087,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1116,7 +1116,7 @@
-
+
@@ -1171,7 +1171,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1200,7 +1200,7 @@
-
+
@@ -1255,7 +1255,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1285,7 +1285,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1340,7 +1340,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1370,7 +1370,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1425,7 +1425,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1512,7 +1512,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/Stage.js:63
+
src/pixi/display/Stage.js:63
@@ -1596,7 +1596,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1625,7 +1625,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1686,7 +1686,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -1785,7 +1785,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1815,7 +1815,7 @@ basically a touch version of click
-
+
@@ -1870,7 +1870,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -1899,7 +1899,7 @@ basically a touch version of click
-
+
@@ -1954,7 +1954,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -1984,7 +1984,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2039,7 +2039,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -2068,7 +2068,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2116,7 +2116,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/Stage.js:40
+
src/pixi/display/Stage.js:40
@@ -2166,7 +2166,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -2207,7 +2207,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -2248,7 +2248,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2289,7 +2289,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2331,7 +2331,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2372,7 +2372,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2413,7 +2413,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2454,7 +2454,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2495,7 +2495,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2536,7 +2536,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2577,7 +2577,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/Text.html b/docs/classes/Text.html
index 9c342b1..5101bab 100644
--- a/docs/classes/Text.html
+++ b/docs/classes/Text.html
@@ -706,7 +706,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -796,7 +796,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -895,7 +895,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -924,7 +924,7 @@
-
+
@@ -979,7 +979,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -1063,7 +1063,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -1092,7 +1092,7 @@
-
+
@@ -1147,7 +1147,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1176,7 +1176,7 @@
-
+
@@ -1231,7 +1231,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1260,7 +1260,7 @@
-
+
@@ -1315,7 +1315,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1345,7 +1345,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1400,7 +1400,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1430,7 +1430,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1485,7 +1485,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1569,7 +1569,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1598,7 +1598,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1850,7 +1850,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/Sprite.js:103
+
src/pixi/display/Sprite.js:103
@@ -1940,7 +1940,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -2039,7 +2039,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -2069,7 +2069,7 @@ basically a touch version of click
-
+
@@ -2124,7 +2124,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -2153,7 +2153,7 @@ basically a touch version of click
-
+
@@ -2208,7 +2208,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -2238,7 +2238,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2293,7 +2293,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -2322,7 +2322,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -2366,7 +2366,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -2407,7 +2407,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/Sprite.js:21
+
src/pixi/display/Sprite.js:21
@@ -2451,7 +2451,7 @@ Setting the anchor to 1,1 would mean the textures origin points will be the bott
-
src/pixi/Sprite.js:38
+
src/pixi/display/Sprite.js:38
@@ -2493,7 +2493,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -2534,7 +2534,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2575,7 +2575,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/Sprite.js:53
+
src/pixi/display/Sprite.js:53
@@ -2616,7 +2616,7 @@ currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2658,7 +2658,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2699,7 +2699,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2740,7 +2740,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2781,7 +2781,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2822,7 +2822,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2863,7 +2863,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2904,7 +2904,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:31
+
src/pixi/display/Sprite.js:31
@@ -2945,7 +2945,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
@@ -2986,7 +2986,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/Sprite.js:46
+
src/pixi/display/Sprite.js:46
diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html
index 83520de..1238c80 100644
--- a/docs/classes/TilingSprite.html
+++ b/docs/classes/TilingSprite.html
@@ -589,7 +589,7 @@
-
src/pixi/DisplayObjectContainer.js:41
+
src/pixi/display/DisplayObjectContainer.js:41
@@ -679,7 +679,7 @@
-
src/pixi/DisplayObjectContainer.js:73
+
src/pixi/display/DisplayObjectContainer.js:73
@@ -778,7 +778,7 @@
-
src/pixi/DisplayObject.js:106
+
src/pixi/display/DisplayObject.js:106
@@ -807,7 +807,7 @@
-
+
@@ -862,7 +862,7 @@
-
src/pixi/DisplayObjectContainer.js:168
+
src/pixi/display/DisplayObjectContainer.js:168
@@ -946,7 +946,7 @@
-
src/pixi/DisplayObject.js:112
+
src/pixi/display/DisplayObject.js:112
@@ -975,7 +975,7 @@
-
+
@@ -1030,7 +1030,7 @@
-
src/pixi/DisplayObject.js:138
+
src/pixi/display/DisplayObject.js:138
@@ -1059,7 +1059,7 @@
-
+
@@ -1114,7 +1114,7 @@
-
src/pixi/DisplayObject.js:132
+
src/pixi/display/DisplayObject.js:132
@@ -1143,7 +1143,7 @@
-
+
@@ -1198,7 +1198,7 @@
-
src/pixi/DisplayObject.js:118
+
src/pixi/display/DisplayObject.js:118
@@ -1228,7 +1228,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
+
@@ -1283,7 +1283,7 @@ for this callback to be fired the mouse must have been pressed down over the dis
-
src/pixi/DisplayObject.js:125
+
src/pixi/display/DisplayObject.js:125
@@ -1313,7 +1313,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1368,7 +1368,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:186
+
src/pixi/display/DisplayObjectContainer.js:186
@@ -1452,7 +1452,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:190
+
src/pixi/display/DisplayObject.js:190
@@ -1481,7 +1481,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
+
@@ -1542,7 +1542,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObjectContainer.js:128
+
src/pixi/display/DisplayObjectContainer.js:128
@@ -1641,7 +1641,7 @@ for this callback to be fired, The touch must have started over the displayObjec
-
src/pixi/DisplayObject.js:149
+
src/pixi/display/DisplayObject.js:149
@@ -1671,7 +1671,7 @@ basically a touch version of click
-
+
@@ -1726,7 +1726,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:162
+
src/pixi/display/DisplayObject.js:162
@@ -1755,7 +1755,7 @@ basically a touch version of click
-
+
@@ -1810,7 +1810,7 @@ basically a touch version of click
-
src/pixi/DisplayObject.js:168
+
src/pixi/display/DisplayObject.js:168
@@ -1840,7 +1840,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1895,7 +1895,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:156
+
src/pixi/display/DisplayObject.js:156
@@ -1924,7 +1924,7 @@ for this callback to be fired, The touch must have started over the sprite
-
+
@@ -1968,7 +1968,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:40
+
src/pixi/display/DisplayObject.js:40
@@ -2009,7 +2009,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:95
+
src/pixi/display/DisplayObject.js:95
@@ -2050,7 +2050,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObjectContainer.js:16
+
src/pixi/display/DisplayObjectContainer.js:16
@@ -2091,7 +2091,7 @@ for this callback to be fired, The touch must have started over the sprite
-
src/pixi/DisplayObject.js:69
+
src/pixi/display/DisplayObject.js:69
@@ -2133,7 +2133,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:55
+
src/pixi/display/DisplayObject.js:55
@@ -2174,7 +2174,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:26
+
src/pixi/display/DisplayObject.js:26
@@ -2215,7 +2215,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:12
+
src/pixi/display/DisplayObject.js:12
@@ -2256,7 +2256,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:33
+
src/pixi/display/DisplayObject.js:33
@@ -2297,7 +2297,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:19
+
src/pixi/display/DisplayObject.js:19
@@ -2338,7 +2338,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:62
+
src/pixi/display/DisplayObject.js:62
@@ -2467,7 +2467,7 @@ Setting it is a neat way of optimising the hitTest function that the interaction
-
src/pixi/DisplayObject.js:47
+
src/pixi/display/DisplayObject.js:47
diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html
index 7de62b9..58f4bd5 100644
--- a/docs/classes/WebGLBatch.html
+++ b/docs/classes/WebGLBatch.html
@@ -142,7 +142,7 @@
@@ -307,7 +307,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:98
+
src/pixi/renderers/webgl/WebGLBatch.js:98
@@ -400,7 +400,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:145
+
src/pixi/renderers/webgl/WebGLBatch.js:145
@@ -508,7 +508,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:117
+
src/pixi/renderers/webgl/WebGLBatch.js:117
@@ -610,7 +610,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:268
+
src/pixi/renderers/webgl/WebGLBatch.js:268
@@ -687,7 +687,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:346
+
src/pixi/renderers/webgl/WebGLBatch.js:346
@@ -751,7 +751,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:175
+
src/pixi/renderers/webgl/WebGLBatch.js:175
@@ -828,7 +828,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:513
+
src/pixi/renderers/webgl/WebGLBatch.js:513
@@ -896,7 +896,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:218
+
src/pixi/renderers/webgl/WebGLBatch.js:218
@@ -986,7 +986,7 @@ if a group of sprites all have the same baseTexture and blendMode then they can
-
src/pixi/renderers/WebGLBatch.js:401
+
src/pixi/renderers/webgl/WebGLBatch.js:401
diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html
index 5cb2a66..1e8d2d9 100644
--- a/docs/classes/WebGLRenderer.html
+++ b/docs/classes/WebGLRenderer.html
@@ -142,7 +142,7 @@
@@ -225,7 +225,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
-
src/pixi/renderers/WebGLRenderer.js:11
+
src/pixi/renderers/webgl/WebGLRenderer.js:11
@@ -411,7 +411,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
-
src/pixi/renderers/WebGLRenderer.js:144
+
src/pixi/renderers/webgl/WebGLRenderer.js:143
@@ -504,7 +504,7 @@ Dont forget to add the view to your DOM or you will not see anything :)
-
src/pixi/renderers/WebGLRenderer.js:284
+
src/pixi/renderers/webgl/WebGLRenderer.js:285
diff --git a/docs/data.json b/docs/data.json
index b9ee342..b4f41e1 100644
--- a/docs/data.json
+++ b/docs/data.json
@@ -7,6 +7,76 @@
"logo": "http://www.goodboydigital.com/pixijs/logo_small.png"
},
"files": {
+ "src/pixi/core/Point.js": {
+ "name": "src/pixi/core/Point.js",
+ "modules": {},
+ "classes": {
+ "Point": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/core/Polygon.js": {
+ "name": "src/pixi/core/Polygon.js",
+ "modules": {},
+ "classes": {
+ "Polygon": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/core/Rectangle.js": {
+ "name": "src/pixi/core/Rectangle.js",
+ "modules": {},
+ "classes": {
+ "Rectangle": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/display/DisplayObject.js": {
+ "name": "src/pixi/display/DisplayObject.js",
+ "modules": {},
+ "classes": {
+ "DisplayObject": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/display/DisplayObjectContainer.js": {
+ "name": "src/pixi/display/DisplayObjectContainer.js",
+ "modules": {},
+ "classes": {},
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/display/MovieClip.js": {
+ "name": "src/pixi/display/MovieClip.js",
+ "modules": {},
+ "classes": {
+ "MovieClip": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/display/Sprite.js": {
+ "name": "src/pixi/display/Sprite.js",
+ "modules": {},
+ "classes": {
+ "Sprite": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/display/Stage.js": {
+ "name": "src/pixi/display/Stage.js",
+ "modules": {},
+ "classes": {
+ "Stage": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
"src/pixi/extras/CustomRenderable.js": {
"name": "src/pixi/extras/CustomRenderable.js",
"modules": {},
@@ -100,8 +170,22 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/renderers/CanvasRenderer.js": {
- "name": "src/pixi/renderers/CanvasRenderer.js",
+ "src/pixi/primitives/Graphics.js": {
+ "name": "src/pixi/primitives/Graphics.js",
+ "modules": {},
+ "classes": {},
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/renderers/canvas/CanvasGraphics.js": {
+ "name": "src/pixi/renderers/canvas/CanvasGraphics.js",
+ "modules": {},
+ "classes": {},
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/renderers/canvas/CanvasRenderer.js": {
+ "name": "src/pixi/renderers/canvas/CanvasRenderer.js",
"modules": {},
"classes": {
"CanvasRenderer": 1
@@ -109,15 +193,24 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/renderers/WebGLBatch.js": {
- "name": "src/pixi/renderers/WebGLBatch.js",
+ "src/pixi/renderers/webgl/WebGLBatch.js": {
+ "name": "src/pixi/renderers/webgl/WebGLBatch.js",
"modules": {},
"classes": {},
"fors": {},
"namespaces": {}
},
- "src/pixi/renderers/WebGLRenderGroup.js": {
- "name": "src/pixi/renderers/WebGLRenderGroup.js",
+ "src/pixi/renderers/webgl/WebGLGraphics.js": {
+ "name": "src/pixi/renderers/webgl/WebGLGraphics.js",
+ "modules": {},
+ "classes": {
+ "DisplayObjectContainer": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ },
+ "src/pixi/renderers/webgl/WebGLRenderGroup.js": {
+ "name": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
"modules": {},
"classes": {
"WebGLBatch": 1
@@ -125,8 +218,8 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/renderers/WebGLRenderer.js": {
- "name": "src/pixi/renderers/WebGLRenderer.js",
+ "src/pixi/renderers/webgl/WebGLRenderer.js": {
+ "name": "src/pixi/renderers/webgl/WebGLRenderer.js",
"modules": {},
"classes": {
"WebGLRenderer": 1
@@ -134,8 +227,8 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/renderers/WebGLShaders.js": {
- "name": "src/pixi/renderers/WebGLShaders.js",
+ "src/pixi/renderers/webgl/WebGLShaders.js": {
+ "name": "src/pixi/renderers/webgl/WebGLShaders.js",
"modules": {},
"classes": {},
"fors": {},
@@ -207,24 +300,6 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/DisplayObject.js": {
- "name": "src/pixi/DisplayObject.js",
- "modules": {},
- "classes": {
- "DisplayObject": 1
- },
- "fors": {},
- "namespaces": {}
- },
- "src/pixi/DisplayObjectContainer.js": {
- "name": "src/pixi/DisplayObjectContainer.js",
- "modules": {},
- "classes": {
- "DisplayObjectContainer": 1
- },
- "fors": {},
- "namespaces": {}
- },
"src/pixi/InteractionManager.js": {
"name": "src/pixi/InteractionManager.js",
"modules": {},
@@ -242,15 +317,6 @@
"fors": {},
"namespaces": {}
},
- "src/pixi/MovieClip.js": {
- "name": "src/pixi/MovieClip.js",
- "modules": {},
- "classes": {
- "MovieClip": 1
- },
- "fors": {},
- "namespaces": {}
- },
"src/pixi/Outro.js": {
"name": "src/pixi/Outro.js",
"modules": {},
@@ -266,51 +332,6 @@
"classes": {},
"fors": {},
"namespaces": {}
- },
- "src/pixi/Point.js": {
- "name": "src/pixi/Point.js",
- "modules": {},
- "classes": {
- "Point": 1
- },
- "fors": {},
- "namespaces": {}
- },
- "src/pixi/Polygon.js": {
- "name": "src/pixi/Polygon.js",
- "modules": {},
- "classes": {
- "Polygon": 1
- },
- "fors": {},
- "namespaces": {}
- },
- "src/pixi/Rectangle.js": {
- "name": "src/pixi/Rectangle.js",
- "modules": {},
- "classes": {
- "Rectangle": 1
- },
- "fors": {},
- "namespaces": {}
- },
- "src/pixi/Sprite.js": {
- "name": "src/pixi/Sprite.js",
- "modules": {},
- "classes": {
- "Sprite": 1
- },
- "fors": {},
- "namespaces": {}
- },
- "src/pixi/Stage.js": {
- "name": "src/pixi/Stage.js",
- "modules": {},
- "classes": {
- "Stage": 1
- },
- "fors": {},
- "namespaces": {}
}
},
"modules": {
@@ -318,6 +339,14 @@
"name": "PIXI",
"submodules": {},
"classes": {
+ "Point": 1,
+ "Polygon": 1,
+ "Rectangle": 1,
+ "DisplayObject": 1,
+ "DisplayObjectContainer": 1,
+ "MovieClip": 1,
+ "Sprite": 1,
+ "Stage": 1,
"CustomRenderable": 1,
"Spine": 1,
"TilingSprite": 1,
@@ -334,25 +363,199 @@
"BaseTexture": 1,
"RenderTexture": 1,
"Texture": 1,
- "DisplayObject": 1,
- "DisplayObjectContainer": 1,
"InteractionManager": 1,
- "InteractionData": 1,
- "MovieClip": 1,
- "Point": 1,
- "Polygon": 1,
- "Rectangle": 1,
- "Sprite": 1,
- "Stage": 1
+ "InteractionData": 1
},
"fors": {},
"namespaces": {},
"tag": "module",
- "file": "src/pixi/Stage.js",
- "line": 5
+ "file": "src/pixi/InteractionManager.js",
+ "line": 519
}
},
"classes": {
+ "Point": {
+ "name": "Point",
+ "shortname": "Point",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/core/Point.js",
+ "line": 5,
+ "description": "The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis.",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "x",
+ "description": "position of the point",
+ "type": "Number"
+ },
+ {
+ "name": "y",
+ "description": "position of the point",
+ "type": "Number"
+ }
+ ]
+ },
+ "Polygon": {
+ "name": "Polygon",
+ "shortname": "Polygon",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/core/Polygon.js",
+ "line": 5,
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "points",
+ "description": "",
+ "type": "Array"
+ }
+ ]
+ },
+ "Rectangle": {
+ "name": "Rectangle",
+ "shortname": "Rectangle",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 5,
+ "description": "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.",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "x",
+ "description": "position of the rectangle",
+ "type": "Number"
+ },
+ {
+ "name": "y",
+ "description": "position of the rectangle",
+ "type": "Number"
+ },
+ {
+ "name": "width",
+ "description": "of the rectangle",
+ "type": "Number"
+ },
+ {
+ "name": "height",
+ "description": "of the rectangle",
+ "type": "Number"
+ }
+ ]
+ },
+ "DisplayObject": {
+ "name": "DisplayObject",
+ "shortname": "DisplayObject",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 5,
+ "description": "this is the base class for all objects that are rendered on the screen.",
+ "is_constructor": 1
+ },
+ "DisplayObjectContainer": {
+ "name": "DisplayObjectContainer",
+ "shortname": "DisplayObjectContainer",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/renderers/webgl/WebGLGraphics.js",
+ "line": 6,
+ "description": "A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects.",
+ "extends": "DisplayObject",
+ "is_constructor": 1
+ },
+ "MovieClip": {
+ "name": "MovieClip",
+ "shortname": "MovieClip",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 5,
+ "description": "A MovieClip is a simple way to display an animation depicted by a list of textures.",
+ "extends": "Sprite",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "textures",
+ "description": "an array of {Texture} objects that make up the animation",
+ "type": "Array"
+ }
+ ]
+ },
+ "Sprite": {
+ "name": "Sprite",
+ "shortname": "Sprite",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/display/Sprite.js",
+ "line": 10,
+ "extends": "DisplayObjectContainer",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "texture",
+ "description": "",
+ "type": "Texture"
+ }
+ ],
+ "type": "String"
+ },
+ "Stage": {
+ "name": "Stage",
+ "shortname": "Stage",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "PIXI",
+ "file": "src/pixi/display/Stage.js",
+ "line": 5,
+ "description": "A Stage represents the root of the display tree. Everything connected to the stage is rendered",
+ "extends": "DisplayObjectContainer",
+ "is_constructor": 1,
+ "params": [
+ {
+ "name": "backgroundColor",
+ "description": "the background color of the stage",
+ "type": "Number"
+ },
+ {
+ "name": "interactive",
+ "description": "enable / disable interaction (default is false)",
+ "type": "Boolean"
+ }
+ ]
+ },
"CustomRenderable": {
"name": "CustomRenderable",
"shortname": "CustomRenderable",
@@ -561,7 +764,7 @@
"plugin_for": [],
"extension_for": [],
"module": "PIXI",
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 6,
"description": "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.\nDont forget to add the view to your DOM or you will not see anything :)",
"is_constructor": 1,
@@ -598,7 +801,7 @@
"plugin_for": [],
"extension_for": [],
"module": "PIXI",
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
"line": 8,
"description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.",
"params": [
@@ -621,7 +824,7 @@
"plugin_for": [],
"extension_for": [],
"module": "PIXI",
- "file": "src/pixi/renderers/WebGLRenderer.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
"line": 11,
"description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)",
"is_constructor": 1,
@@ -843,35 +1046,6 @@
}
]
},
- "DisplayObject": {
- "name": "DisplayObject",
- "shortname": "DisplayObject",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "file": "src/pixi/DisplayObject.js",
- "line": 5,
- "description": "this is the base class for all objects that are rendered on the screen.",
- "is_constructor": 1
- },
- "DisplayObjectContainer": {
- "name": "DisplayObjectContainer",
- "shortname": "DisplayObjectContainer",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 6,
- "description": "A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects.",
- "extends": "DisplayObject",
- "is_constructor": 1
- },
"InteractionManager": {
"name": "InteractionManager",
"shortname": "InteractionManager",
@@ -904,169 +1078,745 @@
"extension_for": [],
"module": "PIXI",
"file": "src/pixi/InteractionManager.js",
- "line": 513,
+ "line": 519,
"is_constructor": 1
- },
- "MovieClip": {
- "name": "MovieClip",
- "shortname": "MovieClip",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "file": "src/pixi/MovieClip.js",
- "line": 5,
- "description": "A MovieClip is a simple way to display an animation depicted by a list of textures.",
- "extends": "Sprite",
- "is_constructor": 1,
- "params": [
- {
- "name": "textures",
- "description": "an array of {Texture} objects that make up the animation",
- "type": "Array"
- }
- ]
- },
- "Point": {
- "name": "Point",
- "shortname": "Point",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "namespace": "",
- "file": "src/pixi/Point.js",
- "line": 5,
- "description": "The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis.",
- "is_constructor": 1,
- "params": [
- {
- "name": "x",
- "description": "position of the point",
- "type": "Number"
- },
- {
- "name": "y",
- "description": "position of the point",
- "type": "Number"
- }
- ]
- },
- "Polygon": {
- "name": "Polygon",
- "shortname": "Polygon",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "namespace": "",
- "file": "src/pixi/Polygon.js",
- "line": 5,
- "is_constructor": 1,
- "params": [
- {
- "name": "points",
- "description": "",
- "type": "Array"
- }
- ]
- },
- "Rectangle": {
- "name": "Rectangle",
- "shortname": "Rectangle",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "namespace": "",
- "file": "src/pixi/Rectangle.js",
- "line": 5,
- "description": "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.",
- "is_constructor": 1,
- "params": [
- {
- "name": "x",
- "description": "position of the rectangle",
- "type": "Number"
- },
- {
- "name": "y",
- "description": "position of the rectangle",
- "type": "Number"
- },
- {
- "name": "width",
- "description": "of the rectangle",
- "type": "Number"
- },
- {
- "name": "height",
- "description": "of the rectangle",
- "type": "Number"
- }
- ]
- },
- "Sprite": {
- "name": "Sprite",
- "shortname": "Sprite",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "namespace": "",
- "file": "src/pixi/Sprite.js",
- "line": 10,
- "extends": "DisplayObjectContainer",
- "is_constructor": 1,
- "params": [
- {
- "name": "texture",
- "description": "",
- "type": "Texture"
- }
- ],
- "type": "String"
- },
- "Stage": {
- "name": "Stage",
- "shortname": "Stage",
- "classitems": [],
- "plugins": [],
- "extensions": [],
- "plugin_for": [],
- "extension_for": [],
- "module": "PIXI",
- "namespace": "",
- "file": "src/pixi/Stage.js",
- "line": 5,
- "description": "A Stage represents the root of the display tree. Everything connected to the stage is rendered",
- "extends": "DisplayObjectContainer",
- "is_constructor": 1,
- "params": [
- {
- "name": "backgroundColor",
- "description": "the background color of the stage",
- "type": "Number"
- },
- {
- "name": "interactive",
- "description": "enable / disable interaction (default is false)",
- "type": "Boolean"
- }
- ]
}
},
"classitems": [
+ {
+ "file": "src/pixi/core/Point.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "Point"
+ },
+ {
+ "file": "src/pixi/core/Point.js",
+ "line": 14,
+ "itemtype": "property",
+ "name": "x",
+ "type": "Number",
+ "default": "0",
+ "class": "Point"
+ },
+ {
+ "file": "src/pixi/core/Point.js",
+ "line": 21,
+ "itemtype": "property",
+ "name": "y",
+ "type": "Number",
+ "default": "0",
+ "class": "Point"
+ },
+ {
+ "file": "src/pixi/core/Point.js",
+ "line": 29,
+ "itemtype": "method",
+ "name": "clone",
+ "return": {
+ "description": "a copy of the point"
+ },
+ "class": "Point"
+ },
+ {
+ "file": "src/pixi/core/Polygon.js",
+ "line": 1,
+ "author": "Adrien Brault
",
+ "class": "Polygon"
+ },
+ {
+ "file": "src/pixi/core/Polygon.js",
+ "line": 15,
+ "itemtype": "method",
+ "name": "clone",
+ "return": {
+ "description": "a copy of the polygon"
+ },
+ "class": "Polygon"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/",
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 16,
+ "itemtype": "property",
+ "name": "x",
+ "type": "Number",
+ "default": "0",
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 23,
+ "itemtype": "property",
+ "name": "y",
+ "type": "Number",
+ "default": "0",
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 30,
+ "itemtype": "property",
+ "name": "width",
+ "type": "Number",
+ "default": "0",
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 37,
+ "itemtype": "property",
+ "name": "height",
+ "type": "Number",
+ "default": "0",
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/core/Rectangle.js",
+ "line": 45,
+ "itemtype": "method",
+ "name": "clone",
+ "return": {
+ "description": "a copy of the rectangle"
+ },
+ "class": "Rectangle"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 12,
+ "description": "The coordinate of the object relative to the local coordinates of the parent.",
+ "itemtype": "property",
+ "name": "position",
+ "type": "Point",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 19,
+ "description": "The scale factor of the object.",
+ "itemtype": "property",
+ "name": "scale",
+ "type": "Point",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 26,
+ "description": "The pivot point of the displayObject that it rotates around",
+ "itemtype": "property",
+ "name": "pivot",
+ "type": "Point",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 33,
+ "description": "The rotation of the object in radians.",
+ "itemtype": "property",
+ "name": "rotation",
+ "type": "Number",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 40,
+ "description": "The opacity of the object.",
+ "itemtype": "property",
+ "name": "alpha",
+ "type": "Number",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 47,
+ "description": "The visibility of the object.",
+ "itemtype": "property",
+ "name": "visible",
+ "type": "Boolean",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 55,
+ "description": "[read-only] The display object container that contains this display object.",
+ "itemtype": "property",
+ "name": "parent",
+ "type": "DisplayObjectContainer",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 62,
+ "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.",
+ "itemtype": "property",
+ "name": "stage",
+ "type": "Stage",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 69,
+ "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)",
+ "itemtype": "property",
+ "name": "hitArea",
+ "type": "Rectangle",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 95,
+ "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover",
+ "itemtype": "property",
+ "name": "buttonMode",
+ "type": "Boolean",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 106,
+ "description": "A callback that is used when the users clicks on the displayObject with their mouse",
+ "itemtype": "method",
+ "name": "click",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 112,
+ "description": "A callback that is used when the user clicks the mouse down over the sprite",
+ "itemtype": "method",
+ "name": "mousedown",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 118,
+ "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject",
+ "itemtype": "method",
+ "name": "mouseup",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 125,
+ "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject",
+ "itemtype": "method",
+ "name": "mouseupoutside",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 132,
+ "description": "A callback that is used when the users mouse rolls over the displayObject",
+ "itemtype": "method",
+ "name": "mouseover",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 138,
+ "description": "A callback that is used when the users mouse leaves the displayObject",
+ "itemtype": "method",
+ "name": "mouseout",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 149,
+ "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click",
+ "itemtype": "method",
+ "name": "tap",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 156,
+ "description": "A callback that is used when the user touch's over the displayObject",
+ "itemtype": "method",
+ "name": "touchstart",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 162,
+ "description": "A callback that is used when the user releases a touch over the displayObject",
+ "itemtype": "method",
+ "name": "touchend",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 168,
+ "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite",
+ "itemtype": "method",
+ "name": "touchendoutside",
+ "params": [
+ {
+ "name": "interactionData",
+ "description": "",
+ "type": "InteractionData"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 190,
+ "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default",
+ "itemtype": "method",
+ "name": "setInteractive",
+ "params": [
+ {
+ "name": "interactive",
+ "description": "",
+ "type": "Boolean"
+ }
+ ],
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObject.js",
+ "line": 204,
+ "access": "private",
+ "tagname": "",
+ "class": "DisplayObject"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 16,
+ "description": "[read-only] The of children of this container.",
+ "itemtype": "property",
+ "name": "children",
+ "type": "Array",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 41,
+ "description": "Adds a child to the container.",
+ "itemtype": "method",
+ "name": "addChild",
+ "params": [
+ {
+ "name": "DisplayObject",
+ "description": "",
+ "type": "DisplayObject"
+ }
+ ],
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 73,
+ "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown",
+ "itemtype": "method",
+ "name": "addChildAt",
+ "params": [
+ {
+ "name": "DisplayObject",
+ "description": "",
+ "type": "DisplayObject"
+ },
+ {
+ "name": "index",
+ "description": "",
+ "type": "Number"
+ }
+ ],
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 128,
+ "description": "Swaps the depth of 2 displayObjects",
+ "itemtype": "method",
+ "name": "swapChildren",
+ "params": [
+ {
+ "name": "DisplayObject",
+ "description": "",
+ "type": "DisplayObject"
+ },
+ {
+ "name": "DisplayObject2",
+ "description": "",
+ "type": "DisplayObject"
+ }
+ ],
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 168,
+ "description": "Returns the Child at the specified index",
+ "itemtype": "method",
+ "name": "getChildAt",
+ "params": [
+ {
+ "name": "index",
+ "description": "",
+ "type": "Number"
+ }
+ ],
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 186,
+ "description": "Removes a child from the container.",
+ "itemtype": "method",
+ "name": "removeChild",
+ "params": [
+ {
+ "name": "DisplayObject",
+ "description": "",
+ "type": "DisplayObject"
+ }
+ ],
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/DisplayObjectContainer.js",
+ "line": 226,
+ "access": "private",
+ "tagname": "",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 16,
+ "description": "The array of textures that make up the animation",
+ "itemtype": "property",
+ "name": "textures",
+ "type": "Array",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 23,
+ "description": "[read only] The index MovieClips current frame (this may not have to be a whole number)",
+ "itemtype": "property",
+ "name": "currentFrame",
+ "type": "Number",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 30,
+ "description": "The speed that the MovieClip will play at. Higher is faster, lower is slower",
+ "itemtype": "property",
+ "name": "animationSpeed",
+ "type": "Number",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 37,
+ "description": "Whether or not the movie clip repeats after playing.",
+ "itemtype": "property",
+ "name": "loop",
+ "type": "Boolean",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 44,
+ "description": "Function to call when a MovieClip finishes playing",
+ "itemtype": "property",
+ "name": "onComplete",
+ "type": "Function",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 51,
+ "description": "[read only] indicates if the MovieClip is currently playing",
+ "itemtype": "property",
+ "name": "playing",
+ "type": "Boolean",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 63,
+ "description": "Stops the MovieClip",
+ "itemtype": "method",
+ "name": "stop",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 72,
+ "description": "Plays the MovieClip",
+ "itemtype": "method",
+ "name": "play",
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 81,
+ "description": "Stops the MovieClip and goes to a specific frame",
+ "itemtype": "method",
+ "name": "gotoAndStop",
+ "params": [
+ {
+ "name": "frameNumber",
+ "description": "frame index to stop at",
+ "type": "Number"
+ }
+ ],
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/MovieClip.js",
+ "line": 94,
+ "description": "Goes to a specific frame and begins playing the MovieClip",
+ "itemtype": "method",
+ "name": "gotoAndPlay",
+ "params": [
+ {
+ "name": "frameNumber",
+ "description": "frame index to start at",
+ "type": "Number"
+ }
+ ],
+ "class": "MovieClip"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 21,
+ "description": "The anchor sets the origin point of the texture.\nThe default is 0,0 this means the textures origin is the top left \nSetting than anchor to 0.5,0.5 means the textures origin is centered\nSetting the anchor to 1,1 would mean the textures origin points will be the bottom right",
+ "itemtype": "property",
+ "name": "anchor",
+ "type": "Point",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 31,
+ "description": "The texture that the sprite is using",
+ "itemtype": "property",
+ "name": "texture",
+ "type": "Texture",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 38,
+ "description": "The blend mode of sprite.\ncurrently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN",
+ "itemtype": "property",
+ "name": "blendMode",
+ "type": "uint",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 46,
+ "description": "The width of the sprite (this is initially set by the texture)",
+ "itemtype": "property",
+ "name": "width",
+ "type": "#Number",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 53,
+ "description": "The height of the sprite (this is initially set by the texture)",
+ "itemtype": "property",
+ "name": "height",
+ "type": "#Number",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 103,
+ "itemtype": "method",
+ "name": "setTexture",
+ "params": [
+ {
+ "name": "texture",
+ "description": "The PIXI texture that is displayed by the sprite",
+ "type": "Texture"
+ }
+ ],
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 119,
+ "access": "private",
+ "tagname": "",
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 135,
+ "description": "Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId\n The frame ids are created when a Texture packer file has been loaded",
+ "itemtype": "method",
+ "name": "fromFrame",
+ "static": 1,
+ "params": [
+ {
+ "name": "frameId",
+ "description": "The frame Id of the texture in the cache",
+ "type": "String"
+ }
+ ],
+ "return": {
+ "description": "A new Sprite using a texture from the texture cache matching the frameId",
+ "type": "Sprite"
+ },
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Sprite.js",
+ "line": 151,
+ "description": "Helper function that creates a sprite that will contain a texture based on an image url\n If the image is not in the texture cache it will be loaded",
+ "itemtype": "method",
+ "name": "fromImage",
+ "static": 1,
+ "params": [
+ {
+ "name": "The",
+ "description": "image url of the texture"
+ }
+ ],
+ "return": {
+ "description": "A new Sprite using a texture from the texture cache matching the image id",
+ "type": "Sprite"
+ },
+ "class": "Sprite"
+ },
+ {
+ "file": "src/pixi/display/Stage.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "Stage"
+ },
+ {
+ "file": "src/pixi/display/Stage.js",
+ "line": 40,
+ "itemtype": "method",
+ "name": "updateTransform",
+ "internal": "",
+ "class": "Stage"
+ },
+ {
+ "file": "src/pixi/display/Stage.js",
+ "line": 63,
+ "itemtype": "method",
+ "name": "setBackgroundColor",
+ "params": [
+ {
+ "name": "backgroundColor",
+ "description": "",
+ "type": "Number"
+ }
+ ],
+ "class": "Stage"
+ },
+ {
+ "file": "src/pixi/display/Stage.js",
+ "line": 76,
+ "description": "This will return the point containing global coords of the mouse.",
+ "itemtype": "method",
+ "name": "getMousePosition",
+ "return": {
+ "description": "The point containing the coords of the global InteractionData position.",
+ "type": "Point"
+ },
+ "class": "Stage"
+ },
{
"file": "src/pixi/extras/CustomRenderable.js",
"line": 1,
@@ -1409,13 +2159,25 @@
"class": "SpriteSheetLoader"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/primitives/Graphics.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/renderers/canvas/CanvasGraphics.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 24,
"description": "The width of the canvas view",
"itemtype": "property",
@@ -1425,7 +2187,7 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 31,
"description": "The height of the canvas view",
"itemtype": "property",
@@ -1435,7 +2197,7 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 41,
"description": "The canvas element that the everything is drawn to",
"itemtype": "property",
@@ -1444,7 +2206,7 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 55,
"description": "The canvas context that the everything is drawn to",
"itemtype": "property",
@@ -1453,7 +2215,7 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 66,
"description": "Renders the stage to its canvas view",
"itemtype": "method",
@@ -1468,7 +2230,7 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 110,
"description": "resizes the canvas view to the specified width and height",
"params": [
@@ -1484,68 +2246,68 @@
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
"line": 124,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
- "line": 213,
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
+ "line": 217,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
- "line": 248,
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
+ "line": 252,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/CanvasRenderer.js",
- "line": 277,
+ "file": "src/pixi/renderers/canvas/CanvasRenderer.js",
+ "line": 281,
"access": "private",
"tagname": "",
"class": "CanvasRenderer"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 7,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 22,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 31,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 67,
"description": "Cleans the batch so that is can be returned to an object pool and reused",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 98,
"description": "inits the batch's texture and blend mode based if the supplied sprite",
"itemtype": "method",
@@ -1560,7 +2322,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 117,
"description": "inserts a sprite before the specified sprite",
"itemtype": "method",
@@ -1580,7 +2342,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 145,
"description": "inserts a sprite after the specified sprite",
"itemtype": "method",
@@ -1600,7 +2362,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 175,
"description": "removes a sprite from the batch",
"itemtype": "method",
@@ -1615,7 +2377,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 218,
"description": "Splits the batch into two with the specified sprite being the start of the new batch.",
"itemtype": "method",
@@ -1634,7 +2396,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 268,
"description": "Merges two batchs together",
"itemtype": "method",
@@ -1649,14 +2411,14 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 293,
"description": "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",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 346,
"description": "Refresh's all the data in the batch and sync's it with the webGL buffers",
"itemtype": "method",
@@ -1664,7 +2426,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 401,
"description": "Updates all the relevant geometry and uploads the data to the GPU",
"itemtype": "method",
@@ -1672,7 +2434,7 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLBatch.js",
+ "file": "src/pixi/renderers/webgl/WebGLBatch.js",
"line": 513,
"description": "Draws the batch to the frame buffer",
"itemtype": "method",
@@ -1680,76 +2442,82 @@
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
+ "file": "src/pixi/renderers/webgl/WebGLGraphics.js",
+ "line": 1,
+ "author": "Mat Groves http://matgroves.com/ @Doormat23",
+ "class": "DisplayObjectContainer"
+ },
+ {
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
- "line": 626,
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
+ "line": 647,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
- "line": 712,
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
+ "line": 733,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
- "line": 768,
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
+ "line": 789,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
- "line": 845,
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
+ "line": 866,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderGroup.js",
- "line": 882,
+ "file": "src/pixi/renderers/webgl/WebGLRenderGroup.js",
+ "line": 903,
"access": "private",
"tagname": "",
"class": "WebGLBatch"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
"line": 81,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
"line": 96,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
"line": 106,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
- "line": 144,
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
+ "line": 143,
"description": "Renders the stage to its webGL view",
"itemtype": "method",
"name": "render",
@@ -1763,15 +2531,15 @@
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
- "line": 225,
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
+ "line": 226,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
- "line": 284,
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
+ "line": 285,
"description": "resizes the webGL view to the specified width and height",
"itemtype": "method",
"name": "resize",
@@ -1790,21 +2558,21 @@
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
- "line": 308,
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
+ "line": 309,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLRenderer.js",
- "line": 317,
+ "file": "src/pixi/renderers/webgl/WebGLRenderer.js",
+ "line": 318,
"access": "private",
"tagname": "",
"class": "WebGLRenderer"
},
{
- "file": "src/pixi/renderers/WebGLShaders.js",
+ "file": "src/pixi/renderers/webgl/WebGLShaders.js",
"line": 2,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
"class": "BitmapText"
@@ -2208,7 +2976,7 @@
"file": "src/pixi/utils/Detector.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "DisplayObject"
+ "class": "InteractionManager"
},
{
"file": "src/pixi/utils/Detector.js",
@@ -2240,394 +3008,19 @@
}
],
"default": "false",
- "class": "DisplayObject"
+ "class": "InteractionManager"
},
{
"file": "src/pixi/utils/EventTarget.js",
"line": 1,
"description": "https://github.com/mrdoob/eventtarget.js/\nTHankS mr DOob!",
- "class": "DisplayObject"
+ "class": "InteractionManager"
},
{
"file": "src/pixi/utils/Utils.js",
"line": 38,
"description": "Provides bind in a cross browser way.",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 12,
- "description": "The coordinate of the object relative to the local coordinates of the parent.",
- "itemtype": "property",
- "name": "position",
- "type": "Point",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 19,
- "description": "The scale factor of the object.",
- "itemtype": "property",
- "name": "scale",
- "type": "Point",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 26,
- "description": "The pivot point of the displayObject that it rotates around",
- "itemtype": "property",
- "name": "pivot",
- "type": "Point",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 33,
- "description": "The rotation of the object in radians.",
- "itemtype": "property",
- "name": "rotation",
- "type": "Number",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 40,
- "description": "The opacity of the object.",
- "itemtype": "property",
- "name": "alpha",
- "type": "Number",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 47,
- "description": "The visibility of the object.",
- "itemtype": "property",
- "name": "visible",
- "type": "Boolean",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 55,
- "description": "[read-only] The display object container that contains this display object.",
- "itemtype": "property",
- "name": "parent",
- "type": "DisplayObjectContainer",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 62,
- "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.",
- "itemtype": "property",
- "name": "stage",
- "type": "Stage",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 69,
- "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)",
- "itemtype": "property",
- "name": "hitArea",
- "type": "Rectangle",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 95,
- "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover",
- "itemtype": "property",
- "name": "buttonMode",
- "type": "Boolean",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 106,
- "description": "A callback that is used when the users clicks on the displayObject with their mouse",
- "itemtype": "method",
- "name": "click",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 112,
- "description": "A callback that is used when the user clicks the mouse down over the sprite",
- "itemtype": "method",
- "name": "mousedown",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 118,
- "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject",
- "itemtype": "method",
- "name": "mouseup",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 125,
- "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject",
- "itemtype": "method",
- "name": "mouseupoutside",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 132,
- "description": "A callback that is used when the users mouse rolls over the displayObject",
- "itemtype": "method",
- "name": "mouseover",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 138,
- "description": "A callback that is used when the users mouse leaves the displayObject",
- "itemtype": "method",
- "name": "mouseout",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 149,
- "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click",
- "itemtype": "method",
- "name": "tap",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 156,
- "description": "A callback that is used when the user touch's over the displayObject",
- "itemtype": "method",
- "name": "touchstart",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 162,
- "description": "A callback that is used when the user releases a touch over the displayObject",
- "itemtype": "method",
- "name": "touchend",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 168,
- "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite",
- "itemtype": "method",
- "name": "touchendoutside",
- "params": [
- {
- "name": "interactionData",
- "description": "",
- "type": "InteractionData"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 190,
- "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default",
- "itemtype": "method",
- "name": "setInteractive",
- "params": [
- {
- "name": "interactive",
- "description": "",
- "type": "Boolean"
- }
- ],
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObject.js",
- "line": 204,
- "access": "private",
- "tagname": "",
- "class": "DisplayObject"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 16,
- "description": "[read-only] The of children of this container.",
- "itemtype": "property",
- "name": "children",
- "type": "Array",
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 41,
- "description": "Adds a child to the container.",
- "itemtype": "method",
- "name": "addChild",
- "params": [
- {
- "name": "DisplayObject",
- "description": "",
- "type": "DisplayObject"
- }
- ],
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 73,
- "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown",
- "itemtype": "method",
- "name": "addChildAt",
- "params": [
- {
- "name": "DisplayObject",
- "description": "",
- "type": "DisplayObject"
- },
- {
- "name": "index",
- "description": "",
- "type": "Number"
- }
- ],
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 128,
- "description": "Swaps the depth of 2 displayObjects",
- "itemtype": "method",
- "name": "swapChildren",
- "params": [
- {
- "name": "DisplayObject",
- "description": "",
- "type": "DisplayObject"
- },
- {
- "name": "DisplayObject2",
- "description": "",
- "type": "DisplayObject"
- }
- ],
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 168,
- "description": "Returns the Child at the specified index",
- "itemtype": "method",
- "name": "getChildAt",
- "params": [
- {
- "name": "index",
- "description": "",
- "type": "Number"
- }
- ],
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 186,
- "description": "Removes a child from the container.",
- "itemtype": "method",
- "name": "removeChild",
- "params": [
- {
- "name": "DisplayObject",
- "description": "",
- "type": "DisplayObject"
- }
- ],
- "class": "DisplayObjectContainer"
- },
- {
- "file": "src/pixi/DisplayObjectContainer.js",
- "line": 226,
- "access": "private",
- "tagname": "",
- "class": "DisplayObjectContainer"
+ "class": "InteractionManager"
},
{
"file": "src/pixi/InteractionManager.js",
@@ -2664,7 +3057,7 @@
},
{
"file": "src/pixi/InteractionManager.js",
- "line": 519,
+ "line": 525,
"description": "This point stores the global coords of where the touch/mouse event happened",
"itemtype": "property",
"name": "global",
@@ -2673,7 +3066,7 @@
},
{
"file": "src/pixi/InteractionManager.js",
- "line": 529,
+ "line": 535,
"description": "The target Sprite that was interacted with",
"itemtype": "property",
"name": "target",
@@ -2682,7 +3075,7 @@
},
{
"file": "src/pixi/InteractionManager.js",
- "line": 537,
+ "line": 543,
"description": "This will return the local coords of the specified displayObject for this InteractionData",
"itemtype": "method",
"name": "getLocalPosition",
@@ -2703,418 +3096,77 @@
"file": "src/pixi/Intro.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 16,
- "description": "The array of textures that make up the animation",
- "itemtype": "property",
- "name": "textures",
- "type": "Array",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 23,
- "description": "[read only] The index MovieClips current frame (this may not have to be a whole number)",
- "itemtype": "property",
- "name": "currentFrame",
- "type": "Number",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 30,
- "description": "The speed that the MovieClip will play at. Higher is faster, lower is slower",
- "itemtype": "property",
- "name": "animationSpeed",
- "type": "Number",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 37,
- "description": "Whether or not the movie clip repeats after playing.",
- "itemtype": "property",
- "name": "loop",
- "type": "Boolean",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 44,
- "description": "Function to call when a MovieClip finishes playing",
- "itemtype": "property",
- "name": "onComplete",
- "type": "Function",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 51,
- "description": "[read only] indicates if the MovieClip is currently playing",
- "itemtype": "property",
- "name": "playing",
- "type": "Boolean",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 63,
- "description": "Stops the MovieClip",
- "itemtype": "method",
- "name": "stop",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 72,
- "description": "Plays the MovieClip",
- "itemtype": "method",
- "name": "play",
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 81,
- "description": "Stops the MovieClip and goes to a specific frame",
- "itemtype": "method",
- "name": "gotoAndStop",
- "params": [
- {
- "name": "frameNumber",
- "description": "frame index to stop at",
- "type": "Number"
- }
- ],
- "class": "MovieClip"
- },
- {
- "file": "src/pixi/MovieClip.js",
- "line": 94,
- "description": "Goes to a specific frame and begins playing the MovieClip",
- "itemtype": "method",
- "name": "gotoAndPlay",
- "params": [
- {
- "name": "frameNumber",
- "description": "frame index to start at",
- "type": "Number"
- }
- ],
- "class": "MovieClip"
+ "class": ""
},
{
"file": "src/pixi/Outro.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "Point"
+ "class": ""
},
{
"file": "src/pixi/Pixi.js",
"line": 1,
"author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "Point"
- },
- {
- "file": "src/pixi/Point.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "Point",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Point.js",
- "line": 14,
- "itemtype": "property",
- "name": "x",
- "type": "Number",
- "default": "0",
- "class": "Point",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Point.js",
- "line": 21,
- "itemtype": "property",
- "name": "y",
- "type": "Number",
- "default": "0",
- "class": "Point",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Point.js",
- "line": 29,
- "itemtype": "method",
- "name": "clone",
- "return": {
- "description": "a copy of the point"
- },
- "class": "Point",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Polygon.js",
- "line": 1,
- "author": "Adrien Brault ",
- "class": "Polygon",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Polygon.js",
- "line": 15,
- "itemtype": "method",
- "name": "clone",
- "return": {
- "description": "a copy of the polygon"
- },
- "class": "Polygon",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/",
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 16,
- "itemtype": "property",
- "name": "x",
- "type": "Number",
- "default": "0",
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 23,
- "itemtype": "property",
- "name": "y",
- "type": "Number",
- "default": "0",
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 30,
- "itemtype": "property",
- "name": "width",
- "type": "Number",
- "default": "0",
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 37,
- "itemtype": "property",
- "name": "height",
- "type": "Number",
- "default": "0",
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Rectangle.js",
- "line": 45,
- "itemtype": "method",
- "name": "clone",
- "return": {
- "description": "a copy of the rectangle"
- },
- "class": "Rectangle",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 21,
- "description": "The anchor sets the origin point of the texture.\nThe default is 0,0 this means the textures origin is the top left \nSetting than anchor to 0.5,0.5 means the textures origin is centered\nSetting the anchor to 1,1 would mean the textures origin points will be the bottom right",
- "itemtype": "property",
- "name": "anchor",
- "type": "Point",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 31,
- "description": "The texture that the sprite is using",
- "itemtype": "property",
- "name": "texture",
- "type": "Texture",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 38,
- "description": "The blend mode of sprite.\ncurrently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN",
- "itemtype": "property",
- "name": "blendMode",
- "type": "uint",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 46,
- "description": "The width of the sprite (this is initially set by the texture)",
- "itemtype": "property",
- "name": "width",
- "type": "#Number",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 53,
- "description": "The height of the sprite (this is initially set by the texture)",
- "itemtype": "property",
- "name": "height",
- "type": "#Number",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 103,
- "itemtype": "method",
- "name": "setTexture",
- "params": [
- {
- "name": "texture",
- "description": "The PIXI texture that is displayed by the sprite",
- "type": "Texture"
- }
- ],
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 119,
- "access": "private",
- "tagname": "",
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 135,
- "description": "Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId\n The frame ids are created when a Texture packer file has been loaded",
- "itemtype": "method",
- "name": "fromFrame",
- "static": 1,
- "params": [
- {
- "name": "frameId",
- "description": "The frame Id of the texture in the cache",
- "type": "String"
- }
- ],
- "return": {
- "description": "A new Sprite using a texture from the texture cache matching the frameId",
- "type": "Sprite"
- },
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Sprite.js",
- "line": 151,
- "description": "Helper function that creates a sprite that will contain a texture based on an image url\n If the image is not in the texture cache it will be loaded",
- "itemtype": "method",
- "name": "fromImage",
- "static": 1,
- "params": [
- {
- "name": "The",
- "description": "image url of the texture"
- }
- ],
- "return": {
- "description": "A new Sprite using a texture from the texture cache matching the image id",
- "type": "Sprite"
- },
- "class": "Sprite",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Stage.js",
- "line": 1,
- "author": "Mat Groves http://matgroves.com/ @Doormat23",
- "class": "Stage",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Stage.js",
- "line": 40,
- "itemtype": "method",
- "name": "updateTransform",
- "internal": "",
- "class": "Stage",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Stage.js",
- "line": 63,
- "itemtype": "method",
- "name": "setBackgroundColor",
- "params": [
- {
- "name": "backgroundColor",
- "description": "",
- "type": "Number"
- }
- ],
- "class": "Stage",
- "module": "PIXI"
- },
- {
- "file": "src/pixi/Stage.js",
- "line": 76,
- "description": "This will return the point containing global coords of the mouse.",
- "itemtype": "method",
- "name": "getMousePosition",
- "return": {
- "description": "The point containing the coords of the global InteractionData position.",
- "type": "Point"
- },
- "class": "Stage",
- "module": "PIXI"
+ "class": ""
}
],
"warnings": [
+ {
+ "message": "unknown tag: internal",
+ "line": " src/pixi/display/Stage.js:40"
+ },
{
"message": "unknown tag: methos",
- "line": " src/pixi/renderers/WebGLBatch.js:293"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:293"
},
{
"message": "unknown tag: methos",
"line": " src/pixi/text/Text.js:63"
},
{
- "message": "unknown tag: internal",
- "line": " src/pixi/Stage.js:40"
+ "message": "Missing item type",
+ "line": " src/pixi/core/Point.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/core/Polygon.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/core/Rectangle.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/DisplayObject.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/DisplayObject.js:204"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/DisplayObjectContainer.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/DisplayObjectContainer.js:226"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/MovieClip.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/Sprite.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/Sprite.js:119"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/display/Stage.js:1"
},
{
"message": "Missing item type",
@@ -3318,107 +3370,119 @@
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/CanvasRenderer.js:1"
+ "line": " src/pixi/primitives/Graphics.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/renderers/canvas/CanvasGraphics.js:1"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:1"
},
{
"message": "Missing item type\nresizes the canvas view to the specified width and height",
- "line": " src/pixi/renderers/CanvasRenderer.js:110"
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:110"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/CanvasRenderer.js:124"
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:124"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/CanvasRenderer.js:213"
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:217"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/CanvasRenderer.js:248"
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:252"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/CanvasRenderer.js:277"
+ "line": " src/pixi/renderers/canvas/CanvasRenderer.js:281"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLBatch.js:1"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:1"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLBatch.js:7"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:7"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLBatch.js:22"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:22"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLBatch.js:31"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:31"
},
{
"message": "Missing item type\nCleans the batch so that is can be returned to an object pool and reused",
- "line": " src/pixi/renderers/WebGLBatch.js:67"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:67"
},
{
"message": "Missing item type\nGrows 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",
- "line": " src/pixi/renderers/WebGLBatch.js:293"
+ "line": " src/pixi/renderers/webgl/WebGLBatch.js:293"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:1"
+ "line": " src/pixi/renderers/webgl/WebGLGraphics.js:1"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:626"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:1"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:712"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:647"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:768"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:733"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:845"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:789"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderGroup.js:882"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:866"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:1"
+ "line": " src/pixi/renderers/webgl/WebGLRenderGroup.js:903"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:81"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:1"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:96"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:81"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:106"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:96"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:225"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:106"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:308"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:226"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLRenderer.js:317"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:309"
},
{
"message": "Missing item type",
- "line": " src/pixi/renderers/WebGLShaders.js:2"
+ "line": " src/pixi/renderers/webgl/WebGLRenderer.js:318"
+ },
+ {
+ "message": "Missing item type",
+ "line": " src/pixi/renderers/webgl/WebGLShaders.js:2"
},
{
"message": "Missing item type",
@@ -3480,22 +3544,6 @@
"message": "Missing item type\nProvides bind in a cross browser way.",
"line": " src/pixi/utils/Utils.js:38"
},
- {
- "message": "Missing item type",
- "line": " src/pixi/DisplayObject.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/DisplayObject.js:204"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/DisplayObjectContainer.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/DisplayObjectContainer.js:226"
- },
{
"message": "Missing item type",
"line": " src/pixi/InteractionManager.js:1"
@@ -3504,10 +3552,6 @@
"message": "Missing item type",
"line": " src/pixi/Intro.js:1"
},
- {
- "message": "Missing item type",
- "line": " src/pixi/MovieClip.js:1"
- },
{
"message": "Missing item type",
"line": " src/pixi/Outro.js:1"
@@ -3515,30 +3559,6 @@
{
"message": "Missing item type",
"line": " src/pixi/Pixi.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Point.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Polygon.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Rectangle.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Sprite.js:1"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Sprite.js:119"
- },
- {
- "message": "Missing item type",
- "line": " src/pixi/Stage.js:1"
}
]
}
\ No newline at end of file
diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html
index 2cd4555..23748ff 100644
--- a/docs/files/src_pixi_InteractionManager.js.html
+++ b/docs/files/src_pixi_InteractionManager.js.html
@@ -273,7 +273,7 @@ PIXI.InteractionManager.prototype.update = function()
var len = this.interactiveItems.length;
- for (var i=0; i < this.interactiveItems.length; i++) {
+ for (var i=0; i < len; i++) {
this.interactiveItems[i].interactiveChildren = false;
}
@@ -357,6 +357,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -393,6 +395,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -547,6 +551,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_core_Point.js.html
similarity index 98%
rename from docs/files/src_pixi_Point.js.html
rename to docs/files/src_pixi_core_Point.js.html
index d6e80ef..0dbecad 100644
--- a/docs/files/src_pixi_Point.js.html
+++ b/docs/files/src_pixi_core_Point.js.html
@@ -2,7 +2,7 @@
- src/pixi/Point.js - Pixi.JS
+ src/pixi/core/Point.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/Point.js
+
File: src/pixi/core/Point.js
diff --git a/docs/files/src_pixi_Polygon.js.html b/docs/files/src_pixi_core_Polygon.js.html
similarity index 98%
rename from docs/files/src_pixi_Polygon.js.html
rename to docs/files/src_pixi_core_Polygon.js.html
index c163c07..0305f85 100644
--- a/docs/files/src_pixi_Polygon.js.html
+++ b/docs/files/src_pixi_core_Polygon.js.html
@@ -2,7 +2,7 @@
- src/pixi/Polygon.js - Pixi.JS
+ src/pixi/core/Polygon.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/Polygon.js
+
File: src/pixi/core/Polygon.js
diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_core_Rectangle.js.html
similarity index 98%
rename from docs/files/src_pixi_Rectangle.js.html
rename to docs/files/src_pixi_core_Rectangle.js.html
index 48a4adc..f8bc08b 100644
--- a/docs/files/src_pixi_Rectangle.js.html
+++ b/docs/files/src_pixi_core_Rectangle.js.html
@@ -2,7 +2,7 @@
- src/pixi/Rectangle.js - Pixi.JS
+ src/pixi/core/Rectangle.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/Rectangle.js
+
File: src/pixi/core/Rectangle.js
diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_display_DisplayObject.js.html
similarity index 99%
rename from docs/files/src_pixi_DisplayObject.js.html
rename to docs/files/src_pixi_display_DisplayObject.js.html
index b24abfe..63ac0da 100644
--- a/docs/files/src_pixi_DisplayObject.js.html
+++ b/docs/files/src_pixi_display_DisplayObject.js.html
@@ -2,7 +2,7 @@
- src/pixi/DisplayObject.js - Pixi.JS
+ src/pixi/display/DisplayObject.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/DisplayObject.js
+
File: src/pixi/display/DisplayObject.js
diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_display_DisplayObjectContainer.js.html
similarity index 98%
rename from docs/files/src_pixi_DisplayObjectContainer.js.html
rename to docs/files/src_pixi_display_DisplayObjectContainer.js.html
index f77ccd8..bb24166 100644
--- a/docs/files/src_pixi_DisplayObjectContainer.js.html
+++ b/docs/files/src_pixi_display_DisplayObjectContainer.js.html
@@ -2,7 +2,7 @@
- src/pixi/DisplayObjectContainer.js - Pixi.JS
+ src/pixi/display/DisplayObjectContainer.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/DisplayObjectContainer.js
+
File: src/pixi/display/DisplayObjectContainer.js
diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_display_MovieClip.js.html
similarity index 98%
rename from docs/files/src_pixi_MovieClip.js.html
rename to docs/files/src_pixi_display_MovieClip.js.html
index 789564a..d9670b7 100644
--- a/docs/files/src_pixi_MovieClip.js.html
+++ b/docs/files/src_pixi_display_MovieClip.js.html
@@ -2,7 +2,7 @@
- src/pixi/MovieClip.js - Pixi.JS
+ src/pixi/display/MovieClip.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/MovieClip.js
+
File: src/pixi/display/MovieClip.js
diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_display_Sprite.js.html
similarity index 98%
rename from docs/files/src_pixi_Sprite.js.html
rename to docs/files/src_pixi_display_Sprite.js.html
index da5682d..fd5f491 100644
--- a/docs/files/src_pixi_Sprite.js.html
+++ b/docs/files/src_pixi_display_Sprite.js.html
@@ -2,7 +2,7 @@
- src/pixi/Sprite.js - Pixi.JS
+ src/pixi/display/Sprite.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/Sprite.js
+
File: src/pixi/display/Sprite.js
diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_display_Stage.js.html
similarity index 98%
rename from docs/files/src_pixi_Stage.js.html
rename to docs/files/src_pixi_display_Stage.js.html
index 7ccceb0..391fd51 100644
--- a/docs/files/src_pixi_Stage.js.html
+++ b/docs/files/src_pixi_display_Stage.js.html
@@ -2,7 +2,7 @@
- src/pixi/Stage.js - Pixi.JS
+ src/pixi/display/Stage.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/Stage.js
+
File: src/pixi/display/Stage.js
diff --git a/docs/files/src_pixi_primitives_Graphics.js.html b/docs/files/src_pixi_primitives_Graphics.js.html
new file mode 100644
index 0000000..3199bcb
--- /dev/null
+++ b/docs/files/src_pixi_primitives_Graphics.js.html
@@ -0,0 +1,273 @@
+
+
+
+
+ src/pixi/primitives/Graphics.js - Pixi.JS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Show:
+
+
+ Inherited
+
+
+
+
+ Protected
+
+
+
+
+ Private
+
+
+
+ Deprecated
+
+
+
+
+
+
+
+
+
File: src/pixi/primitives/Graphics.js
+
+
+
+/**
+ * @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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html
new file mode 100644
index 0000000..3a5ace4
--- /dev/null
+++ b/docs/files/src_pixi_renderers_canvas_CanvasGraphics.js.html
@@ -0,0 +1,248 @@
+
+
+
+
+ src/pixi/renderers/canvas/CanvasGraphics.js - Pixi.JS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Show:
+
+
+ Inherited
+
+
+
+
+ Protected
+
+
+
+
+ Private
+
+
+
+ Deprecated
+
+
+
+
+
+
+
+
+
File: src/pixi/renderers/canvas/CanvasGraphics.js
+
+
+
+/**
+ * @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();
+ }
+ }
+
+
+ };
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html
similarity index 98%
rename from docs/files/src_pixi_renderers_CanvasRenderer.js.html
rename to docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html
index 450575b..721e96f 100644
--- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html
+++ b/docs/files/src_pixi_renderers_canvas_CanvasRenderer.js.html
@@ -2,7 +2,7 @@
- src/pixi/renderers/CanvasRenderer.js - Pixi.JS
+ src/pixi/renderers/canvas/CanvasRenderer.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/renderers/CanvasRenderer.js
+
File: src/pixi/renderers/canvas/CanvasRenderer.js
@@ -337,6 +337,10 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
{
displayObject.renderCanvas(this);
}
+ else if(displayObject instanceof PIXI.Graphics)
+ {
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
+ }
// render!
if(displayObject.children)
diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html
similarity index 99%
rename from docs/files/src_pixi_renderers_WebGLBatch.js.html
rename to docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html
index 35eccd3..72d3ef4 100644
--- a/docs/files/src_pixi_renderers_WebGLBatch.js.html
+++ b/docs/files/src_pixi_renderers_webgl_WebGLBatch.js.html
@@ -2,7 +2,7 @@
- src/pixi/renderers/WebGLBatch.js - Pixi.JS
+ src/pixi/renderers/webgl/WebGLBatch.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/renderers/WebGLBatch.js
+
File: src/pixi/renderers/webgl/WebGLBatch.js
diff --git a/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html
new file mode 100644
index 0000000..4547b28
--- /dev/null
+++ b/docs/files/src_pixi_renderers_webgl_WebGLGraphics.js.html
@@ -0,0 +1,603 @@
+
+
+
+
+ src/pixi/renderers/webgl/WebGLGraphics.js - Pixi.JS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Show:
+
+
+ Inherited
+
+
+
+
+ Protected
+
+
+
+
+ Private
+
+
+
+ Deprecated
+
+
+
+
+
+
+
+
+
File: src/pixi/renderers/webgl/WebGLGraphics.js
+
+
+
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could 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_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html
similarity index 96%
rename from docs/files/src_pixi_renderers_WebGLRenderGroup.js.html
rename to docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html
index 264cc48..b4013ab 100644
--- a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html
+++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderGroup.js.html
@@ -2,7 +2,7 @@
- src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS
+ src/pixi/renderers/webgl/WebGLRenderGroup.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/renderers/WebGLRenderGroup.js
+
File: src/pixi/renderers/webgl/WebGLRenderGroup.js
@@ -185,11 +185,10 @@ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
-
PIXI.WebGLRenderer.updateTextures();
var gl = this.gl;
-
+
// set the flipped matrix..
gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix);
@@ -215,6 +214,10 @@ PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
if(renderable.visible)this.renderStrip(renderable, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
}
@@ -327,7 +330,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -352,7 +358,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -374,7 +383,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -394,6 +406,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -547,19 +563,16 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
var previousSprite = this.getPreviousRenderable(displayObject);
var nextSprite = this.getNextRenderable(displayObject);
-
/*
* so now we have the next renderable and the previous renderable
*
*/
-
if(displayObject instanceof PIXI.Sprite)
{
var previousBatch
var nextBatch
- //console.log( previousSprite)
if(previousSprite instanceof PIXI.Sprite)
{
previousBatch = previousSprite.batch;
@@ -656,6 +669,14 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
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;
diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html
similarity index 97%
rename from docs/files/src_pixi_renderers_WebGLRenderer.js.html
rename to docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html
index 15ac256..76ddae5 100644
--- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html
+++ b/docs/files/src_pixi_renderers_webgl_WebGLRenderer.js.html
@@ -2,7 +2,7 @@
- src/pixi/renderers/WebGLRenderer.js - Pixi.JS
+ src/pixi/renderers/webgl/WebGLRenderer.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/renderers/WebGLRenderer.js
+
File: src/pixi/renderers/webgl/WebGLRenderer.js
@@ -174,7 +174,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -196,9 +196,9 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this);
}
+ PIXI.WebGLGraphics.initShaders();
this.initShaders();
-
var gl = this.gl;
PIXI.WebGLRenderer.gl = gl;
@@ -267,17 +267,16 @@ PIXI.WebGLRenderer.prototype.initShaders = function()
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
- gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
- gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);
shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
- gl.enableVertexAttribArray(shaderProgram.colorAttribute);
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");
+
+ PIXI.activateDefaultShader();
}
@@ -334,7 +333,9 @@ PIXI.WebGLRenderer.prototype.render = function(stage)
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(this.projectionMatrix);
diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html
similarity index 88%
rename from docs/files/src_pixi_renderers_WebGLShaders.js.html
rename to docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html
index ad8f09b..5cd680b 100644
--- a/docs/files/src_pixi_renderers_WebGLShaders.js.html
+++ b/docs/files/src_pixi_renderers_webgl_WebGLShaders.js.html
@@ -2,7 +2,7 @@
- src/pixi/renderers/WebGLShaders.js - Pixi.JS
+ src/pixi/renderers/webgl/WebGLShaders.js - Pixi.JS
@@ -134,7 +134,7 @@
-
File: src/pixi/renderers/WebGLShaders.js
+
File: src/pixi/renderers/webgl/WebGLShaders.js
@@ -168,6 +168,11 @@ PIXI.shaderVertexSrc = [
"}"
];
+/*
+ * primitive shader..
+ */
+
+
PIXI.CompileVertexShader = function(gl, shaderSrc)
{
return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER);
@@ -193,6 +198,35 @@ PIXI._CompileShader = function(gl, shaderSrc, shaderType)
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.activatePrimitiveShader = function()
+{
+ var gl = PIXI.gl;
+
+ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute);
+ gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute);
+
+ var shaderProgram2 = PIXI.shaderProgram2;
+
+ gl.useProgram(shaderProgram2);
+
+ gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute);
+ gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute);
+
+}
+
+
diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html
index 921b98e..aa835ff 100644
--- a/docs/modules/PIXI.html
+++ b/docs/modules/PIXI.html
@@ -142,7 +142,7 @@
diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 1 - Basics/pixi.js
+++ b/examples/example 1 - Basics/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 10 - Text/pixi.js b/examples/example 10 - Text/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 10 - Text/pixi.js
+++ b/examples/example 10 - Text/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 11 - RenderTexture/pixi.js b/examples/example 11 - RenderTexture/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 11 - RenderTexture/pixi.js
+++ b/examples/example 11 - RenderTexture/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 12 - Spine/pixi.js b/examples/example 12 - Spine/pixi.js
index 1b2da1b..21e9a00 100644
--- a/examples/example 12 - Spine/pixi.js
+++ b/examples/example 12 - Spine/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1499,7 +1732,7 @@ PIXI.InteractionManager.prototype.update = function()
var len = this.interactiveItems.length;
- for (var i=0; i < this.interactiveItems.length; i++) {
+ for (var i=0; i < len; i++) {
this.interactiveItems[i].interactiveChildren = false;
}
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2484,6 +2490,11 @@ PIXI.shaderVertexSrc = [
"}"
];
+/*
+ * primitive shader..
+ */
+
+
PIXI.CompileVertexShader = function(gl, shaderSrc)
{
return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER);
@@ -2509,6 +2520,479 @@ PIXI._CompileShader = function(gl, shaderSrc, shaderType)
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.activatePrimitiveShader = function()
+{
+ var gl = PIXI.gl;
+
+ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute);
+ gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute);
+
+ var shaderProgram2 = PIXI.shaderProgram2;
+
+ gl.useProgram(shaderProgram2);
+
+ gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute);
+ gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute);
+
+}
+
+
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2545,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -2567,9 +3051,9 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this);
}
+ PIXI.WebGLGraphics.initShaders();
this.initShaders();
-
var gl = this.gl;
PIXI.WebGLRenderer.gl = gl;
@@ -2638,17 +3122,16 @@ PIXI.WebGLRenderer.prototype.initShaders = function()
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
- gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
- gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);
shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
- gl.enableVertexAttribArray(shaderProgram.colorAttribute);
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");
+
+ PIXI.activateDefaultShader();
}
@@ -2705,7 +3188,9 @@ PIXI.WebGLRenderer.prototype.render = function(stage)
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(this.projectionMatrix);
@@ -3484,11 +3969,10 @@ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
-
PIXI.WebGLRenderer.updateTextures();
var gl = this.gl;
-
+
// set the flipped matrix..
gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix);
@@ -3514,6 +3998,10 @@ PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
if(renderable.visible)this.renderStrip(renderable, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
}
@@ -3626,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3651,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3673,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3693,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -3846,19 +4347,16 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
var previousSprite = this.getPreviousRenderable(displayObject);
var nextSprite = this.getNextRenderable(displayObject);
-
/*
* so now we have the next renderable and the previous renderable
*
*/
-
if(displayObject instanceof PIXI.Sprite)
{
var previousBatch
var nextBatch
- //console.log( previousSprite)
if(previousSprite instanceof PIXI.Sprite)
{
previousBatch = previousSprite.batch;
@@ -3955,6 +4453,14 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
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;
@@ -4546,6 +5052,10 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
{
displayObject.renderCanvas(this);
}
+ else if(displayObject instanceof PIXI.Graphics)
+ {
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
+ }
// render!
if(displayObject.children)
@@ -4692,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5032,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 13 - Graphics/index.html b/examples/example 13 - Graphics/index.html
index 8587309..f41ebdc 100644
--- a/examples/example 13 - Graphics/index.html
+++ b/examples/example 13 - Graphics/index.html
@@ -13,10 +13,10 @@
-
+
-
+
diff --git a/examples/example 13 - Graphics/pixi.js b/examples/example 13 - Graphics/pixi.js
index 2028846..21e9a00 100644
--- a/examples/example 13 - Graphics/pixi.js
+++ b/examples/example 13 - Graphics/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-07
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -124,6 +124,270 @@ PIXI.Rectangle.prototype.clone = function()
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)
+ if(child.visible) {
+ // push all interactive bits
+ if(child.interactive)
{
- this.collectInteractiveSprite(child, child);
+ 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)
+ else
{
- this.collectInteractiveSprite(child, iParent);
+ child.__iParent = null;
+
+ if(child.children.length > 0)
+ {
+ this.collectInteractiveSprite(child, iParent);
+ }
}
}
}
@@ -1465,7 +1732,7 @@ PIXI.InteractionManager.prototype.update = function()
var len = this.interactiveItems.length;
- for (var i=0; i < this.interactiveItems.length; i++) {
+ for (var i=0; i < len; i++) {
this.interactiveItems[i].interactiveChildren = false;
}
@@ -1525,8 +1792,6 @@ PIXI.InteractionManager.prototype.update = function()
PIXI.InteractionManager.prototype.onMouseMove = function(event)
{
- event.preventDefault();
-
// TODO optimize by not check EVERY TIME! maybe half as often? //
var rect = this.target.view.getBoundingClientRect();
@@ -1589,7 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
- event.preventDefault();
+
+
var global = this.mouse.global;
@@ -1636,27 +1902,66 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData)
var global = interactionData.global;
if(!item.visible)return false;
-
- if(item instanceof PIXI.Sprite)
+
+ 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 worldTransform = item.worldTransform;
-
- 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);
-
- var x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id;
- var y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id;
-
- var width = item.texture.frame.width;
- var height = item.texture.frame.height;
-
- var x1 = -width * item.anchor.x;
+ 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)
{
- var y1 = -height * item.anchor.y;
-
+ y1 = -height * item.anchor.y;
+
if(y > y1 && y < y1 + height)
{
// set the target property if a hit is true!
@@ -1665,30 +1970,7 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData)
}
}
}
- else if(item.hitArea)
- {
- var worldTransform = item.worldTransform;
- var hitArea = item.hitArea;
-
- 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);
-
- var x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id;
- var y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id;
-
- var x1 = hitArea.x;
- if(x > x1 && x < x1 + hitArea.width)
- {
- var y1 = hitArea.y;
-
- if(y > y1 && y < y1 + hitArea.height)
- {
- return true;
- }
- }
- }
-
+
var length = item.children.length;
for (var i = 0; i < length; i++)
@@ -1697,7 +1979,7 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData)
var hit = this.hitTest(tempItem, interactionData);
if(hit)return true;
}
-
+
return false;
}
@@ -1705,8 +1987,6 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData)
PIXI.InteractionManager.prototype.onTouchMove = function(event)
{
- event.preventDefault();
-
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -1731,6 +2011,7 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -1772,9 +2053,6 @@ PIXI.InteractionManager.prototype.onTouchStart = function(event)
PIXI.InteractionManager.prototype.onTouchEnd = function(event)
{
- event.preventDefault();
-
-
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -1916,6 +2194,8 @@ PIXI.Stage = function(backgroundColor, interactive)
this.setBackgroundColor(backgroundColor);
this.worldVisible = true;
+
+ this.stage.dirty = true;
}
// constructor
@@ -1954,7 +2234,9 @@ PIXI.Stage.prototype.setBackgroundColor = function(backgroundColor)
{
this.backgroundColor = backgroundColor || 0x000000;
this.backgroundColorSplit = HEXtoRGB(this.backgroundColor);
- this.backgroundColorString = "#" + this.backgroundColor.toString(16);
+ var hex = this.backgroundColor.toString(16);
+ hex = "000000".substr(0, 6 - hex.length) + hex;
+ this.backgroundColorString = "#" + hex;
}
/**
@@ -1999,19 +2281,38 @@ PIXI.Stage.prototype.__removeChild = function(child)
}
}
-/**
- * Provides requestAnimationFrame in a cross browser way.
- */
-window.requestAnimFrame = (function() {
- return window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
- window.setTimeout(callback, 1000/60);
- };
-})();
+// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
+
+// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
+
+// MIT license
+
+
+ var lastTime = 0;
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
+ for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
+ window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
+ || window[vendors[x]+'CancelRequestAnimationFrame'];
+ }
+
+ if (!window.requestAnimationFrame)
+ window.requestAnimationFrame = function(callback, element) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function() { callback(currTime + timeToCall); },
+ timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+
+ if (!window.cancelAnimationFrame)
+ window.cancelAnimationFrame = function(id) {
+ clearTimeout(id);
+ };
+
+window.requestAnimFrame = window.requestAnimationFrame;
function HEXtoRGB(hex) {
return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255];
@@ -2043,7 +2344,7 @@ if (typeof Function.prototype.bind != 'function') {
})();
}
-var AjaxRequest = function()
+var AjaxRequest = PIXI.AjaxRequest = function()
{
var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE
@@ -2125,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2422,6 +2490,11 @@ PIXI.shaderVertexSrc = [
"}"
];
+/*
+ * primitive shader..
+ */
+
+
PIXI.CompileVertexShader = function(gl, shaderSrc)
{
return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER);
@@ -2447,6 +2520,479 @@ PIXI._CompileShader = function(gl, shaderSrc, shaderType)
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.activatePrimitiveShader = function()
+{
+ var gl = PIXI.gl;
+
+ gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute);
+ gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute);
+
+ var shaderProgram2 = PIXI.shaderProgram2;
+
+ gl.useProgram(shaderProgram2);
+
+ gl.enableVertexAttribArray(shaderProgram2.vertexPositionAttribute);
+ gl.enableVertexAttribArray(PIXI.shaderProgram2.colorAttribute);
+
+}
+
+
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2483,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -2505,9 +3051,9 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this);
}
+ PIXI.WebGLGraphics.initShaders();
this.initShaders();
-
var gl = this.gl;
PIXI.WebGLRenderer.gl = gl;
@@ -2576,17 +3122,16 @@ PIXI.WebGLRenderer.prototype.initShaders = function()
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
- gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
- gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);
shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
- gl.enableVertexAttribArray(shaderProgram.colorAttribute);
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler");
+
+ PIXI.activateDefaultShader();
}
@@ -2643,7 +3188,9 @@ PIXI.WebGLRenderer.prototype.render = function(stage)
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(this.projectionMatrix);
@@ -3233,7 +3780,6 @@ PIXI.WebGLBatch.prototype.update = function()
tx = worldTransform[2];
ty = worldTransform[5];
-
this.verticies[index + 0 ] = a * w1 + c * h1 + tx;
this.verticies[index + 1 ] = d * h1 + b * w1 + ty;
@@ -3319,6 +3865,7 @@ PIXI.WebGLBatch.prototype.render = function(start, end)
{
this.refresh();
this.dirty = false;
+
}
if (this.size == 0)return;
@@ -3422,11 +3969,10 @@ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
-
PIXI.WebGLRenderer.updateTextures();
var gl = this.gl;
-
+
// set the flipped matrix..
gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix);
@@ -3452,6 +3998,10 @@ PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix)
{
if(renderable.visible)this.renderStrip(renderable, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
}
@@ -3564,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3589,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3611,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3631,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -3652,8 +4215,9 @@ PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, global
child.textureChange = false;
if(child.worldVisible)
{
- this.removeDisplayObject(child)
- this.addDisplayObject(child)
+ this.removeDisplayObject(child);
+ this.addDisplayObject(child);
+ //this.updateTexture(child);
}
// update texture!!
}
@@ -3665,6 +4229,106 @@ PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, global
};
}
+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..
@@ -3683,19 +4347,16 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
var previousSprite = this.getPreviousRenderable(displayObject);
var nextSprite = this.getNextRenderable(displayObject);
-
/*
* so now we have the next renderable and the previous renderable
*
*/
-
if(displayObject instanceof PIXI.Sprite)
{
var previousBatch
var nextBatch
- //console.log( previousSprite)
if(previousSprite instanceof PIXI.Sprite)
{
previousBatch = previousSprite.batch;
@@ -3792,6 +4453,14 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
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;
@@ -4383,11 +5052,18 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
{
displayObject.renderCanvas(this);
}
+ else if(displayObject instanceof PIXI.Graphics)
+ {
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
+ }
// render!
- for (var i=0; i < displayObject.children.length; i++)
+ if(displayObject.children)
{
- this.renderDisplayObject(displayObject.children[i]);
+ for (var i=0; i < displayObject.children.length; i++)
+ {
+ this.renderDisplayObject(displayObject.children[i]);
+ }
}
this.context.setTransform(1,0,0,1,0,0);
@@ -4526,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -4850,6 +5729,1453 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
}
+/**
+ * @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
*/
@@ -5400,10 +7726,13 @@ PIXI.AssetLoader = function(assetURLs)
"jpeg": PIXI.ImageLoader,
"png": PIXI.ImageLoader,
"gif": PIXI.ImageLoader,
- "json": PIXI.SpriteSheetLoader,
+ "json": PIXI.JsonLoader,
+ "anim": PIXI.SpineLoader,
"xml": PIXI.BitmapFontLoader,
"fnt": PIXI.BitmapFontLoader
};
+
+
};
/**
@@ -5485,6 +7814,8 @@ PIXI.JsonLoader = function (url, crossorigin) {
this.url = url;
this.baseUrl = url.replace(/[^\/]*$/, "");
this.crossorigin = crossorigin;
+ this.loaded = false;
+
};
// constructor
@@ -5513,7 +7844,57 @@ PIXI.JsonLoader.prototype.onJSONLoaded = function () {
if (this.ajaxRequest.readyState == 4) {
if (this.ajaxRequest.status == 200 || window.location.href.indexOf("http") == -1) {
this.json = JSON.parse(this.ajaxRequest.responseText);
- this.onLoaded();
+
+ if(this.json.frames)
+ {
+ // sprite sheet
+ var scope = this;
+ var textureUrl = this.baseUrl + this.json.meta.image;
+ var image = new PIXI.ImageLoader(textureUrl, this.crossorigin);
+ var frameData = this.json.frames;
+
+ this.texture = image.texture.baseTexture;
+ image.addEventListener("loaded", function (event) {
+ scope.onLoaded();
+ });
+
+ for (var i in frameData) {
+ var rect = frameData[i].frame;
+ if (rect) {
+ PIXI.TextureCache[i] = new PIXI.Texture(this.texture, {
+ x: rect.x,
+ y: rect.y,
+ width: rect.w,
+ height: rect.h
+ });
+ if (frameData[i].trimmed) {
+ //var realSize = frameData[i].spriteSourceSize;
+ PIXI.TextureCache[i].realSize = frameData[i].spriteSourceSize;
+ PIXI.TextureCache[i].trim.x = 0; // (realSize.x / rect.w)
+ // calculate the offset!
+ }
+ }
+ }
+
+ image.load();
+
+ }
+ else if(this.json.bones)
+ {
+ // spine animation
+ var spineJsonParser = new spine.SkeletonJson();
+ var skeletonData = spineJsonParser.readSkeletonData(this.json);
+ PIXI.AnimCache[this.url] = skeletonData;
+ this.onLoaded();
+ }
+ else
+ {
+ this.onLoaded();
+ }
+
+
+
+
} else {
this.onError();
}
@@ -5525,6 +7906,7 @@ PIXI.JsonLoader.prototype.onJSONLoaded = function () {
* @private
*/
PIXI.JsonLoader.prototype.onLoaded = function () {
+ this.loaded = true;
this.dispatchEvent({
type: "loaded",
content: this
@@ -5815,6 +8197,83 @@ PIXI.BitmapFontLoader.prototype.onLoaded = function()
this.dispatchEvent({type: "loaded", content: this});
};
+/**
+ * @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
+ *
+ */
+
+/**
+ * The Spine loader is used to load in JSON spine data
+ * To generate the data you need to use http://esotericsoftware.com/ and export the "JSON" format
+ * 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
+ * You will need to generate a sprite sheet to accompany the spine data
+ * When loaded this class will dispatch a "loaded" event
+ * @class Spine
+ * @constructor
+ * @extends EventTarget
+ * @param {String} url the url of the sprite sheet JSON file
+ * @param {Boolean} crossorigin
+ */
+PIXI.SpineLoader = function(url, crossorigin)
+{
+ PIXI.EventTarget.call(this);
+ this.url = url;
+ this.crossorigin = crossorigin;
+ this.loaded = false;
+}
+
+PIXI.SpineLoader.constructor = PIXI.SpineLoader;
+
+PIXI.SpineLoader.prototype.load = function()
+{
+ new PIXI.JsonLoader(this.url, this.crossorigin);
+ jsonLoader.addEventListener("loaded", function (event) {
+ scope.json = event.content.json;
+ scope.onJSONLoaded();
+ });
+ jsonLoader.load();
+};
+
+PIXI.SpineLoader.prototype.load = function () {
+
+ var scope = this;
+ var jsonLoader = new PIXI.JsonLoader(this.url, this.crossorigin);
+ jsonLoader.addEventListener("loaded", function (event) {
+ scope.json = event.content.json;
+ scope.onJSONLoaded();
+ });
+ jsonLoader.load();
+};
+
+/**
+ * Invoke when JSON file is loaded
+ * @private
+ */
+PIXI.SpineLoader.prototype.onJSONLoaded = function (event) {
+
+ var spineJsonParser = new spine.SkeletonJson();
+
+ var skeletonData = spineJsonParser.readSkeletonData(this.json);
+
+ PIXI.AnimCache[this.url] = skeletonData;
+
+ this.onLoaded();
+};
+
+
+
+PIXI.SpineLoader.prototype.onLoaded = function()
+{
+ this.loaded = true;
+ this.dispatchEvent({type: "loaded", content: this});
+};
+
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
diff --git a/examples/example 2 - SpriteSheet/pixi.js b/examples/example 2 - SpriteSheet/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 2 - SpriteSheet/pixi.js
+++ b/examples/example 2 - SpriteSheet/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js
index 95e4690..21e9a00 100755
--- a/examples/example 3 - MovieClip/pixi.js
+++ b/examples/example 3 - MovieClip/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 4 - Balls/pixi.js b/examples/example 4 - Balls/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 4 - Balls/pixi.js
+++ b/examples/example 4 - Balls/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 5 - Morph/pixi.js b/examples/example 5 - Morph/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 5 - Morph/pixi.js
+++ b/examples/example 5 - Morph/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 6 - Interactivity/pixi.js b/examples/example 6 - Interactivity/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 6 - Interactivity/pixi.js
+++ b/examples/example 6 - Interactivity/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 7 - Transparent Background/pixi.js b/examples/example 7 - Transparent Background/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 7 - Transparent Background/pixi.js
+++ b/examples/example 7 - Transparent Background/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 8 - Dragging/pixi.js b/examples/example 8 - Dragging/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 8 - Dragging/pixi.js
+++ b/examples/example 8 - Dragging/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/examples/example 9 - Tiling Texture/pixi.js b/examples/example 9 - Tiling Texture/pixi.js
index 95e4690..21e9a00 100644
--- a/examples/example 9 - Tiling Texture/pixi.js
+++ b/examples/example 9 - Tiling Texture/pixi.js
@@ -4,7 +4,7 @@
* Copyright (c) 2012, Mat Groves
* http://goodboydigital.com/
*
- * Compiled: 2013-06-19
+ * Compiled: 2013-06-20
*
* Pixi.JS is licensed under the MIT License.
* http://www.opensource.org/licenses/mit-license.php
@@ -155,6 +155,239 @@ PIXI.Polygon.clone = function()
PIXI.Polygon.constructor = PIXI.Polygon;
+
+
+/*
+ * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
+ * you both rock!
+ */
+
+function determineMatrixArrayType() {
+ PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
+ return PIXI.Matrix;
+}
+
+determineMatrixArrayType();
+
+PIXI.mat3 = {};
+
+PIXI.mat3.create = function()
+{
+ var matrix = new PIXI.Matrix(9);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 1;
+ matrix[5] = 0;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4 = {};
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat3.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[0], a01 = mat[1], a02 = mat[2],
+ a10 = mat[3], a11 = mat[4], a12 = mat[5],
+ a20 = mat[6], a21 = mat[7], a22 = mat[8],
+
+ b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
+ b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
+ b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
+
+ dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
+ dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
+ dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
+
+ dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
+ dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
+ dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
+
+ dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
+ dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
+ dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
+
+ return dest;
+}
+
+
+PIXI.mat3.toMat4 = function (mat, dest)
+{
+ if (!dest) { dest = PIXI.mat4.create(); }
+
+ dest[15] = 1;
+ dest[14] = 0;
+ dest[13] = 0;
+ dest[12] = 0;
+
+ dest[11] = 0;
+ dest[10] = mat[8];
+ dest[9] = mat[7];
+ dest[8] = mat[6];
+
+ dest[7] = 0;
+ dest[6] = mat[5];
+ dest[5] = mat[4];
+ dest[4] = mat[3];
+
+ dest[3] = 0;
+ dest[2] = mat[2];
+ dest[1] = mat[1];
+ dest[0] = mat[0];
+
+ return dest;
+}
+
+
+/////
+
+
+PIXI.mat4.create = function()
+{
+ var matrix = new PIXI.Matrix(16);
+
+ matrix[0] = 1;
+ matrix[1] = 0;
+ matrix[2] = 0;
+ matrix[3] = 0;
+ matrix[4] = 0;
+ matrix[5] = 1;
+ matrix[6] = 0;
+ matrix[7] = 0;
+ matrix[8] = 0;
+ matrix[9] = 0;
+ matrix[10] = 1;
+ matrix[11] = 0;
+ matrix[12] = 0;
+ matrix[13] = 0;
+ matrix[14] = 0;
+ matrix[15] = 1;
+
+ return matrix;
+}
+
+PIXI.mat4.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], a03 = mat[3],
+ a12 = mat[6], a13 = mat[7],
+ a23 = mat[11];
+
+ mat[1] = mat[4];
+ mat[2] = mat[8];
+ mat[3] = mat[12];
+ mat[4] = a01;
+ mat[6] = mat[9];
+ mat[7] = mat[13];
+ mat[8] = a02;
+ mat[9] = a12;
+ mat[11] = mat[14];
+ mat[12] = a03;
+ mat[13] = a13;
+ mat[14] = a23;
+ return mat;
+ }
+
+ dest[0] = mat[0];
+ dest[1] = mat[4];
+ dest[2] = mat[8];
+ dest[3] = mat[12];
+ dest[4] = mat[1];
+ dest[5] = mat[5];
+ dest[6] = mat[9];
+ dest[7] = mat[13];
+ dest[8] = mat[2];
+ dest[9] = mat[6];
+ dest[10] = mat[10];
+ dest[11] = mat[14];
+ dest[12] = mat[3];
+ dest[13] = mat[7];
+ dest[14] = mat[11];
+ dest[15] = mat[15];
+ return dest;
+}
+
+PIXI.mat4.multiply = function (mat, mat2, dest)
+{
+ if (!dest) { dest = mat; }
+
+ // Cache the matrix values (makes for huge speed increases!)
+ var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
+ var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
+ var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
+ var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
+
+ // Cache only the current line of the second matrix
+ var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
+ dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[4];
+ b1 = mat2[5];
+ b2 = mat2[6];
+ b3 = mat2[7];
+ dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[8];
+ b1 = mat2[9];
+ b2 = mat2[10];
+ b3 = mat2[11];
+ dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ b0 = mat2[12];
+ b1 = mat2[13];
+ b2 = mat2[14];
+ b3 = mat2[15];
+ dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
+ dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
+ dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
+ dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
+
+ return dest;
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -1583,6 +1816,8 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event)
PIXI.InteractionManager.prototype.onMouseDown = function(event)
{
+ event.preventDefault();
+
// loop through inteaction tree...
// hit test each item! ->
// get interactive items under point??
@@ -1619,6 +1854,8 @@ PIXI.InteractionManager.prototype.onMouseDown = function(event)
PIXI.InteractionManager.prototype.onMouseUp = function(event)
{
+
+
var global = this.mouse.global;
@@ -1773,6 +2010,8 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event)
PIXI.InteractionManager.prototype.onTouchStart = function(event)
{
+ event.preventDefault();
+
var rect = this.target.view.getBoundingClientRect();
var changedTouches = event.changedTouches;
@@ -2187,239 +2426,6 @@ PIXI.EventTarget = function () {
};
-
-
-/*
- * A lighter version of the rad gl-matrix created by Brandon Jones, Colin MacKenzie IV
- * you both rock!
- */
-
-function determineMatrixArrayType() {
- PIXI.Matrix = (typeof Float32Array !== 'undefined') ? Float32Array : Array;
- return PIXI.Matrix;
-}
-
-determineMatrixArrayType();
-
-PIXI.mat3 = {};
-
-PIXI.mat3.create = function()
-{
- var matrix = new PIXI.Matrix(9);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 1;
- matrix[5] = 0;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 1;
-
- return matrix;
-}
-
-PIXI.mat4 = {};
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat3.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[0], a01 = mat[1], a02 = mat[2],
- a10 = mat[3], a11 = mat[4], a12 = mat[5],
- a20 = mat[6], a21 = mat[7], a22 = mat[8],
-
- b00 = mat2[0], b01 = mat2[1], b02 = mat2[2],
- b10 = mat2[3], b11 = mat2[4], b12 = mat2[5],
- b20 = mat2[6], b21 = mat2[7], b22 = mat2[8];
-
- dest[0] = b00 * a00 + b01 * a10 + b02 * a20;
- dest[1] = b00 * a01 + b01 * a11 + b02 * a21;
- dest[2] = b00 * a02 + b01 * a12 + b02 * a22;
-
- dest[3] = b10 * a00 + b11 * a10 + b12 * a20;
- dest[4] = b10 * a01 + b11 * a11 + b12 * a21;
- dest[5] = b10 * a02 + b11 * a12 + b12 * a22;
-
- dest[6] = b20 * a00 + b21 * a10 + b22 * a20;
- dest[7] = b20 * a01 + b21 * a11 + b22 * a21;
- dest[8] = b20 * a02 + b21 * a12 + b22 * a22;
-
- return dest;
-}
-
-
-PIXI.mat3.toMat4 = function (mat, dest)
-{
- if (!dest) { dest = PIXI.mat4.create(); }
-
- dest[15] = 1;
- dest[14] = 0;
- dest[13] = 0;
- dest[12] = 0;
-
- dest[11] = 0;
- dest[10] = mat[8];
- dest[9] = mat[7];
- dest[8] = mat[6];
-
- dest[7] = 0;
- dest[6] = mat[5];
- dest[5] = mat[4];
- dest[4] = mat[3];
-
- dest[3] = 0;
- dest[2] = mat[2];
- dest[1] = mat[1];
- dest[0] = mat[0];
-
- return dest;
-}
-
-
-/////
-
-
-PIXI.mat4.create = function()
-{
- var matrix = new PIXI.Matrix(16);
-
- matrix[0] = 1;
- matrix[1] = 0;
- matrix[2] = 0;
- matrix[3] = 0;
- matrix[4] = 0;
- matrix[5] = 1;
- matrix[6] = 0;
- matrix[7] = 0;
- matrix[8] = 0;
- matrix[9] = 0;
- matrix[10] = 1;
- matrix[11] = 0;
- matrix[12] = 0;
- matrix[13] = 0;
- matrix[14] = 0;
- matrix[15] = 1;
-
- return matrix;
-}
-
-PIXI.mat4.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], a03 = mat[3],
- a12 = mat[6], a13 = mat[7],
- a23 = mat[11];
-
- mat[1] = mat[4];
- mat[2] = mat[8];
- mat[3] = mat[12];
- mat[4] = a01;
- mat[6] = mat[9];
- mat[7] = mat[13];
- mat[8] = a02;
- mat[9] = a12;
- mat[11] = mat[14];
- mat[12] = a03;
- mat[13] = a13;
- mat[14] = a23;
- return mat;
- }
-
- dest[0] = mat[0];
- dest[1] = mat[4];
- dest[2] = mat[8];
- dest[3] = mat[12];
- dest[4] = mat[1];
- dest[5] = mat[5];
- dest[6] = mat[9];
- dest[7] = mat[13];
- dest[8] = mat[2];
- dest[9] = mat[6];
- dest[10] = mat[10];
- dest[11] = mat[14];
- dest[12] = mat[3];
- dest[13] = mat[7];
- dest[14] = mat[11];
- dest[15] = mat[15];
- return dest;
-}
-
-PIXI.mat4.multiply = function (mat, mat2, dest)
-{
- if (!dest) { dest = mat; }
-
- // Cache the matrix values (makes for huge speed increases!)
- var a00 = mat[ 0], a01 = mat[ 1], a02 = mat[ 2], a03 = mat[3];
- var a10 = mat[ 4], a11 = mat[ 5], a12 = mat[ 6], a13 = mat[7];
- var a20 = mat[ 8], a21 = mat[ 9], a22 = mat[10], a23 = mat[11];
- var a30 = mat[12], a31 = mat[13], a32 = mat[14], a33 = mat[15];
-
- // Cache only the current line of the second matrix
- var b0 = mat2[0], b1 = mat2[1], b2 = mat2[2], b3 = mat2[3];
- dest[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[4];
- b1 = mat2[5];
- b2 = mat2[6];
- b3 = mat2[7];
- dest[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[8];
- b1 = mat2[9];
- b2 = mat2[10];
- b3 = mat2[11];
- dest[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- b0 = mat2[12];
- b1 = mat2[13];
- b2 = mat2[14];
- b3 = mat2[15];
- dest[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;
- dest[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;
- dest[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;
- dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;
-
- return dest;
-}
-
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2543,6 +2549,450 @@ PIXI.activatePrimitiveShader = function()
}
+/**
+ * @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)
+{
+ PIXI.activatePrimitiveShader();
+ var gl = PIXI.gl;
+
+ // graphicsObject
+ // a collection of "shapes" (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)
+ {
+ graphics.dirty = false;
+
+ if(graphics.clearDirty)
+ {
+ graphics.clearDirty = false;
+
+ graphics._webGL.lastIndex = 0;
+ graphics._webGL.points = [];
+ }
+
+ PIXI.WebGLGraphics.initGraphics(graphics);
+ }
+
+ gl.uniformMatrix4fv(PIXI.shaderProgram2.mvMatrixUniform, false, PIXI.projectionMatrix );
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer);
+ gl.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.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
+
+ PIXI.activateDefaultShader();
+}
+
+PIXI.WebGLGraphics.initGraphics = function(graphics)
+{
+ for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++)
+ {
+ var data = graphics.graphicsData[i];
+
+ if(data.type == PIXI.Graphics.POLY)
+ {
+ 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)
+ {
+ PIXI.WebGLGraphics.buildCircle(data, graphics._webGL);
+ }
+ };
+
+ //console.log(graphics._webGL.lastIndex - 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)
+{
+ 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;
+
+ 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 = 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;
+
+ // insert dead triangle!
+ verts.push(webGLData.lastPosition.x, webGLData.lastPosition.y, 1, 1, 1, 1);
+ verts.push(points[0] - perp.x , points[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 = 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;
+
+ var perp2 = getPerp(point2, point3);
+ var dist2 = Math.sqrt(perp2.x*perp2.x + perp2.y*perp2.y);
+ perp2.x /= dist2;
+ perp2.y /= dist2;
+ perp2.x *= width;
+ perp2.y *= width;
+
+ var p1 = new PIXI.Point(-perp.x+ point2.x , -perp.y+point2.y);
+ var p1_ = new PIXI.Point(-perp.x+ point1.x, -perp.y+point1.y);
+
+ var p2 = new PIXI.Point(-perp2.x+ point2.x , -perp2.y+point2.y );
+ var p2_ = new PIXI.Point(-perp2.x+ point3.x , -perp2.y+point3.y );
+
+ var p = lineIntersectLine(p1, p1_, p2, p2_);
+
+ 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 = 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];
+}
+
+
+function normalise(point)
+{
+ var dist = Math.sqrt(point.x * point.x + point.y * point.y);
+ return new PIXI.Point(point.x / dist, point.y / dist);
+}
+
+function getPerp(point, point2)
+{
+ return new PIXI.Point(-(point.y - point2.y), point.x - point2.x);
+}
+
+function lineIntersectLine(A,B,E,F)
+{
+ var ip;
+ var a1;
+ var a2;
+ var b1;
+ var b2;
+ var c1;
+ var c2;
+
+ a1= B.y-A.y;
+ b1= A.x-B.x;
+ c1= B.x*A.y - A.x*B.y;
+ a2= F.y-E.y;
+ b2= E.x-F.x;
+ c2= F.x*E.y - E.x*F.y;
+
+ var denom=a1*b2 - a2*b1;
+
+ if (denom == 0) {
+ // return null;
+ console.log("!")
+ denom+=1;
+ }
+ ip=new PIXI.Point();
+ ip.x=(b1*c2 - b2*c1)/denom;
+ ip.y=(a2*c1 - a1*c2)/denom;
+
+ return ip;
+}
+
+
+
+PIXI.primitiveShaderFragmentSrc = [
+ "precision mediump float;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_FragColor = vColor;",
+ "}"
+];
+
+PIXI.primitiveShaderVertexSrc = [
+ "attribute vec2 aVertexPosition;",
+ "attribute vec4 aColor;",
+ "uniform mat4 uMVMatrix;",
+ "varying vec4 vColor;",
+ "void main(void) {",
+ "gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);",
+ "vColor = aColor;",
+ "}"
+];
+
+
+PIXI.WebGLGraphics.initShaders = function()
+{
+ var gl = PIXI.gl;
+ var fragmentShader = PIXI.CompileFragmentShader(gl, PIXI.primitiveShaderFragmentSrc);
+ var vertexShader = PIXI.CompileVertexShader(gl, PIXI.primitiveShaderVertexSrc);
+
+ PIXI.shaderProgram2 = gl.createProgram();
+
+ var shaderProgram = PIXI.shaderProgram2;
+
+ gl.attachShader(shaderProgram, vertexShader);
+ gl.attachShader(shaderProgram, fragmentShader);
+ gl.linkProgram(shaderProgram);
+
+ if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
+ alert("Could not initialise shaders");
+ }
+
+ gl.useProgram(shaderProgram);
+
+ shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
+ shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor");
+
+ shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
+}
+
/**
* @author Mat Groves http://matgroves.com/ @Doormat23
*/
@@ -2579,7 +3029,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent)
this.view = view || document.createElement( 'canvas' );
this.view.width = this.width;
- this.view.height = this.height;
+ this.view.height = this.height;
// deal with losing context..
var scope = this;
@@ -3664,7 +4114,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
return;
}
@@ -3689,7 +4142,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
// DO the middle batchs..
for (var i=startBatchIndex+1; i < endBatchIndex; i++)
{
@@ -3711,7 +4167,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(renderable.visible) renderable.renderWebGL(this, projectionMatrix);
}
-
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
// DO the last batch..
@@ -3731,6 +4190,10 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project
{
if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix);
}
+ else if(renderable instanceof PIXI.Graphics)
+ {
+ if(renderable.visible) PIXI.WebGLGraphics.renderGraphics(renderable);//, projectionMatrix);
+ }
}
PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
@@ -4591,7 +5054,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject)
}
else if(displayObject instanceof PIXI.Graphics)
{
- displayObject.render(this);
+ PIXI.CanvasGraphics.renderGraphics(displayObject, context);
}
// render!
@@ -4739,6 +5202,209 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip)
+/**
+ * @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
+ */
+
+
+/**
+ * A DisplayObjectContainer represents a collection 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.Graphics = function()
+{
+ PIXI.DisplayObjectContainer.call( this );
+
+ this.renderable = true;
+
+ // style - color
+ // style - thickness
+ // alpha -
+ this.fillAlpha = 1;
+
+ this.lineWidth = 2;
+ this.lineColor = "#FF0000";
+
+ this.graphicsData = [];
+
+}
+
+// SOME TYPES:
+PIXI.Graphics.POLY = 0;
+PIXI.Graphics.RECT = 1;
+PIXI.Graphics.CIRC = 2;
+
+// constructor
+PIXI.Graphics.constructor = PIXI.Graphics;
+PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype );
+
+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
+}
+
+
+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);
+}
+
+PIXI.Graphics.prototype.lineTo = function(x, y)
+{
+ this.currentPath.points.push(x, y);
+ this.dirty = true;
+}
+
+PIXI.Graphics.prototype.beginFill = function(color, alpha)
+{
+ this.filling = true;
+ this.fillColor = color || 0;
+ this.fillAlpha = alpha || 1;
+}
+
+PIXI.Graphics.prototype.endFill = function()
+{
+ this.filling = false;
+ this.fillColor = null;
+ this.fillAlpha = 1;
+}
+
+PIXI.Graphics.prototype.updateTransform = function()
+{
+ if(!this.visible)return;
+ PIXI.DisplayObject.prototype.updateTransform.call( this );
+}
+
+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;
+}
+
+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;
+}
+
+PIXI.Graphics.prototype.clear = function()
+{
+ this.dirty = true;
+ this.clearDirty = true;
+ this.graphicsData = [];
+}
+
/**
* @author Mat Groves http://matgroves.com/
*/
@@ -5079,7 +5745,7 @@ PIXI.TilingSprite.prototype.onTextureUpdate = function(event)
* See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
* @class Spine
* @constructor
- * @extends
+ * @extends DisplayObjectContainer
* @param {String} url the url of the spine anim file to be used
*/
PIXI.Spine = function(url)
diff --git a/src/pixi/utils/Matrix.js b/src/pixi/core/Matrix.js
similarity index 100%
rename from src/pixi/utils/Matrix.js
rename to src/pixi/core/Matrix.js
diff --git a/src/pixi/Point.js b/src/pixi/core/Point.js
similarity index 100%
rename from src/pixi/Point.js
rename to src/pixi/core/Point.js
diff --git a/src/pixi/Polygon.js b/src/pixi/core/Polygon.js
similarity index 100%
rename from src/pixi/Polygon.js
rename to src/pixi/core/Polygon.js
diff --git a/src/pixi/Rectangle.js b/src/pixi/core/Rectangle.js
similarity index 100%
rename from src/pixi/Rectangle.js
rename to src/pixi/core/Rectangle.js
diff --git a/src/pixi/DisplayObject.js b/src/pixi/display/DisplayObject.js
similarity index 100%
rename from src/pixi/DisplayObject.js
rename to src/pixi/display/DisplayObject.js
diff --git a/src/pixi/DisplayObjectContainer.js b/src/pixi/display/DisplayObjectContainer.js
similarity index 100%
rename from src/pixi/DisplayObjectContainer.js
rename to src/pixi/display/DisplayObjectContainer.js
diff --git a/src/pixi/MovieClip.js b/src/pixi/display/MovieClip.js
similarity index 100%
rename from src/pixi/MovieClip.js
rename to src/pixi/display/MovieClip.js
diff --git a/src/pixi/Sprite.js b/src/pixi/display/Sprite.js
similarity index 100%
rename from src/pixi/Sprite.js
rename to src/pixi/display/Sprite.js
diff --git a/src/pixi/Stage.js b/src/pixi/display/Stage.js
similarity index 100%
rename from src/pixi/Stage.js
rename to src/pixi/display/Stage.js
diff --git a/src/pixi/primitives/Line.js b/src/pixi/primitives/Line.js
deleted file mode 100644
index 282110d..0000000
--- a/src/pixi/primitives/Line.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @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.Line = function()
-{
- PIXI.DisplayObject.call( this );
-
- // style - color
- // style - thickness
- // alpha -
-}
-
-// constructor
-PIXI.Line.constructor = PIXI.Line;
-PIXI.Line.prototype = Object.create( PIXI.DisplayObject.prototype );
-
-
-
-
-/**
- * @private
- */
-PIXI.DisplayObjectContainer.prototype.updateTransform = function()
-{
- if(!this.visible)return;
-
- PIXI.DisplayObject.prototype.updateTransform.call( this );
-
-}
diff --git a/src/pixi/renderers/CanvasGraphics.js b/src/pixi/renderers/canvas/CanvasGraphics.js
similarity index 100%
rename from src/pixi/renderers/CanvasGraphics.js
rename to src/pixi/renderers/canvas/CanvasGraphics.js
diff --git a/src/pixi/renderers/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js
similarity index 100%
rename from src/pixi/renderers/CanvasRenderer.js
rename to src/pixi/renderers/canvas/CanvasRenderer.js
diff --git a/src/pixi/renderers/WebGLBatch.js b/src/pixi/renderers/webgl/WebGLBatch.js
similarity index 100%
rename from src/pixi/renderers/WebGLBatch.js
rename to src/pixi/renderers/webgl/WebGLBatch.js
diff --git a/src/pixi/renderers/WebGLGraphics.js b/src/pixi/renderers/webgl/WebGLGraphics.js
similarity index 99%
rename from src/pixi/renderers/WebGLGraphics.js
rename to src/pixi/renderers/webgl/WebGLGraphics.js
index 949d283..b918f13 100644
--- a/src/pixi/renderers/WebGLGraphics.js
+++ b/src/pixi/renderers/webgl/WebGLGraphics.js
@@ -34,9 +34,9 @@ PIXI.WebGLGraphics.renderGraphics = function(graphics)
if(graphics.clearDirty)
{
graphics.clearDirty = false;
+
graphics._webGL.lastIndex = 0;
graphics._webGL.points = [];
-
}
PIXI.WebGLGraphics.initGraphics(graphics);
@@ -50,7 +50,6 @@ PIXI.WebGLGraphics.renderGraphics = function(graphics)
//shaderProgram.colorAttribute
-// ulong idx, long size, ulong type, bool norm, long stride, ulong offset )
gl.drawArrays(gl.TRIANGLE_STRIP, 0, graphics._webGL.glPoints.length/6);
PIXI.activateDefaultShader();
diff --git a/src/pixi/renderers/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js
similarity index 100%
rename from src/pixi/renderers/WebGLRenderGroup.js
rename to src/pixi/renderers/webgl/WebGLRenderGroup.js
diff --git a/src/pixi/renderers/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js
similarity index 100%
rename from src/pixi/renderers/WebGLRenderer.js
rename to src/pixi/renderers/webgl/WebGLRenderer.js
diff --git a/src/pixi/renderers/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js
similarity index 100%
rename from src/pixi/renderers/WebGLShaders.js
rename to src/pixi/renderers/webgl/WebGLShaders.js