From da4c67d38b6a7ff4d177e973670e2a72763200fb Mon Sep 17 00:00:00 2001 From: "Dr. Kibitz" Date: Tue, 24 Sep 2013 09:37:17 -0700 Subject: [PATCH 01/12] Squashed commit of the following (unittest-refactor): commit 9887e45976fc5211a4393e588d278a5e10baf06c Author: Dr. Kibitz Date: Tue Sep 3 10:54:13 2013 -0700 FIX: Ellipse getBounds method is not static commit b3b359ad1c0fae412209705b01081dd231383656 Author: Dr. Kibitz Date: Tue Sep 3 10:53:41 2013 -0700 More unit testing commit dafbd1dbb03364b6d54db0cad26c4f02a8b9efe1 Author: Dr. Kibitz Date: Sun Sep 1 16:04:29 2013 -0700 Remove unused karma plugin commit 43209bfb59263278d2dc3561d06926ad515c4147 Author: Dr. Kibitz Date: Sun Sep 1 15:28:21 2013 -0700 Add Travis CI status image to README commit 2e38ba370bc05c239736155dcb06e34b47abf938 Author: Dr. Kibitz Date: Sun Sep 1 15:16:54 2013 -0700 typo commit b8898030da4d3e7b446ebb4ddeb30e8fc0adcf39 Author: Dr. Kibitz Date: Sun Sep 1 15:13:33 2013 -0700 Lint test files, jsthint:test is now part of the test task commit ea414dd1d734b39523174bd86d0cc58e920a89d2 Author: Dr. Kibitz Date: Sun Sep 1 15:11:50 2013 -0700 Make all boilerplate tests, and an actual start to writing some real tests commit 9e09c87997ae924989da4e1685f3a94636ab64de Author: Dr. Kibitz Date: Sun Sep 1 14:37:51 2013 -0700 Add back serving png files, convert to spaces commit b45b1650c2e812a9cdb1165d96fba7b14bbdfab7 Author: Dr. Kibitz Date: Sun Sep 1 00:55:57 2013 -0700 Comment out functional tests for now commit 3a350bf9e4d9fea470ad8e734dfc3542db74ccc8 Author: Dr. Kibitz Date: Sat Aug 31 23:53:35 2013 -0700 Removed quint, added karma, added resemble.js, refactored unit tests for mocha, added first example visual test run with: grunt travis You should see a brewer open and eventually see the spinning bunny. Then in the terminal, you should see the tests running where it matches frames 30, 60, and 90. Conflicts: package.json commit ac4c6de388e7a37786c9c4a6b2c95e22ec26b05d Author: Dr. Kibitz Date: Sat Aug 31 23:33:23 2013 -0700 Remove trailing whitespace --- .gitignore | 3 +- .travis.yml | 8 + Gruntfile.js | 42 +- README.md | 2 + package.json | 15 +- src/pixi/InteractionManager.js | 1 - src/pixi/core/Ellipse.js | 2 +- tasks/karma.js | 27 + test/functional/example-1-basics/bunny.png | Bin 0 -> 449 bytes test/functional/example-1-basics/frame-30.png | Bin 0 -> 5532 bytes test/functional/example-1-basics/frame-60.png | Bin 0 -> 5292 bytes test/functional/example-1-basics/frame-90.png | Bin 0 -> 5634 bytes test/functional/example-1-basics/index.js | 133 + test/index.html | 22 - test/karma.conf.js | 82 + test/lib/pixi/core/Matrix.js | 40 + test/lib/pixi/core/Point.js | 10 + test/lib/pixi/core/Rectangle.js | 13 + test/lib/pixi/display/DisplayObject.js | 43 + .../pixi/display/DisplayObjectContainer.js | 16 + test/lib/pixi/display/Sprite.js | 28 + test/lib/pixi/extras/Strip.js | 12 + test/lib/pixi/textures/Texture.js | 31 + test/lib/pixi/utils/EventTarget.js | 8 + test/lib/qunit-1.11.0.css | 244 -- test/lib/qunit-1.11.0.js | 2152 ----------------- test/lib/require.js | 35 - test/lib/resemble.js | 535 ++++ test/testsuite.js | 36 - test/textures/SpriteSheet-Aliens.png | Bin 0 -> 145880 bytes test/textures/SpriteSheet-Explosion.png | Bin 0 -> 920643 bytes test/textures/bunny.png | Bin 0 -> 449 bytes test/unit/DisplayObject.js | 3 - test/unit/DisplayObjectContainer.js | 3 - test/unit/InteractionManager.js | 3 - test/unit/MovieClip.js | 3 - test/unit/Pixi.js | 3 - test/unit/Point.js | 3 - test/unit/Rectangle.js | 3 - test/unit/Sprite.js | 3 - test/unit/Stage.js | 3 - test/unit/extras/Rope.js | 3 - test/unit/extras/Strip.js | 3 - test/unit/loaders/AssetLoader.js | 3 - test/unit/loaders/SpriteSheetLoader.js | 3 - test/unit/pixi/InteractionManager.js | 10 + test/unit/pixi/Pixi.js | 9 + test/unit/pixi/core/Circle.js | 22 + test/unit/pixi/core/Ellipse.js | 24 + test/unit/pixi/core/Matrix.js | 30 + test/unit/pixi/core/Point.js | 15 + test/unit/pixi/core/Polygon.js | 20 + test/unit/pixi/core/Rectangle.js | 15 + test/unit/pixi/display/DisplayObject.js | 21 + .../pixi/display/DisplayObjectContainer.js | 20 + test/unit/pixi/display/MovieClip.js | 33 + test/unit/pixi/display/Sprite.js | 25 + test/unit/pixi/display/Stage.js | 49 + test/unit/pixi/extras/CustomRenderable.js | 21 + test/unit/pixi/extras/Rope.js | 26 + test/unit/pixi/extras/Spine.js | 10 + test/unit/pixi/extras/Strip.js | 18 + test/unit/pixi/extras/TilingSprite.js | 24 + test/unit/pixi/filters/FilterBlock.js | 10 + test/unit/pixi/filters/MaskFilter.js | 10 + test/unit/pixi/loaders/AssetLoader.js | 10 + test/unit/pixi/loaders/BitmapFontLoader.js | 10 + test/unit/pixi/loaders/ImageLoader.js | 10 + test/unit/pixi/loaders/JsonLoader.js | 10 + test/unit/pixi/loaders/SpineLoader.js | 10 + test/unit/pixi/loaders/SpriteSheetLoader.js | 10 + test/unit/pixi/primitives/Graphics.js | 40 + .../pixi/renderers/canvas/CanvasGraphics.js | 15 + .../pixi/renderers/canvas/CanvasRenderer.js | 10 + test/unit/pixi/renderers/webgl/WebGLBatch.js | 10 + .../pixi/renderers/webgl/WebGLGraphics.js | 19 + .../pixi/renderers/webgl/WebGLRenderGroup.js | 10 + .../pixi/renderers/webgl/WebGLRenderer.js | 10 + .../unit/pixi/renderers/webgl/WebGLShaders.js | 13 + test/unit/pixi/text/BitmapText.js | 10 + test/unit/pixi/text/Text.js | 10 + test/unit/pixi/textures/BaseTexture.js | 13 + test/unit/pixi/textures/RenderTexture.js | 10 + test/unit/pixi/textures/Texture.js | 26 + test/unit/pixi/utils/Detector.js | 10 + test/unit/pixi/utils/EventTarget.js | 96 + test/unit/pixi/utils/Polyk.js | 14 + test/unit/pixi/utils/Utils.js | 17 + test/unit/renderers/CanvasRenderer.js | 3 - test/unit/renderers/WebGLBatch.js | 3 - test/unit/renderers/WebGLRenderer.js | 3 - test/unit/renderers/WebGLShaders.js | 3 - test/unit/textures/BaseTexture.js | 3 - test/unit/textures/Texture.js | 3 - test/unit/utils/Detector.js | 3 - test/unit/utils/EventTarget.js | 3 - test/unit/utils/Matrix.js | 3 - test/unit/utils/Utils.js | 3 - 98 files changed, 1829 insertions(+), 2585 deletions(-) create mode 100644 .travis.yml create mode 100644 tasks/karma.js create mode 100644 test/functional/example-1-basics/bunny.png create mode 100644 test/functional/example-1-basics/frame-30.png create mode 100644 test/functional/example-1-basics/frame-60.png create mode 100644 test/functional/example-1-basics/frame-90.png create mode 100644 test/functional/example-1-basics/index.js delete mode 100644 test/index.html create mode 100644 test/karma.conf.js create mode 100644 test/lib/pixi/core/Matrix.js create mode 100644 test/lib/pixi/core/Point.js create mode 100644 test/lib/pixi/core/Rectangle.js create mode 100644 test/lib/pixi/display/DisplayObject.js create mode 100644 test/lib/pixi/display/DisplayObjectContainer.js create mode 100644 test/lib/pixi/display/Sprite.js create mode 100644 test/lib/pixi/extras/Strip.js create mode 100644 test/lib/pixi/textures/Texture.js create mode 100644 test/lib/pixi/utils/EventTarget.js delete mode 100644 test/lib/qunit-1.11.0.css delete mode 100644 test/lib/qunit-1.11.0.js delete mode 100644 test/lib/require.js create mode 100644 test/lib/resemble.js delete mode 100644 test/testsuite.js create mode 100644 test/textures/SpriteSheet-Aliens.png create mode 100755 test/textures/SpriteSheet-Explosion.png create mode 100644 test/textures/bunny.png delete mode 100644 test/unit/DisplayObject.js delete mode 100644 test/unit/DisplayObjectContainer.js delete mode 100644 test/unit/InteractionManager.js delete mode 100644 test/unit/MovieClip.js delete mode 100644 test/unit/Pixi.js delete mode 100644 test/unit/Point.js delete mode 100644 test/unit/Rectangle.js delete mode 100644 test/unit/Sprite.js delete mode 100644 test/unit/Stage.js delete mode 100644 test/unit/extras/Rope.js delete mode 100644 test/unit/extras/Strip.js delete mode 100644 test/unit/loaders/AssetLoader.js delete mode 100644 test/unit/loaders/SpriteSheetLoader.js create mode 100644 test/unit/pixi/InteractionManager.js create mode 100644 test/unit/pixi/Pixi.js create mode 100644 test/unit/pixi/core/Circle.js create mode 100644 test/unit/pixi/core/Ellipse.js create mode 100644 test/unit/pixi/core/Matrix.js create mode 100644 test/unit/pixi/core/Point.js create mode 100644 test/unit/pixi/core/Polygon.js create mode 100644 test/unit/pixi/core/Rectangle.js create mode 100644 test/unit/pixi/display/DisplayObject.js create mode 100644 test/unit/pixi/display/DisplayObjectContainer.js create mode 100644 test/unit/pixi/display/MovieClip.js create mode 100644 test/unit/pixi/display/Sprite.js create mode 100644 test/unit/pixi/display/Stage.js create mode 100644 test/unit/pixi/extras/CustomRenderable.js create mode 100644 test/unit/pixi/extras/Rope.js create mode 100644 test/unit/pixi/extras/Spine.js create mode 100644 test/unit/pixi/extras/Strip.js create mode 100644 test/unit/pixi/extras/TilingSprite.js create mode 100644 test/unit/pixi/filters/FilterBlock.js create mode 100644 test/unit/pixi/filters/MaskFilter.js create mode 100644 test/unit/pixi/loaders/AssetLoader.js create mode 100644 test/unit/pixi/loaders/BitmapFontLoader.js create mode 100644 test/unit/pixi/loaders/ImageLoader.js create mode 100644 test/unit/pixi/loaders/JsonLoader.js create mode 100644 test/unit/pixi/loaders/SpineLoader.js create mode 100644 test/unit/pixi/loaders/SpriteSheetLoader.js create mode 100644 test/unit/pixi/primitives/Graphics.js create mode 100644 test/unit/pixi/renderers/canvas/CanvasGraphics.js create mode 100644 test/unit/pixi/renderers/canvas/CanvasRenderer.js create mode 100644 test/unit/pixi/renderers/webgl/WebGLBatch.js create mode 100644 test/unit/pixi/renderers/webgl/WebGLGraphics.js create mode 100644 test/unit/pixi/renderers/webgl/WebGLRenderGroup.js create mode 100644 test/unit/pixi/renderers/webgl/WebGLRenderer.js create mode 100644 test/unit/pixi/renderers/webgl/WebGLShaders.js create mode 100644 test/unit/pixi/text/BitmapText.js create mode 100644 test/unit/pixi/text/Text.js create mode 100644 test/unit/pixi/textures/BaseTexture.js create mode 100644 test/unit/pixi/textures/RenderTexture.js create mode 100644 test/unit/pixi/textures/Texture.js create mode 100644 test/unit/pixi/utils/Detector.js create mode 100644 test/unit/pixi/utils/EventTarget.js create mode 100644 test/unit/pixi/utils/Polyk.js create mode 100644 test/unit/pixi/utils/Utils.js delete mode 100644 test/unit/renderers/CanvasRenderer.js delete mode 100644 test/unit/renderers/WebGLBatch.js delete mode 100644 test/unit/renderers/WebGLRenderer.js delete mode 100644 test/unit/renderers/WebGLShaders.js delete mode 100644 test/unit/textures/BaseTexture.js delete mode 100644 test/unit/textures/Texture.js delete mode 100644 test/unit/utils/Detector.js delete mode 100644 test/unit/utils/EventTarget.js delete mode 100644 test/unit/utils/Matrix.js delete mode 100644 test/unit/utils/Utils.js diff --git a/.gitignore b/.gitignore index 12e1b62..0b88317 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .DS_Store -.project \ No newline at end of file +.project +*.log \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..63e4d7c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - 0.10 + +before_script: + - npm install -g grunt-cli + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start diff --git a/Gruntfile.js b/Gruntfile.js index b083b49..103938c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,10 +1,12 @@ +'use strict'; + module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-yuidoc'); + grunt.loadTasks('tasks'); var root = 'src/pixi/', debug = 'bin/pixi.dev.js', @@ -79,7 +81,7 @@ module.exports = function(grunt) { }, files: { srcBlob: '<%= dirs.src %>/**/*.js', - testBlob: '<%= dirs.test %>/unit/**/*.js', + testBlob: '<%= dirs.test %>/{functional,lib/pixi,unit}/**/*.js', build: '<%= dirs.build %>/pixi.dev.js', buildMin: '<%= dirs.build %>/pixi.js' }, @@ -94,7 +96,12 @@ module.exports = function(grunt) { }, jshint: { beforeconcat: srcFiles, - test: ['<%= files.testBlob %>'], + test: { + src: ['<%= files.testBlob %>'], + options: { + expr: true + } + }, options: { asi: true, smarttabs: true @@ -128,12 +135,6 @@ module.exports = function(grunt) { ] }, connect: { - qunit: { - options: { - port: grunt.option('port-test') || 9002, - base: './' - } - }, test: { options: { port: grunt.option('port-test') || 9002, @@ -142,13 +143,6 @@ module.exports = function(grunt) { } } }, - qunit: { - all: { - options: { - urls: ['http://localhost:' + (grunt.option('port-test') || 9002) + '/test/index.html'] - } - } - }, yuidoc: { compile: { name: '<%= pkg.name %>', @@ -161,6 +155,13 @@ module.exports = function(grunt) { outdir: '<%= dirs.docs %>' } } + }, + karma: { + unit: { + configFile: 'test/karma.conf.js', + // browsers: ['Chrome'], + singleRun: true + } } }); @@ -182,9 +183,10 @@ module.exports = function(grunt) { } ) - grunt.registerTask('default', ['concat', 'uglify', 'distribute']); grunt.registerTask('build', ['concat', 'uglify', 'distribute']); - grunt.registerTask('test', ['build', 'connect:qunit', 'qunit']); + grunt.registerTask('test', ['concat', 'jshint:test', 'karma']); grunt.registerTask('docs', ['yuidoc']); - -} \ No newline at end of file + grunt.registerTask('default', ['test', 'uglify', 'distribute']); + // Travis CI task. + grunt.registerTask('travis', ['test']); +} diff --git a/README.md b/README.md index c62ef86..690cfe4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Pixi Renderer ![pixi.js logo](http://www.goodboydigital.com/pixijs/logo_small.png) +[![Build Status](https://secure.travis-ci.org/drkibitz/pixi.js.png)](http://travis-ci.org/drkibitz/pixi.js) + #### JavaScript 2D Renderer #### The aim of this project is to provide a fast lightweight 2D library that works diff --git a/package.json b/package.json index b373240..1246a68 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,21 @@ "main": "bin/pixi.js", + "scripts": { + "test": "grunt travis --verbose" + }, + "dependencies": {}, "devDependencies": { "grunt": "~0.4.x", - "grunt-contrib-jshint": "0.3.x", + "grunt-contrib-jshint": "0.6.x", "grunt-contrib-uglify": "0.2.x", - "grunt-contrib-connect": "0.2.x", - "grunt-contrib-qunit": "0.2.x", + "grunt-contrib-connect": "0.3.x", "grunt-contrib-yuidoc": "0.4.x", - "grunt-contrib-concat": "0.1.x" + "grunt-contrib-concat": "0.3.x", + "chai": "~1.7.0", + "karma": "0.11.0", + "karma-firefox-launcher": "0.1.0", + "karma-mocha": "0.1.0" } } diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index a7c520e..ee82bbd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -62,7 +62,6 @@ PIXI.InteractionManager = function(stage) this.onTouchEnd = this.onTouchEnd.bind(this); this.onTouchMove = this.onTouchMove.bind(this); - this.last = 0; } diff --git a/src/pixi/core/Ellipse.js b/src/pixi/core/Ellipse.js index 1a95d20..eef1059 100644 --- a/src/pixi/core/Ellipse.js +++ b/src/pixi/core/Ellipse.js @@ -78,7 +78,7 @@ PIXI.Ellipse.prototype.contains = function(x, y) return (normx + normy < 0.25); } -PIXI.Ellipse.getBounds = function() +PIXI.Ellipse.prototype.getBounds = function() { return new PIXI.Rectangle(this.x, this.y, this.width, this.height); } diff --git a/tasks/karma.js b/tasks/karma.js new file mode 100644 index 0000000..c340485 --- /dev/null +++ b/tasks/karma.js @@ -0,0 +1,27 @@ +'use strict'; + +var path = require('path'); +var server = require('karma').server; + +module.exports = function (grunt) { + grunt.registerMultiTask('karma', 'run karma.', function() { + var done = this.async(); + var options = this.options({ + background: false + }); + var data = this.data; + + //merge options onto data, with data taking precedence + data = grunt.util._.merge(options, data); + data.configFile = path.resolve(data.configFile); + if (data.configFile) { + data.configFile = grunt.template.process(data.configFile); + } + + server.start( + data, + function(code) { + done(!code); + }); + }); +}; diff --git a/test/functional/example-1-basics/bunny.png b/test/functional/example-1-basics/bunny.png new file mode 100644 index 0000000000000000000000000000000000000000..79c31675083b7ffc272a6370bc189360bde484d0 GIT binary patch literal 449 zcmV;y0Y3hTP)SOJFMz`0@qn1GK$9W|wOohG3Lai}FkWLtiT<2<{JbM8>W7|R$! zUuNqg#gmKmsTnILy&K;zJjd^_40xy)%EA1>FWWk~LFpr>Et|!Hv(V>Hs9!2xEQJ>~!qz76HLsxFXdG zs5~GjUDeD6dXvG$_#HtoUok|M-X@BSTy{VK4P?TJZcz}O&FVzD0fZu8Yajr@?2aYL r_Q@_>J=ju&>AqoA-=wzwF98MsNX4?ApX+no*Y&=y_vii=zAb&%Hav84^C}jToLdZq*`@rG}V3)EJXEj4ve@70RC^bCw8=+I!*0-rrGBR8mnR zLDOv%7eSQu6Ps_ZRa7u%z>qYBbQ49z2jpO_O;AnqD1ay`IV&ld-0wR8Aex%s;7vs3 zfr`q7UHEeV0tQ1q{@0<2x>~M@4HiHkkhFqLd(8{GG{Md{b+rJ;X$scLo2zq8z>o(c z76&#RD+d0sxf<*YNi!jOIc+*tB5MFh8stHmf^%R!X4A0>M*n+Y-!t~T#=dvu|4tV$ zw#vMnNKhafY7JTqIZr-W%rw6@M+#-D4ZD1n0NnEQdBfXIy)lq|Dlg43Y+-~Ke~$Y= zj=2*bk&|o`NglEn>bK_Dy`e{BnhosM1W%X5DPcpbvbyEb$XguiLrhzQqb~Y-ljGh4 z{l1dff>Z%7>LX`PG!>IwFhE4^OJV7S@yo9%33UPHd={rP6q#gF{^Tc99IMWuoHT&( z$w%sBYy>VF-71jc`P^D|f2P$wj#iAWQ;K}zc;HlCB>mIncbgpeyzMQ?EV%0~!Zl~G z_zNbn&dE1Up1aDL;cuMDucf$fGpdSqg`nRU@1?mBR)h%auAF!}Ijxf;s`*a*k`3auMXWV?v6?=f^Z83cH+L%WL1s;#ruDW&plsLtBJ|!SK zVR|q>Fgu-1oX&0Z3~zY8@tX3OHg1ok>9Qh*bstt0`z(Z!b4+hhr}GKB@u@ed-poUf zH~$X}y3M>2Az9Q3%BiuviPeuW5Ur14-YFkA$sF(g`Q{Dsz3|3!P%*1=#>ytpLwxx9 zx{R%5wol(aCA7oa;BZkI92{Kox6;FnRNt?nW%BB3#2oQU14hq3jQmxweQ|?k{=j|B z9la)5Z(FNGTEAS2U$R~*!-Ry`dP5T{=3j+mt=5*38uo$CbsPdiG=4dv3TjC>t0A31 zcR6P)lcqfBI)i?)dL58EM&rf?LKeCqDWp~5rc1xwljaE+o;9T;0*mslsmR;K{+#xL zxy8{d;px*b&Zz%hZT>zf-MMnQ?q#Dvd&Dgb&d*FZ>*tdm1|UQ>E@6UGM;$KA_VjJL znt02*lz&iY9NzVzn?KCFB2pnK0h!r-1H>a7o6OoHr4%WI7JXm`;KhL>S{=z1P|3fZ zCufTaP|^+2z|rhg-c*+lG||7+f@wc4E_Xh1Tn7PHRJ_Xg#30QBu?XSN#K_aF^|5*J zctPLtWn7Xea|`mNZ($1qsk_r*!`B?bIn^WW2%!uh8C5O+EY4bhA%Zd4V+H^x4?c|v z>}+68DjPIW)-oLT5PpgGtnFD>mr_bQibl5P+Ts=?qP{s3yPx6~=_y%Zh<1e+vC>&Y z%F;ohIt|7_G)7=2X5H%`JJ!9H$5*+%=e!c+eC~Z|SEJHYUnvPK=^mNDO6dkLaRbmX z4H4)zY$S-sjuDVgq%c-So+s(NqCneql$)fB(J)x(n@fGIQ7~e5Oz= z`uF_}HbzAI(ZL*FchQve+VATv{){lz+|jMXZL3=D=}{X!!r=w1TXyy#E(j9~k9>Vv zF8X$d6~qmonW^V5d4?~cg61Z+kgF>q?zaqWB)2%m$WZL4IS012gopVQP({u7WPhOX zWH4j6w;l&628KjbCBky0U#nRh6f{|?Tuz>_w+LkiG$nSD%V>SO@R3Q$PV)WgRzVw2Zdd>K@`0+#hl>$u6=<}o zhuv553FLLCSY|{!G8%GzwhecgG1D?M&ob)scXJR6YKb=%K%x(KIxy*25C*n|wA2pY zd1@3R>|@&Octb%Xj*nX=HF6GsAxSP~zEtUfpJG4GMM=ICL!si!us-;9`v{uVO5`b! z6#epu-}81MH=8wwIPXqkvA0wl^lOggEePutn>H8*sCcmAn!_N_5j{hK8XTbF0DHvxO zBC*LU{zv!Eq3YGA6ct}Beszek(%RF+V{mZ~{lnS{+nd)uQooqDPWD1yH@Sw&UQiiz zg3Jc1lXfI4`K- zOf5;M+SjjZ42EQemYuz-YD!pqxVrqlmHU>!oTM;1ny7|y-z2wk z=Z~ypYUO8LLM6?rEqf^{{u|=Me-F=lYploCXN|8ctxi(yC*$i42I(BDy)^i!jnRWJdi*$K0iW(z}Kgg1avKI)ZIkGpBy50Ny2`v_&1G8Bct=;De)8>>I{&JKP_9js+E>frDsny3%#Po3$lY2+8+kK&CL!J z-R4g+BO`Q6Q;!|Q6-K366iP4p)(?IuNTNL^(*KI_W(=h~ie}kvp_~CIm21fBV;bWn zuE5dlrIVE$X!^V$)zs0G_Yc4j0Z@1o8##N!K}z6n&+hzGUCq~0 z6dQ!^zl2>$pKVH=t`$ZYLW`~K;yS1>j)eGoQDwfGTCU%}YWc)y)voPw@3E*J(n#oV z>7e!XSvqAbhUXgfRlg(CFmknGPvcT~lq{nkOWblPM|RrYk_q>!Uu)0p77g58n#@C^ zm@v*G*6IFsKskQ6cw6$i&E@m7a)+T_%0l-l`Gu{MeEW{fT6j6-p{ z7Ox9WfmY*yi`>#c=+M9!H^PPfNLWn-OmHcx*Cwt=5>AQn&2z7 zX$ps$nhqNSW*&gve#DptwDCbWBrT8S^9Yd3;40u8J>fBch|V(yLwe?FdN#GQJ0$Ho zufYxw#XUNjVBU(y?||8d!(hm(MdlM=Umg%mbaK_tfZ26mfmb5Z71%c#h^D2@T^}&} p9`5(-elLdat@eMw4C(SM$1K~FUz{OT1GlaU&gWd6YR_J~{T~(!?r{JB literal 0 HcmV?d00001 diff --git a/test/functional/example-1-basics/frame-60.png b/test/functional/example-1-basics/frame-60.png new file mode 100644 index 0000000000000000000000000000000000000000..af3f4ce9cf63b56b882cc8e940d853ff7b4627c7 GIT binary patch literal 5292 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 rR@kj1Z0&@t8+BKZN`P+X1'); + resemble(str) + .compareTo(baseUri + '/frame-30.png') + .onComplete(function (data) { + expect(data).to.be.an('object'); + expect(data.isSameDimensions).to.equal(true); + expect(data.misMatchPercentage).to.be.below(0.2); + done(); + }); + }); + }); + + it('frame 60 should match', function (done) { + this.timeout(1200); + onFrame(60, function () { + var str = renderer.view.toDataURL('image/png'); + //console.log(''); + resemble(str) + .compareTo(baseUri + '/frame-60.png') + .onComplete(function (data) { + expect(data).to.be.an('object'); + expect(data.isSameDimensions).to.equal(true); + expect(data.misMatchPercentage).to.be.below(0.2); + done(); + }); + }); + }); + + it('frame 90 should match', function (done) { + this.timeout(1700); + onFrame(90, function () { + var str = renderer.view.toDataURL('image/png'); + //console.log(''); + resemble(str) + .compareTo(baseUri + '/frame-90.png') + .onComplete(function (data) { + expect(data).to.be.an('object'); + expect(data.isSameDimensions).to.equal(true); + expect(data.misMatchPercentage).to.be.below(0.2); + done(); + }); + }); + }); + + // it('capture something', function (done) { + // this.timeout(2000000); + // onFrame(30, function () { + // var img = new Image(); + // img.src = renderer.view.toDataURL('image/png'); + // document.body.appendChild(img); + // }); + // }); +}); diff --git a/test/index.html b/test/index.html deleted file mode 100644 index 9cbcac5..0000000 --- a/test/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - Pixi.js Test Suite - - - - - - - - -
-
- - - - - \ No newline at end of file diff --git a/test/karma.conf.js b/test/karma.conf.js new file mode 100644 index 0000000..c66a696 --- /dev/null +++ b/test/karma.conf.js @@ -0,0 +1,82 @@ +module.exports = function(config) { + config.set({ + + // base path, that will be used to resolve files and exclude + basePath : '../', + + frameworks : ['mocha'], + + // list of files / patterns to load in the browser + files : [ + 'node_modules/chai/chai.js', + 'bin/pixi.dev.js', + 'test/lib/**/*.js', + 'test/unit/**/*.js', + // 'test/functional/**/*.js', + {pattern: 'test/**/*.png', watched: false, included: false, served: true} + ], + + // list of files to exclude + exclude : [], + + // use dolts reporter, as travis terminal does not support escaping sequences + // possible values: 'dots', 'progress', 'junit', 'teamcity' + // CLI --reporters progress + reporters : ['progress'], + + // web server port + // CLI --port 9876 + port : 9876, + + // cli runner port + // CLI --runner-port 9100 + runnerPort : 9100, + + // enable / disable colors in the output (reporters and logs) + // CLI --colors --no-colors + colors : true, + + // level of logging + // possible values: karma.LOG_DISABLE || karma.LOG_ERROR || karma.LOG_WARN || karma.LOG_INFO || karma.LOG_DEBUG + // CLI --log-level debug + logLevel : config.LOG_DEBUG, + + // enable / disable watching file and executing tests whenever any file changes + // CLI --auto-watch --no-auto-watch + autoWatch : false, + + // Start these browsers, currently available: + // - Chrome + // - ChromeCanary + // - Firefox + // - Opera + // - Safari (only Mac) + // - PhantomJS + // - IE (only Windows) + // CLI --browsers Chrome,Firefox,Safari + browsers : ['Firefox'], + + // If browser does not capture in given timeout [ms], kill it + // CLI --capture-timeout 5000 + captureTimeout : 5000, + + // Auto run tests on start (when browsers are captured) and exit + // CLI --single-run --no-single-run + singleRun : true, + + // report which specs are slower than 500ms + // CLI --report-slower-than 500 + reportSlowerThan : 1000, + + preprocessors : { + // '**/client/js/*.js': 'coverage' + }, + + plugins : [ + 'karma-mocha', + // 'karma-chrome-launcher', + 'karma-firefox-launcher', + // 'karma-phantomjs-launcher' + ] + }); +}; diff --git a/test/lib/pixi/core/Matrix.js b/test/lib/pixi/core/Matrix.js new file mode 100644 index 0000000..d26386b --- /dev/null +++ b/test/lib/pixi/core/Matrix.js @@ -0,0 +1,40 @@ + +function pixi_core_Matrix_confirmNewMat3(matrix) { + var expect = chai.expect; + + expect(matrix).to.be.an.instanceof(PIXI.Matrix); + expect(matrix).to.not.be.empty; + + expect(matrix[1]).to.equal(0); + expect(matrix[2]).to.equal(0); + expect(matrix[3]).to.equal(0); + expect(matrix[4]).to.equal(1); + expect(matrix[5]).to.equal(0); + expect(matrix[6]).to.equal(0); + expect(matrix[7]).to.equal(0); + expect(matrix[8]).to.equal(1); +} + +function pixi_core_Matrix_confirmNewMat4(matrix) { + var expect = chai.expect; + + expect(matrix).to.be.an.instanceof(PIXI.Matrix); + expect(matrix).to.not.be.empty; + + expect(matrix[0]).to.equal(1); + expect(matrix[1]).to.equal(0); + expect(matrix[2]).to.equal(0); + expect(matrix[3]).to.equal(0); + expect(matrix[4]).to.equal(0); + expect(matrix[5]).to.equal(1); + expect(matrix[6]).to.equal(0); + expect(matrix[7]).to.equal(0); + expect(matrix[8]).to.equal(0); + expect(matrix[9]).to.equal(0); + expect(matrix[10]).to.equal(1); + expect(matrix[11]).to.equal(0); + expect(matrix[12]).to.equal(0); + expect(matrix[13]).to.equal(0); + expect(matrix[14]).to.equal(0); + expect(matrix[15]).to.equal(1); +} diff --git a/test/lib/pixi/core/Point.js b/test/lib/pixi/core/Point.js new file mode 100644 index 0000000..e5df07b --- /dev/null +++ b/test/lib/pixi/core/Point.js @@ -0,0 +1,10 @@ + +function pixi_core_Point_confirm(obj, x, y) { + var expect = chai.expect; + + expect(obj).to.be.an.instanceof(PIXI.Point); + expect(obj).to.respondTo('clone'); + + expect(obj).to.have.property('x', x); + expect(obj).to.have.property('y', y); +} diff --git a/test/lib/pixi/core/Rectangle.js b/test/lib/pixi/core/Rectangle.js new file mode 100644 index 0000000..23f0d12 --- /dev/null +++ b/test/lib/pixi/core/Rectangle.js @@ -0,0 +1,13 @@ + +function pixi_core_Rectangle_confirm(obj, x, y, width, height) { + var expect = chai.expect; + + expect(obj).to.be.an.instanceof(PIXI.Rectangle); + expect(obj).to.respondTo('clone'); + expect(obj).to.respondTo('contains'); + + expect(obj).to.have.property('x', x); + expect(obj).to.have.property('y', y); + expect(obj).to.have.property('width', width); + expect(obj).to.have.property('height', height); +} diff --git a/test/lib/pixi/display/DisplayObject.js b/test/lib/pixi/display/DisplayObject.js new file mode 100644 index 0000000..1388a7f --- /dev/null +++ b/test/lib/pixi/display/DisplayObject.js @@ -0,0 +1,43 @@ + +function pixi_display_DisplayObject_confirmNew(obj) { + var expect = chai.expect; + + expect(obj).to.be.an.instanceof(PIXI.DisplayObject); + expect(obj).to.respondTo('setInteractive'); + expect(obj).to.respondTo('addFilter'); + expect(obj).to.respondTo('removeFilter'); + expect(obj).to.respondTo('updateTransform'); + + expect(obj).to.have.property('last', obj); + expect(obj).to.have.property('first', obj); + + expect(obj).to.contain.property('position'); + pixi_core_Point_confirm(obj.position, 0, 0); + expect(obj).to.contain.property('scale'); + pixi_core_Point_confirm(obj.scale, 1, 1); + expect(obj).to.contain.property('pivot'); + pixi_core_Point_confirm(obj.pivot, 0, 0); + + expect(obj).to.have.property('rotation', 0); + expect(obj).to.have.property('alpha', 1); + expect(obj).to.have.property('visible', true); + expect(obj).to.have.property('buttonMode', false); + expect(obj).to.have.property('parent', null); + expect(obj).to.have.property('worldAlpha', 1); + + expect(obj).to.have.property('hitArea'); + expect(obj).to.have.property('interactive'); // TODO: Have a better default value + expect('mask' in obj).to.be.true; // TODO: Have a better default value + expect(obj.mask).to.be.undefined; + + expect(obj).to.have.property('renderable'); + expect(obj).to.have.property('stage'); + + expect(obj).to.have.deep.property('worldTransform.length', 9); + pixi_core_Matrix_confirmNewMat3(obj.worldTransform); + expect(obj).to.have.deep.property('localTransform.length', 9); + pixi_core_Matrix_confirmNewMat3(obj.localTransform); + + expect(obj).to.have.deep.property('color.length', 0); + expect(obj).to.have.property('dynamic', true); +} diff --git a/test/lib/pixi/display/DisplayObjectContainer.js b/test/lib/pixi/display/DisplayObjectContainer.js new file mode 100644 index 0000000..085c59f --- /dev/null +++ b/test/lib/pixi/display/DisplayObjectContainer.js @@ -0,0 +1,16 @@ + +function pixi_display_DisplayObjectContainer_confirmNew(obj) { + var expect = chai.expect; + + pixi_display_DisplayObject_confirmNew(obj); + + expect(obj).to.be.an.instanceof(PIXI.DisplayObjectContainer); + expect(obj).to.respondTo('addChild'); + expect(obj).to.respondTo('addChildAt'); + expect(obj).to.respondTo('swapChildren'); + expect(obj).to.respondTo('getChildAt'); + expect(obj).to.respondTo('removeChild'); + expect(obj).to.respondTo('updateTransform'); + + expect(obj).to.have.deep.property('children.length', 0); +} diff --git a/test/lib/pixi/display/Sprite.js b/test/lib/pixi/display/Sprite.js new file mode 100644 index 0000000..cc7a2d6 --- /dev/null +++ b/test/lib/pixi/display/Sprite.js @@ -0,0 +1,28 @@ + +function pixi_display_Sprite_confirmNew(obj, done) { + var expect = chai.expect; + + pixi_display_DisplayObjectContainer_confirmNew(obj); + + expect(obj).to.be.an.instanceof(PIXI.Sprite); + expect(obj).to.respondTo('setTexture'); + expect(obj).to.respondTo('onTextureUpdate'); + + expect(obj).to.have.property('hitArea', null); + expect(obj).to.have.property('interactive', false); + expect(obj).to.have.property('renderable', true); + expect(obj).to.have.property('stage', null); + + expect(obj).to.have.property('anchor'); + pixi_core_Point_confirm(obj.anchor, 0, 0); + + expect(obj).to.have.property('blendMode', PIXI.blendModes.NORMAL); + expect(obj).to.have.property('width', 1); // TODO: is 1 expected + expect(obj).to.have.property('height', 1); // TODO: is 1 expected + + // FIXME: Just make this a boolean that is always there + expect(!!obj.updateFrame).to.equal(obj.texture.baseTexture.hasLoaded); + + expect(obj).to.have.property('texture'); + pixi_textures_Texture_confirmNew(obj.texture, done); +} diff --git a/test/lib/pixi/extras/Strip.js b/test/lib/pixi/extras/Strip.js new file mode 100644 index 0000000..8927a8a --- /dev/null +++ b/test/lib/pixi/extras/Strip.js @@ -0,0 +1,12 @@ + +function pixi_extras_Strip_confirmNew(obj) { + var expect = chai.expect; + + pixi_display_DisplayObjectContainer_confirmNew(obj); + + expect(obj).to.be.an.instanceof(PIXI.Strip); + expect(obj).to.respondTo('setTexture'); + expect(obj).to.respondTo('onTextureUpdate'); + + // TODO: Test properties +} diff --git a/test/lib/pixi/textures/Texture.js b/test/lib/pixi/textures/Texture.js new file mode 100644 index 0000000..d5867b6 --- /dev/null +++ b/test/lib/pixi/textures/Texture.js @@ -0,0 +1,31 @@ + +function pixi_textures_Texture_confirmNew(obj, done) { + var expect = chai.expect; + + function confirmFrameDone() { + pixi_core_Rectangle_confirm(obj.frame, 0, 0, obj.baseTexture.width, obj.baseTexture.height); + + expect(obj).to.have.property('width', obj.baseTexture.width); + expect(obj).to.have.property('height', obj.baseTexture.height); + done(); + } + + expect(obj).to.be.an.instanceof(PIXI.Texture); + pixi_utils_EventTarget_like(obj); + + expect(obj).to.have.property('baseTexture') + .and.to.be.an.instanceof(PIXI.BaseTexture); + + expect(obj).to.have.property('scope', obj); + + expect(obj).to.have.property('trim'); + pixi_core_Point_confirm(obj.trim, 0, 0); + + expect(obj).to.have.property('frame'); + if (obj.baseTexture.hasLoaded) { + confirmFrameDone(); + } else { + pixi_core_Rectangle_confirm(obj.frame, 0, 0, 1, 1); + obj.addEventListener('update', confirmFrameDone); + } +} diff --git a/test/lib/pixi/utils/EventTarget.js b/test/lib/pixi/utils/EventTarget.js new file mode 100644 index 0000000..7b1dcfa --- /dev/null +++ b/test/lib/pixi/utils/EventTarget.js @@ -0,0 +1,8 @@ + +function pixi_utils_EventTarget_like(obj) { + var expect = chai.expect; + + expect(obj).to.respondTo('addEventListener'); + expect(obj).to.respondTo('dispatchEvent'); + expect(obj).to.respondTo('removeEventListener'); +} diff --git a/test/lib/qunit-1.11.0.css b/test/lib/qunit-1.11.0.css deleted file mode 100644 index d7fc0c8..0000000 --- a/test/lib/qunit-1.11.0.css +++ /dev/null @@ -1,244 +0,0 @@ -/** - * QUnit v1.11.0 - A JavaScript Unit Testing Framework - * - * http://qunitjs.com - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -/** Font Family and Sizes */ - -#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { - font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; -} - -#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } -#qunit-tests { font-size: smaller; } - - -/** Resets */ - -#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { - margin: 0; - padding: 0; -} - - -/** Header */ - -#qunit-header { - padding: 0.5em 0 0.5em 1em; - - color: #8699a4; - background-color: #0d3349; - - font-size: 1.5em; - line-height: 1em; - font-weight: normal; - - border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-top-right-radius: 5px; - -webkit-border-top-left-radius: 5px; -} - -#qunit-header a { - text-decoration: none; - color: #c2ccd1; -} - -#qunit-header a:hover, -#qunit-header a:focus { - color: #fff; -} - -#qunit-testrunner-toolbar label { - display: inline-block; - padding: 0 .5em 0 .1em; -} - -#qunit-banner { - height: 5px; -} - -#qunit-testrunner-toolbar { - padding: 0.5em 0 0.5em 2em; - color: #5E740B; - background-color: #eee; - overflow: hidden; -} - -#qunit-userAgent { - padding: 0.5em 0 0.5em 2.5em; - background-color: #2b81af; - color: #fff; - text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; -} - -#qunit-modulefilter-container { - float: right; -} - -/** Tests: Pass/Fail */ - -#qunit-tests { - list-style-position: inside; -} - -#qunit-tests li { - padding: 0.4em 0.5em 0.4em 2.5em; - border-bottom: 1px solid #fff; - list-style-position: inside; -} - -#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { - display: none; -} - -#qunit-tests li strong { - cursor: pointer; -} - -#qunit-tests li a { - padding: 0.5em; - color: #c2ccd1; - text-decoration: none; -} -#qunit-tests li a:hover, -#qunit-tests li a:focus { - color: #000; -} - -#qunit-tests li .runtime { - float: right; - font-size: smaller; -} - -.qunit-assert-list { - margin-top: 0.5em; - padding: 0.5em; - - background-color: #fff; - - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.qunit-collapsed { - display: none; -} - -#qunit-tests table { - border-collapse: collapse; - margin-top: .2em; -} - -#qunit-tests th { - text-align: right; - vertical-align: top; - padding: 0 .5em 0 0; -} - -#qunit-tests td { - vertical-align: top; -} - -#qunit-tests pre { - margin: 0; - white-space: pre-wrap; - word-wrap: break-word; -} - -#qunit-tests del { - background-color: #e0f2be; - color: #374e0c; - text-decoration: none; -} - -#qunit-tests ins { - background-color: #ffcaca; - color: #500; - text-decoration: none; -} - -/*** Test Counts */ - -#qunit-tests b.counts { color: black; } -#qunit-tests b.passed { color: #5E740B; } -#qunit-tests b.failed { color: #710909; } - -#qunit-tests li li { - padding: 5px; - background-color: #fff; - border-bottom: none; - list-style-position: inside; -} - -/*** Passing Styles */ - -#qunit-tests li li.pass { - color: #3c510c; - background-color: #fff; - border-left: 10px solid #C6E746; -} - -#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } -#qunit-tests .pass .test-name { color: #366097; } - -#qunit-tests .pass .test-actual, -#qunit-tests .pass .test-expected { color: #999999; } - -#qunit-banner.qunit-pass { background-color: #C6E746; } - -/*** Failing Styles */ - -#qunit-tests li li.fail { - color: #710909; - background-color: #fff; - border-left: 10px solid #EE5757; - white-space: pre; -} - -#qunit-tests > li:last-child { - border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -webkit-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; -} - -#qunit-tests .fail { color: #000000; background-color: #EE5757; } -#qunit-tests .fail .test-name, -#qunit-tests .fail .module-name { color: #000000; } - -#qunit-tests .fail .test-actual { color: #EE5757; } -#qunit-tests .fail .test-expected { color: green; } - -#qunit-banner.qunit-fail { background-color: #EE5757; } - - -/** Result */ - -#qunit-testresult { - padding: 0.5em 0.5em 0.5em 2.5em; - - color: #2b81af; - background-color: #D2E0E6; - - border-bottom: 1px solid white; -} -#qunit-testresult .module-name { - font-weight: bold; -} - -/** Fixture */ - -#qunit-fixture { - position: absolute; - top: -10000px; - left: -10000px; - width: 1000px; - height: 1000px; -} diff --git a/test/lib/qunit-1.11.0.js b/test/lib/qunit-1.11.0.js deleted file mode 100644 index 302545f..0000000 --- a/test/lib/qunit-1.11.0.js +++ /dev/null @@ -1,2152 +0,0 @@ -/** - * QUnit v1.11.0 - A JavaScript Unit Testing Framework - * - * http://qunitjs.com - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -(function( window ) { - -var QUnit, - assert, - config, - onErrorFnPrev, - testId = 0, - fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - // Keep a local reference to Date (GH-283) - Date = window.Date, - defined = { - setTimeout: typeof window.setTimeout !== "undefined", - sessionStorage: (function() { - var x = "qunit-test-string"; - try { - sessionStorage.setItem( x, x ); - sessionStorage.removeItem( x ); - return true; - } catch( e ) { - return false; - } - }()) - }, - /** - * Provides a normalized error string, correcting an issue - * with IE 7 (and prior) where Error.prototype.toString is - * not properly implemented - * - * Based on http://es5.github.com/#x15.11.4.4 - * - * @param {String|Error} error - * @return {String} error message - */ - errorString = function( error ) { - var name, message, - errorString = error.toString(); - if ( errorString.substring( 0, 7 ) === "[object" ) { - name = error.name ? error.name.toString() : "Error"; - message = error.message ? error.message.toString() : ""; - if ( name && message ) { - return name + ": " + message; - } else if ( name ) { - return name; - } else if ( message ) { - return message; - } else { - return "Error"; - } - } else { - return errorString; - } - }, - /** - * Makes a clone of an object using only Array or Object as base, - * and copies over the own enumerable properties. - * - * @param {Object} obj - * @return {Object} New object with only the own properties (recursively). - */ - objectValues = function( obj ) { - // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. - /*jshint newcap: false */ - var key, val, - vals = QUnit.is( "array", obj ) ? [] : {}; - for ( key in obj ) { - if ( hasOwn.call( obj, key ) ) { - val = obj[key]; - vals[key] = val === Object(val) ? objectValues(val) : val; - } - } - return vals; - }; - -function Test( settings ) { - extend( this, settings ); - this.assertions = []; - this.testNumber = ++Test.count; -} - -Test.count = 0; - -Test.prototype = { - init: function() { - var a, b, li, - tests = id( "qunit-tests" ); - - if ( tests ) { - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml; - - // `a` initialized at top of scope - a = document.createElement( "a" ); - a.innerHTML = "Rerun"; - a.href = QUnit.url({ testNumber: this.testNumber }); - - li = document.createElement( "li" ); - li.appendChild( b ); - li.appendChild( a ); - li.className = "running"; - li.id = this.id = "qunit-test-output" + testId++; - - tests.appendChild( li ); - } - }, - setup: function() { - if ( this.module !== config.previousModule ) { - if ( config.previousModule ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.previousModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - config.previousModule = this.module; - config.moduleStats = { all: 0, bad: 0 }; - runLoggingCallbacks( "moduleStart", QUnit, { - name: this.module - }); - } else if ( config.autorun ) { - runLoggingCallbacks( "moduleStart", QUnit, { - name: this.module - }); - } - - config.current = this; - - this.testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, this.moduleTestEnvironment ); - - this.started = +new Date(); - runLoggingCallbacks( "testStart", QUnit, { - name: this.testName, - module: this.module - }); - - // allow utility functions to access the current test environment - // TODO why?? - QUnit.current_testEnvironment = this.testEnvironment; - - if ( !config.pollution ) { - saveGlobal(); - } - if ( config.notrycatch ) { - this.testEnvironment.setup.call( this.testEnvironment ); - return; - } - try { - this.testEnvironment.setup.call( this.testEnvironment ); - } catch( e ) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - }, - run: function() { - config.current = this; - - var running = id( "qunit-testresult" ); - - if ( running ) { - running.innerHTML = "Running:
" + this.nameHtml; - } - - if ( this.async ) { - QUnit.stop(); - } - - this.callbackStarted = +new Date(); - - if ( config.notrycatch ) { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - return; - } - - try { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - } catch( e ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - QUnit.start(); - } - } - }, - teardown: function() { - config.current = this; - if ( config.notrycatch ) { - if ( typeof this.callbackRuntime === "undefined" ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - } - this.testEnvironment.teardown.call( this.testEnvironment ); - return; - } else { - try { - this.testEnvironment.teardown.call( this.testEnvironment ); - } catch( e ) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - } - checkPollution(); - }, - finish: function() { - config.current = this; - if ( config.requireExpects && this.expected === null ) { - QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); - } else if ( this.expected !== null && this.expected !== this.assertions.length ) { - QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); - } else if ( this.expected === null && !this.assertions.length ) { - QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); - } - - var i, assertion, a, b, time, li, ol, - test = this, - good = 0, - bad = 0, - tests = id( "qunit-tests" ); - - this.runtime = +new Date() - this.started; - config.stats.all += this.assertions.length; - config.moduleStats.all += this.assertions.length; - - if ( tests ) { - ol = document.createElement( "ol" ); - ol.className = "qunit-assert-list"; - - for ( i = 0; i < this.assertions.length; i++ ) { - assertion = this.assertions[i]; - - li = document.createElement( "li" ); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" ); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - // store result when possible - if ( QUnit.config.reorder && defined.sessionStorage ) { - if ( bad ) { - sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad ); - } else { - sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName ); - } - } - - if ( bad === 0 ) { - addClass( ol, "qunit-collapsed" ); - } - - // `b` initialized at top of scope - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.parentNode.lastChild, - collapsed = hasClass( next, "qunit-collapsed" ); - ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); - }); - - addEvent(b, "dblclick", function( e ) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = QUnit.url({ testNumber: test.testNumber }); - } - }); - - // `time` initialized at top of scope - time = document.createElement( "span" ); - time.className = "runtime"; - time.innerHTML = this.runtime + " ms"; - - // `li` initialized at top of scope - li = id( this.id ); - li.className = bad ? "fail" : "pass"; - li.removeChild( li.firstChild ); - a = li.firstChild; - li.appendChild( b ); - li.appendChild( a ); - li.appendChild( time ); - li.appendChild( ol ); - - } else { - for ( i = 0; i < this.assertions.length; i++ ) { - if ( !this.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - runLoggingCallbacks( "testDone", QUnit, { - name: this.testName, - module: this.module, - failed: bad, - passed: this.assertions.length - bad, - total: this.assertions.length, - duration: this.runtime - }); - - QUnit.reset(); - - config.current = undefined; - }, - - queue: function() { - var bad, - test = this; - - synchronize(function() { - test.init(); - }); - function run() { - // each of these can by async - synchronize(function() { - test.setup(); - }); - synchronize(function() { - test.run(); - }); - synchronize(function() { - test.teardown(); - }); - synchronize(function() { - test.finish(); - }); - } - - // `bad` initialized at top of scope - // defer when previous test run passed, if storage is available - bad = QUnit.config.reorder && defined.sessionStorage && - +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName ); - - if ( bad ) { - run(); - } else { - synchronize( run, true ); - } - } -}; - -// Root QUnit object. -// `QUnit` initialized at top of scope -QUnit = { - - // call on start of module test to prepend name to all tests - module: function( name, testEnvironment ) { - config.currentModule = name; - config.currentModuleTestEnvironment = testEnvironment; - config.modules[name] = true; - }, - - asyncTest: function( testName, expected, callback ) { - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - QUnit.test( testName, expected, callback, true ); - }, - - test: function( testName, expected, callback, async ) { - var test, - nameHtml = "" + escapeText( testName ) + ""; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; - } - - test = new Test({ - nameHtml: nameHtml, - testName: testName, - expected: expected, - async: async, - callback: callback, - module: config.currentModule, - moduleTestEnvironment: config.currentModuleTestEnvironment, - stack: sourceFromStacktrace( 2 ) - }); - - if ( !validTest( test ) ) { - return; - } - - test.queue(); - }, - - // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. - expect: function( asserts ) { - if (arguments.length === 1) { - config.current.expected = asserts; - } else { - return config.current.expected; - } - }, - - start: function( count ) { - // QUnit hasn't been initialized yet. - // Note: RequireJS (et al) may delay onLoad - if ( config.semaphore === undefined ) { - QUnit.begin(function() { - // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first - setTimeout(function() { - QUnit.start( count ); - }); - }); - return; - } - - config.semaphore -= count || 1; - // don't start until equal number of stop-calls - if ( config.semaphore > 0 ) { - return; - } - // ignore if start is called more often then stop - if ( config.semaphore < 0 ) { - config.semaphore = 0; - QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); - return; - } - // A slight delay, to avoid any current callbacks - if ( defined.setTimeout ) { - window.setTimeout(function() { - if ( config.semaphore > 0 ) { - return; - } - if ( config.timeout ) { - clearTimeout( config.timeout ); - } - - config.blocking = false; - process( true ); - }, 13); - } else { - config.blocking = false; - process( true ); - } - }, - - stop: function( count ) { - config.semaphore += count || 1; - config.blocking = true; - - if ( config.testTimeout && defined.setTimeout ) { - clearTimeout( config.timeout ); - config.timeout = window.setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - config.semaphore = 1; - QUnit.start(); - }, config.testTimeout ); - } - } -}; - -// `assert` initialized at top of scope -// Asssert helpers -// All of these must either call QUnit.push() or manually do: -// - runLoggingCallbacks( "log", .. ); -// - config.current.assertions.push({ .. }); -// We attach it to the QUnit object *after* we expose the public API, -// otherwise `assert` will become a global variable in browsers (#341). -assert = { - /** - * Asserts rough true-ish result. - * @name ok - * @function - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function( result, msg ) { - if ( !config.current ) { - throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - result = !!result; - - var source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: msg - }; - - msg = escapeText( msg || (result ? "okay" : "failed" ) ); - msg = "" + msg + ""; - - if ( !result ) { - source = sourceFromStacktrace( 2 ); - if ( source ) { - details.source = source; - msg += "
Source:
" + escapeText( source ) + "
"; - } - } - runLoggingCallbacks( "log", QUnit, details ); - config.current.assertions.push({ - result: result, - message: msg - }); - }, - - /** - * Assert that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * @name equal - * @function - * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); - */ - equal: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected == actual, actual, expected, message ); - }, - - /** - * @name notEqual - * @function - */ - notEqual: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected != actual, actual, expected, message ); - }, - - /** - * @name propEqual - * @function - */ - propEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notPropEqual - * @function - */ - notPropEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name deepEqual - * @function - */ - deepEqual: function( actual, expected, message ) { - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notDeepEqual - * @function - */ - notDeepEqual: function( actual, expected, message ) { - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name strictEqual - * @function - */ - strictEqual: function( actual, expected, message ) { - QUnit.push( expected === actual, actual, expected, message ); - }, - - /** - * @name notStrictEqual - * @function - */ - notStrictEqual: function( actual, expected, message ) { - QUnit.push( expected !== actual, actual, expected, message ); - }, - - "throws": function( block, expected, message ) { - var actual, - expectedOutput = expected, - ok = false; - - // 'expected' is optional - if ( typeof expected === "string" ) { - message = expected; - expected = null; - } - - config.current.ignoreGlobalErrors = true; - try { - block.call( config.current.testEnvironment ); - } catch (e) { - actual = e; - } - config.current.ignoreGlobalErrors = false; - - if ( actual ) { - // we don't want to validate thrown error - if ( !expected ) { - ok = true; - expectedOutput = null; - // expected is a regexp - } else if ( QUnit.objectType( expected ) === "regexp" ) { - ok = expected.test( errorString( actual ) ); - // expected is a constructor - } else if ( actual instanceof expected ) { - ok = true; - // expected is a validation function which returns true is validation passed - } else if ( expected.call( {}, actual ) === true ) { - expectedOutput = null; - ok = true; - } - - QUnit.push( ok, actual, expectedOutput, message ); - } else { - QUnit.pushFailure( message, null, 'No exception was thrown.' ); - } - } -}; - -/** - * @deprecate since 1.8.0 - * Kept assertion helpers in root for backwards compatibility. - */ -extend( QUnit, assert ); - -/** - * @deprecated since 1.9.0 - * Kept root "raises()" for backwards compatibility. - * (Note that we don't introduce assert.raises). - */ -QUnit.raises = assert[ "throws" ]; - -/** - * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 - * Kept to avoid TypeErrors for undefined methods. - */ -QUnit.equals = function() { - QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" ); -}; -QUnit.same = function() { - QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" ); -}; - -// We want access to the constructor's prototype -(function() { - function F() {} - F.prototype = QUnit; - QUnit = new F(); - // Make F QUnit's constructor so that we can add to the prototype later - QUnit.constructor = F; -}()); - -/** - * Config object: Maintain internal state - * Later exposed as QUnit.config - * `config` initialized at top of scope - */ -config = { - // The queue of tests to run - queue: [], - - // block until document ready - blocking: true, - - // when enabled, show only failing tests - // gets persisted through sessionStorage and can be changed in UI via checkbox - hidepassed: false, - - // by default, run previously failed tests first - // very useful in combination with "Hide passed tests" checked - reorder: true, - - // by default, modify document.title when suite is done - altertitle: true, - - // when enabled, all tests must call expect() - requireExpects: false, - - // add checkboxes that are persisted in the query-string - // when enabled, the id is set to `true` as a `QUnit.config` property - urlConfig: [ - { - id: "noglobals", - label: "Check for Globals", - tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings." - }, - { - id: "notrycatch", - label: "No try-catch", - tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings." - } - ], - - // Set of all modules. - modules: {}, - - // logging callback queues - begin: [], - done: [], - log: [], - testStart: [], - testDone: [], - moduleStart: [], - moduleDone: [] -}; - -// Export global variables, unless an 'exports' object exists, -// in that case we assume we're in CommonJS (dealt with on the bottom of the script) -if ( typeof exports === "undefined" ) { - extend( window, QUnit ); - - // Expose QUnit object - window.QUnit = QUnit; -} - -// Initialize more QUnit.config and QUnit.urlParams -(function() { - var i, - location = window.location || { search: "", protocol: "file:" }, - params = location.search.slice( 1 ).split( "&" ), - length = params.length, - urlParams = {}, - current; - - if ( params[ 0 ] ) { - for ( i = 0; i < length; i++ ) { - current = params[ i ].split( "=" ); - current[ 0 ] = decodeURIComponent( current[ 0 ] ); - // allow just a key to turn on a flag, e.g., test.html?noglobals - current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; - urlParams[ current[ 0 ] ] = current[ 1 ]; - } - } - - QUnit.urlParams = urlParams; - - // String search anywhere in moduleName+testName - config.filter = urlParams.filter; - - // Exact match of the module name - config.module = urlParams.module; - - config.testNumber = parseInt( urlParams.testNumber, 10 ) || null; - - // Figure out if we're running the tests from a server or not - QUnit.isLocal = location.protocol === "file:"; -}()); - -// Extend QUnit object, -// these after set here because they should not be exposed as global functions -extend( QUnit, { - assert: assert, - - config: config, - - // Initialize the configuration options - init: function() { - extend( config, { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date(), - updateRate: 1000, - blocking: false, - autostart: true, - autorun: false, - filter: "", - queue: [], - semaphore: 1 - }); - - var tests, banner, result, - qunit = id( "qunit" ); - - if ( qunit ) { - qunit.innerHTML = - "

" + escapeText( document.title ) + "

" + - "

" + - "
" + - "

" + - "
    "; - } - - tests = id( "qunit-tests" ); - banner = id( "qunit-banner" ); - result = id( "qunit-testresult" ); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - - if ( tests ) { - result = document.createElement( "p" ); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests ); - result.innerHTML = "Running...
     "; - } - }, - - // Resets the test setup. Useful for tests that modify the DOM. - reset: function() { - var fixture = id( "qunit-fixture" ); - if ( fixture ) { - fixture.innerHTML = config.fixture; - } - }, - - // Trigger an event on an element. - // @example triggerEvent( document.body, "click" ); - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent( "MouseEvents" ); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - - elem.dispatchEvent( event ); - } else if ( elem.fireEvent ) { - elem.fireEvent( "on" + type ); - } - }, - - // Safe object type checking - is: function( type, obj ) { - return QUnit.objectType( obj ) === type; - }, - - objectType: function( obj ) { - if ( typeof obj === "undefined" ) { - return "undefined"; - // consider: typeof null === object - } - if ( obj === null ) { - return "null"; - } - - var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), - type = match && match[1] || ""; - - switch ( type ) { - case "Number": - if ( isNaN(obj) ) { - return "nan"; - } - return "number"; - case "String": - case "Boolean": - case "Array": - case "Date": - case "RegExp": - case "Function": - return type.toLowerCase(); - } - if ( typeof obj === "object" ) { - return "object"; - } - return undefined; - }, - - push: function( result, actual, expected, message ) { - if ( !config.current ) { - throw new Error( "assertion outside test context, was " + sourceFromStacktrace() ); - } - - var output, source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: message, - actual: actual, - expected: expected - }; - - message = escapeText( message ) || ( result ? "okay" : "failed" ); - message = "" + message + ""; - output = message; - - if ( !result ) { - expected = escapeText( QUnit.jsDump.parse(expected) ); - actual = escapeText( QUnit.jsDump.parse(actual) ); - output += ""; - - if ( actual !== expected ) { - output += ""; - output += ""; - } - - source = sourceFromStacktrace(); - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
    Expected:
    " + expected + "
    Result:
    " + actual + "
    Diff:
    " + QUnit.diff( expected, actual ) + "
    Source:
    " + escapeText( source ) + "
    "; - } - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: !!result, - message: output - }); - }, - - pushFailure: function( message, source, actual ) { - if ( !config.current ) { - throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - - var output, - details = { - module: config.current.module, - name: config.current.testName, - result: false, - message: message - }; - - message = escapeText( message ) || "error"; - message = "" + message + ""; - output = message; - - output += ""; - - if ( actual ) { - output += ""; - } - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
    Result:
    " + escapeText( actual ) + "
    Source:
    " + escapeText( source ) + "
    "; - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: false, - message: output - }); - }, - - url: function( params ) { - params = extend( extend( {}, QUnit.urlParams ), params ); - var key, - querystring = "?"; - - for ( key in params ) { - if ( !hasOwn.call( params, key ) ) { - continue; - } - querystring += encodeURIComponent( key ) + "=" + - encodeURIComponent( params[ key ] ) + "&"; - } - return window.location.protocol + "//" + window.location.host + - window.location.pathname + querystring.slice( 0, -1 ); - }, - - extend: extend, - id: id, - addEvent: addEvent - // load, equiv, jsDump, diff: Attached later -}); - -/** - * @deprecated: Created for backwards compatibility with test runner that set the hook function - * into QUnit.{hook}, instead of invoking it and passing the hook function. - * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here. - * Doing this allows us to tell if the following methods have been overwritten on the actual - * QUnit object. - */ -extend( QUnit.constructor.prototype, { - - // Logging callbacks; all receive a single argument with the listed properties - // run test/logs.html for any related changes - begin: registerLoggingCallback( "begin" ), - - // done: { failed, passed, total, runtime } - done: registerLoggingCallback( "done" ), - - // log: { result, actual, expected, message } - log: registerLoggingCallback( "log" ), - - // testStart: { name } - testStart: registerLoggingCallback( "testStart" ), - - // testDone: { name, failed, passed, total, duration } - testDone: registerLoggingCallback( "testDone" ), - - // moduleStart: { name } - moduleStart: registerLoggingCallback( "moduleStart" ), - - // moduleDone: { name, failed, passed, total } - moduleDone: registerLoggingCallback( "moduleDone" ) -}); - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -QUnit.load = function() { - runLoggingCallbacks( "begin", QUnit, {} ); - - // Initialize the config, saving the execution queue - var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, - urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, - numModules = 0, - moduleFilterHtml = "", - urlConfigHtml = "", - oldconfig = extend( {}, config ); - - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - len = config.urlConfig.length; - - for ( i = 0; i < len; i++ ) { - val = config.urlConfig[i]; - if ( typeof val === "string" ) { - val = { - id: val, - label: val, - tooltip: "[no tooltip available]" - }; - } - config[ val.id ] = QUnit.urlParams[ val.id ]; - urlConfigHtml += ""; - } - - moduleFilterHtml += ""; - - // `userAgent` initialized at top of scope - userAgent = id( "qunit-userAgent" ); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - - // `banner` initialized at top of scope - banner = id( "qunit-header" ); - if ( banner ) { - banner.innerHTML = "" + banner.innerHTML + " "; - } - - // `toolbar` initialized at top of scope - toolbar = id( "qunit-testrunner-toolbar" ); - if ( toolbar ) { - // `filter` initialized at top of scope - filter = document.createElement( "input" ); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - - addEvent( filter, "click", function() { - var tmp, - ol = document.getElementById( "qunit-tests" ); - - if ( filter.checked ) { - ol.className = ol.className + " hidepass"; - } else { - tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; - ol.className = tmp.replace( / hidepass /, " " ); - } - if ( defined.sessionStorage ) { - if (filter.checked) { - sessionStorage.setItem( "qunit-filter-passed-tests", "true" ); - } else { - sessionStorage.removeItem( "qunit-filter-passed-tests" ); - } - } - }); - - if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) { - filter.checked = true; - // `ol` initialized at top of scope - ol = document.getElementById( "qunit-tests" ); - ol.className = ol.className + " hidepass"; - } - toolbar.appendChild( filter ); - - // `label` initialized at top of scope - label = document.createElement( "label" ); - label.setAttribute( "for", "qunit-filter-pass" ); - label.setAttribute( "title", "Only show tests and assertons that fail. Stored in sessionStorage." ); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - urlConfigCheckboxesContainer = document.createElement("span"); - urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; - urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); - // For oldIE support: - // * Add handlers to the individual elements instead of the container - // * Use "click" instead of "change" - // * Fallback from event.target to event.srcElement - addEvents( urlConfigCheckboxes, "click", function( event ) { - var params = {}, - target = event.target || event.srcElement; - params[ target.name ] = target.checked ? true : undefined; - window.location = QUnit.url( params ); - }); - toolbar.appendChild( urlConfigCheckboxesContainer ); - - if (numModules > 1) { - moduleFilter = document.createElement( 'span' ); - moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' ); - moduleFilter.innerHTML = moduleFilterHtml; - addEvent( moduleFilter.lastChild, "change", function() { - var selectBox = moduleFilter.getElementsByTagName("select")[0], - selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); - - window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } ); - }); - toolbar.appendChild(moduleFilter); - } - } - - // `main` initialized at top of scope - main = id( "qunit-fixture" ); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( config.autostart ) { - QUnit.start(); - } -}; - -addEvent( window, "load", QUnit.load ); - -// `onErrorFnPrev` initialized at top of scope -// Preserve other handlers -onErrorFnPrev = window.onerror; - -// Cover uncaught exceptions -// Returning true will surpress the default browser handler, -// returning false will let it run. -window.onerror = function ( error, filePath, linerNr ) { - var ret = false; - if ( onErrorFnPrev ) { - ret = onErrorFnPrev( error, filePath, linerNr ); - } - - // Treat return value as window.onerror itself does, - // Only do our handling if not surpressed. - if ( ret !== true ) { - if ( QUnit.config.current ) { - if ( QUnit.config.current.ignoreGlobalErrors ) { - return true; - } - QUnit.pushFailure( error, filePath + ":" + linerNr ); - } else { - QUnit.test( "global failure", extend( function() { - QUnit.pushFailure( error, filePath + ":" + linerNr ); - }, { validTest: validTest } ) ); - } - return false; - } - - return ret; -}; - -function done() { - config.autorun = true; - - // Log the last module results - if ( config.currentModule ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.currentModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - - var i, key, - banner = id( "qunit-banner" ), - tests = id( "qunit-tests" ), - runtime = +new Date() - config.started, - passed = config.stats.all - config.stats.bad, - html = [ - "Tests completed in ", - runtime, - " milliseconds.
    ", - "", - passed, - " assertions of ", - config.stats.all, - " passed, ", - config.stats.bad, - " failed." - ].join( "" ); - - if ( banner ) { - banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" ); - } - - if ( tests ) { - id( "qunit-testresult" ).innerHTML = html; - } - - if ( config.altertitle && typeof document !== "undefined" && document.title ) { - // show ✖ for good, ✔ for bad suite result in title - // use escape sequences in case file gets loaded with non-utf-8-charset - document.title = [ - ( config.stats.bad ? "\u2716" : "\u2714" ), - document.title.replace( /^[\u2714\u2716] /i, "" ) - ].join( " " ); - } - - // clear own sessionStorage items if all tests passed - if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { - // `key` & `i` initialized at top of scope - for ( i = 0; i < sessionStorage.length; i++ ) { - key = sessionStorage.key( i++ ); - if ( key.indexOf( "qunit-test-" ) === 0 ) { - sessionStorage.removeItem( key ); - } - } - } - - // scroll back to top to show results - if ( window.scrollTo ) { - window.scrollTo(0, 0); - } - - runLoggingCallbacks( "done", QUnit, { - failed: config.stats.bad, - passed: passed, - total: config.stats.all, - runtime: runtime - }); -} - -/** @return Boolean: true if this test should be ran */ -function validTest( test ) { - var include, - filter = config.filter && config.filter.toLowerCase(), - module = config.module && config.module.toLowerCase(), - fullName = (test.module + ": " + test.testName).toLowerCase(); - - // Internally-generated tests are always valid - if ( test.callback && test.callback.validTest === validTest ) { - delete test.callback.validTest; - return true; - } - - if ( config.testNumber ) { - return test.testNumber === config.testNumber; - } - - if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) { - return false; - } - - if ( !filter ) { - return true; - } - - include = filter.charAt( 0 ) !== "!"; - if ( !include ) { - filter = filter.slice( 1 ); - } - - // If the filter matches, we need to honour include - if ( fullName.indexOf( filter ) !== -1 ) { - return include; - } - - // Otherwise, do the opposite - return !include; -} - -// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) -// Later Safari and IE10 are supposed to support error.stack as well -// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack -function extractStacktrace( e, offset ) { - offset = offset === undefined ? 3 : offset; - - var stack, include, i; - - if ( e.stacktrace ) { - // Opera - return e.stacktrace.split( "\n" )[ offset + 3 ]; - } else if ( e.stack ) { - // Firefox, Chrome - stack = e.stack.split( "\n" ); - if (/^error$/i.test( stack[0] ) ) { - stack.shift(); - } - if ( fileName ) { - include = []; - for ( i = offset; i < stack.length; i++ ) { - if ( stack[ i ].indexOf( fileName ) !== -1 ) { - break; - } - include.push( stack[ i ] ); - } - if ( include.length ) { - return include.join( "\n" ); - } - } - return stack[ offset ]; - } else if ( e.sourceURL ) { - // Safari, PhantomJS - // hopefully one day Safari provides actual stacktraces - // exclude useless self-reference for generated Error objects - if ( /qunit.js$/.test( e.sourceURL ) ) { - return; - } - // for actual exceptions, this is useful - return e.sourceURL + ":" + e.line; - } -} -function sourceFromStacktrace( offset ) { - try { - throw new Error(); - } catch ( e ) { - return extractStacktrace( e, offset ); - } -} - -/** - * Escape text for attribute or text content. - */ -function escapeText( s ) { - if ( !s ) { - return ""; - } - s = s + ""; - // Both single quotes and double quotes (for attributes) - return s.replace( /['"<>&]/g, function( s ) { - switch( s ) { - case '\'': - return '''; - case '"': - return '"'; - case '<': - return '<'; - case '>': - return '>'; - case '&': - return '&'; - } - }); -} - -function synchronize( callback, last ) { - config.queue.push( callback ); - - if ( config.autorun && !config.blocking ) { - process( last ); - } -} - -function process( last ) { - function next() { - process( last ); - } - var start = new Date().getTime(); - config.depth = config.depth ? config.depth + 1 : 1; - - while ( config.queue.length && !config.blocking ) { - if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { - config.queue.shift()(); - } else { - window.setTimeout( next, 13 ); - break; - } - } - config.depth--; - if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) { - done(); - } -} - -function saveGlobal() { - config.pollution = []; - - if ( config.noglobals ) { - for ( var key in window ) { - // in Opera sometimes DOM element ids show up here, ignore them - if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) { - continue; - } - config.pollution.push( key ); - } - } -} - -function checkPollution() { - var newGlobals, - deletedGlobals, - old = config.pollution; - - saveGlobal(); - - newGlobals = diff( config.pollution, old ); - if ( newGlobals.length > 0 ) { - QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); - } - - deletedGlobals = diff( old, config.pollution ); - if ( deletedGlobals.length > 0 ) { - QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); - } -} - -// returns a new Array with the elements that are in a but not in b -function diff( a, b ) { - var i, j, - result = a.slice(); - - for ( i = 0; i < result.length; i++ ) { - for ( j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { - result.splice( i, 1 ); - i--; - break; - } - } - } - return result; -} - -function extend( a, b ) { - for ( var prop in b ) { - if ( b[ prop ] === undefined ) { - delete a[ prop ]; - - // Avoid "Member not found" error in IE8 caused by setting window.constructor - } else if ( prop !== "constructor" || a !== window ) { - a[ prop ] = b[ prop ]; - } - } - - return a; -} - -/** - * @param {HTMLElement} elem - * @param {string} type - * @param {Function} fn - */ -function addEvent( elem, type, fn ) { - // Standards-based browsers - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - // IE - } else { - elem.attachEvent( "on" + type, fn ); - } -} - -/** - * @param {Array|NodeList} elems - * @param {string} type - * @param {Function} fn - */ -function addEvents( elems, type, fn ) { - var i = elems.length; - while ( i-- ) { - addEvent( elems[i], type, fn ); - } -} - -function hasClass( elem, name ) { - return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; -} - -function addClass( elem, name ) { - if ( !hasClass( elem, name ) ) { - elem.className += (elem.className ? " " : "") + name; - } -} - -function removeClass( elem, name ) { - var set = " " + elem.className + " "; - // Class name may appear multiple times - while ( set.indexOf(" " + name + " ") > -1 ) { - set = set.replace(" " + name + " " , " "); - } - // If possible, trim it for prettiness, but not neccecarily - elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set ); -} - -function id( name ) { - return !!( typeof document !== "undefined" && document && document.getElementById ) && - document.getElementById( name ); -} - -function registerLoggingCallback( key ) { - return function( callback ) { - config[key].push( callback ); - }; -} - -// Supports deprecated method of completely overwriting logging callbacks -function runLoggingCallbacks( key, scope, args ) { - var i, callbacks; - if ( QUnit.hasOwnProperty( key ) ) { - QUnit[ key ].call(scope, args ); - } else { - callbacks = config[ key ]; - for ( i = 0; i < callbacks.length; i++ ) { - callbacks[ i ].call( scope, args ); - } - } -} - -// Test for equality any JavaScript type. -// Author: Philippe Rathé -QUnit.equiv = (function() { - - // Call the o related callback with the given arguments. - function bindCallbacks( o, callbacks, args ) { - var prop = QUnit.objectType( o ); - if ( prop ) { - if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) { - return callbacks[ prop ].apply( callbacks, args ); - } else { - return callbacks[ prop ]; // or undefined - } - } - } - - // the real equiv function - var innerEquiv, - // stack to decide between skip/abort functions - callers = [], - // stack to avoiding loops from circular referencing - parents = [], - - getProto = Object.getPrototypeOf || function ( obj ) { - return obj.__proto__; - }, - callbacks = (function () { - - // for string, boolean, number and null - function useStrictEquality( b, a ) { - /*jshint eqeqeq:false */ - if ( b instanceof a.constructor || a instanceof b.constructor ) { - // to catch short annotaion VS 'new' annotation of a - // declaration - // e.g. var i = 1; - // var j = new Number(1); - return a == b; - } else { - return a === b; - } - } - - return { - "string": useStrictEquality, - "boolean": useStrictEquality, - "number": useStrictEquality, - "null": useStrictEquality, - "undefined": useStrictEquality, - - "nan": function( b ) { - return isNaN( b ); - }, - - "date": function( b, a ) { - return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp": function( b, a ) { - return QUnit.objectType( b ) === "regexp" && - // the regex itself - a.source === b.source && - // and its modifers - a.global === b.global && - // (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline && - a.sticky === b.sticky; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function": function() { - var caller = callers[callers.length - 1]; - return caller !== Object && typeof caller !== "undefined"; - }, - - "array": function( b, a ) { - var i, j, len, loop; - - // b could be an object literal here - if ( QUnit.objectType( b ) !== "array" ) { - return false; - } - - len = a.length; - if ( len !== b.length ) { - // safe and faster - return false; - } - - // track reference to avoid circular references - parents.push( a ); - for ( i = 0; i < len; i++ ) { - loop = false; - for ( j = 0; j < parents.length; j++ ) { - if ( parents[j] === a[i] ) { - loop = true;// dont rewalk array - } - } - if ( !loop && !innerEquiv(a[i], b[i]) ) { - parents.pop(); - return false; - } - } - parents.pop(); - return true; - }, - - "object": function( b, a ) { - var i, j, loop, - // Default to true - eq = true, - aProperties = [], - bProperties = []; - - // comparing constructors is more strict than using - // instanceof - if ( a.constructor !== b.constructor ) { - // Allow objects with no prototype to be equivalent to - // objects with Object as their constructor. - if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) || - ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) { - return false; - } - } - - // stack constructor before traversing properties - callers.push( a.constructor ); - // track reference to avoid circular references - parents.push( a ); - - for ( i in a ) { // be strict: don't ensures hasOwnProperty - // and go deep - loop = false; - for ( j = 0; j < parents.length; j++ ) { - if ( parents[j] === a[i] ) { - // don't go down the same path twice - loop = true; - } - } - aProperties.push(i); // collect a's properties - - if (!loop && !innerEquiv( a[i], b[i] ) ) { - eq = false; - break; - } - } - - callers.pop(); // unstack, we are done - parents.pop(); - - for ( i in b ) { - bProperties.push( i ); // collect b's properties - } - - // Ensures identical properties name - return eq && innerEquiv( aProperties.sort(), bProperties.sort() ); - } - }; - }()); - - innerEquiv = function() { // can take multiple arguments - var args = [].slice.apply( arguments ); - if ( args.length < 2 ) { - return true; // end transition - } - - return (function( a, b ) { - if ( a === b ) { - return true; // catch the most you can - } else if ( a === null || b === null || typeof a === "undefined" || - typeof b === "undefined" || - QUnit.objectType(a) !== QUnit.objectType(b) ) { - return false; // don't lose time with error prone cases - } else { - return bindCallbacks(a, callbacks, [ b, a ]); - } - - // apply transition with (1..n) arguments - }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) ); - }; - - return innerEquiv; -}()); - -/** - * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | - * http://flesler.blogspot.com Licensed under BSD - * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 - * - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { - function quote( str ) { - return '"' + str.toString().replace( /"/g, '\\"' ) + '"'; - } - function literal( o ) { - return o + ""; - } - function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); - if ( arr.join ) { - arr = arr.join( "," + s + inner ); - } - if ( !arr ) { - return pre + post; - } - return [ pre, inner + arr, base + post ].join(s); - } - function array( arr, stack ) { - var i = arr.length, ret = new Array(i); - this.up(); - while ( i-- ) { - ret[i] = this.parse( arr[i] , undefined , stack); - } - this.down(); - return join( "[", ret, "]" ); - } - - var reName = /^function (\w+)/, - jsDump = { - // type is used mostly internally, you can fix a (custom)type in advance - parse: function( obj, type, stack ) { - stack = stack || [ ]; - var inStack, res, - parser = this.parsers[ type || this.typeOf(obj) ]; - - type = typeof parser; - inStack = inArray( obj, stack ); - - if ( inStack !== -1 ) { - return "recursion(" + (inStack - stack.length) + ")"; - } - if ( type === "function" ) { - stack.push( obj ); - res = parser.call( this, obj, stack ); - stack.pop(); - return res; - } - return ( type === "string" ) ? parser : this.parsers.error; - }, - typeOf: function( obj ) { - var type; - if ( obj === null ) { - type = "null"; - } else if ( typeof obj === "undefined" ) { - type = "undefined"; - } else if ( QUnit.is( "regexp", obj) ) { - type = "regexp"; - } else if ( QUnit.is( "date", obj) ) { - type = "date"; - } else if ( QUnit.is( "function", obj) ) { - type = "function"; - } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) { - type = "window"; - } else if ( obj.nodeType === 9 ) { - type = "document"; - } else if ( obj.nodeType ) { - type = "node"; - } else if ( - // native arrays - toString.call( obj ) === "[object Array]" || - // NodeList objects - ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) - ) { - type = "array"; - } else if ( obj.constructor === Error.prototype.constructor ) { - type = "error"; - } else { - type = typeof obj; - } - return type; - }, - separator: function() { - return this.multiline ? this.HTML ? "
    " : "\n" : this.HTML ? " " : " "; - }, - // extra can be a number, shortcut for increasing-calling-decreasing - indent: function( extra ) { - if ( !this.multiline ) { - return ""; - } - var chr = this.indentChar; - if ( this.HTML ) { - chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); - } - return new Array( this._depth_ + (extra||0) ).join(chr); - }, - up: function( a ) { - this._depth_ += a || 1; - }, - down: function( a ) { - this._depth_ -= a || 1; - }, - setParser: function( name, parser ) { - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote: quote, - literal: literal, - join: join, - // - _depth_: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers: { - window: "[Window]", - document: "[Document]", - error: function(error) { - return "Error(\"" + error.message + "\")"; - }, - unknown: "[Unknown]", - "null": "null", - "undefined": "undefined", - "function": function( fn ) { - var ret = "function", - // functions never have name in IE - name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; - - if ( name ) { - ret += " " + name; - } - ret += "( "; - - ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" ); - return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" ); - }, - array: array, - nodelist: array, - "arguments": array, - object: function( map, stack ) { - var ret = [ ], keys, key, val, i; - QUnit.jsDump.up(); - keys = []; - for ( key in map ) { - keys.push( key ); - } - keys.sort(); - for ( i = 0; i < keys.length; i++ ) { - key = keys[ i ]; - val = map[ key ]; - ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) ); - } - QUnit.jsDump.down(); - return join( "{", ret, "}" ); - }, - node: function( node ) { - var len, i, val, - open = QUnit.jsDump.HTML ? "<" : "<", - close = QUnit.jsDump.HTML ? ">" : ">", - tag = node.nodeName.toLowerCase(), - ret = open + tag, - attrs = node.attributes; - - if ( attrs ) { - for ( i = 0, len = attrs.length; i < len; i++ ) { - val = attrs[i].nodeValue; - // IE6 includes all attributes in .attributes, even ones not explicitly set. - // Those have values like undefined, null, 0, false, "" or "inherit". - if ( val && val !== "inherit" ) { - ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); - } - } - } - ret += close; - - // Show content of TextNode or CDATASection - if ( node.nodeType === 3 || node.nodeType === 4 ) { - ret += node.nodeValue; - } - - return ret + open + "/" + tag + close; - }, - // function calls it internally, it's the arguments part of the function - functionArgs: function( fn ) { - var args, - l = fn.length; - - if ( !l ) { - return ""; - } - - args = new Array(l); - while ( l-- ) { - // 97 is 'a' - args[l] = String.fromCharCode(97+l); - } - return " " + args.join( ", " ) + " "; - }, - // object calls it internally, the key part of an item in a map - key: quote, - // function calls it internally, it's the content of the function - functionCode: "[code]", - // node calls it internally, it's an html attribute value - attribute: quote, - string: quote, - date: quote, - regexp: literal, - number: literal, - "boolean": literal - }, - // if true, entities are escaped ( <, >, \t, space and \n ) - HTML: false, - // indentation unit - indentChar: " ", - // if true, items in a collection, are separated by a \n, else just a space. - multiline: true - }; - - return jsDump; -}()); - -// from jquery.js -function inArray( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; -} - -/* - * Javascript Diff Algorithm - * By John Resig (http://ejohn.org/) - * Modified by Chu Alan "sprite" - * - * Released under the MIT license. - * - * More Info: - * http://ejohn.org/projects/javascript-diff-algorithm/ - * - * Usage: QUnit.diff(expected, actual) - * - * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" - */ -QUnit.diff = (function() { - /*jshint eqeqeq:false, eqnull:true */ - function diff( o, n ) { - var i, - ns = {}, - os = {}; - - for ( i = 0; i < n.length; i++ ) { - if ( !hasOwn.call( ns, n[i] ) ) { - ns[ n[i] ] = { - rows: [], - o: null - }; - } - ns[ n[i] ].rows.push( i ); - } - - for ( i = 0; i < o.length; i++ ) { - if ( !hasOwn.call( os, o[i] ) ) { - os[ o[i] ] = { - rows: [], - n: null - }; - } - os[ o[i] ].rows.push( i ); - } - - for ( i in ns ) { - if ( !hasOwn.call( ns, i ) ) { - continue; - } - if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) { - n[ ns[i].rows[0] ] = { - text: n[ ns[i].rows[0] ], - row: os[i].rows[0] - }; - o[ os[i].rows[0] ] = { - text: o[ os[i].rows[0] ], - row: ns[i].rows[0] - }; - } - } - - for ( i = 0; i < n.length - 1; i++ ) { - if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null && - n[ i + 1 ] == o[ n[i].row + 1 ] ) { - - n[ i + 1 ] = { - text: n[ i + 1 ], - row: n[i].row + 1 - }; - o[ n[i].row + 1 ] = { - text: o[ n[i].row + 1 ], - row: i + 1 - }; - } - } - - for ( i = n.length - 1; i > 0; i-- ) { - if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && - n[ i - 1 ] == o[ n[i].row - 1 ]) { - - n[ i - 1 ] = { - text: n[ i - 1 ], - row: n[i].row - 1 - }; - o[ n[i].row - 1 ] = { - text: o[ n[i].row - 1 ], - row: i - 1 - }; - } - } - - return { - o: o, - n: n - }; - } - - return function( o, n ) { - o = o.replace( /\s+$/, "" ); - n = n.replace( /\s+$/, "" ); - - var i, pre, - str = "", - out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ), - oSpace = o.match(/\s+/g), - nSpace = n.match(/\s+/g); - - if ( oSpace == null ) { - oSpace = [ " " ]; - } - else { - oSpace.push( " " ); - } - - if ( nSpace == null ) { - nSpace = [ " " ]; - } - else { - nSpace.push( " " ); - } - - if ( out.n.length === 0 ) { - for ( i = 0; i < out.o.length; i++ ) { - str += "" + out.o[i] + oSpace[i] + ""; - } - } - else { - if ( out.n[0].text == null ) { - for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) { - str += "" + out.o[n] + oSpace[n] + ""; - } - } - - for ( i = 0; i < out.n.length; i++ ) { - if (out.n[i].text == null) { - str += "" + out.n[i] + nSpace[i] + ""; - } - else { - // `pre` initialized at top of scope - pre = ""; - - for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) { - pre += "" + out.o[n] + oSpace[n] + ""; - } - str += " " + out.n[i].text + nSpace[i] + pre; - } - } - } - - return str; - }; -}()); - -// for CommonJS enviroments, export everything -if ( typeof exports !== "undefined" ) { - extend( exports, QUnit ); -} - -// get at whatever the global object is, like window in browsers -}( (function() {return this;}.call()) )); diff --git a/test/lib/require.js b/test/lib/require.js deleted file mode 100644 index 987f865..0000000 --- a/test/lib/require.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - RequireJS 2.1.5 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. - Available via the MIT or new BSD license. - see: http://github.com/jrburke/requirejs for details -*/ -var requirejs,require,define; -(function(aa){function I(b){return"[object Function]"===L.call(b)}function J(b){return"[object Array]"===L.call(b)}function y(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(I(n)){if(this.events.error)try{e=i.execCb(c,n,b,e)}catch(d){a=d}else e=i.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=[this.map.id],a.requireType="define",v(this.error= -a)}else e=n;this.exports=e;if(this.map.isDefine&&!this.ignore&&(q[c]=e,l.onResourceLoad))l.onResourceLoad(i,this.map,this.depMaps);x(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=j(a.prefix);this.depMaps.push(d);t(d,"defined",u(this,function(e){var n,d;d=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,h= -i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,g,!0)})||""),e=j(a.prefix+"!"+d,this.map.parentMap),t(e,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(p,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else n=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=u(this, -function(a){this.inited=!0;this.error=a;a.requireModules=[b];G(p,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&x(a.map.id)});v(a)}),n.fromText=u(this,function(e,c){var d=a.name,g=j(d),C=O;c&&(e=c);C&&(O=!1);r(g);s(k.config,b)&&(k.config[d]=k.config[b]);try{l.exec(e)}catch(ca){return v(B("fromtexteval","fromText eval for "+b+" failed: "+ca,ca,[b]))}C&&(O=!0);this.depMaps.push(g);i.completeLoad(d);h([d],n)}),e.load(a.name,h,n,k)}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]= -this;this.enabling=this.enabled=!0;y(this.depMaps,u(this,function(a,b){var c,e;if("string"===typeof a){a=j(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;t(a,"defined",u(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&t(a,"error",this.errback)}c=a.id;e=p[c];!s(N,c)&&(e&&!e.enabled)&&i.enable(a,this)}));G(this.pluginMaps,u(this,function(a){var b=m(p,a.id);b&&!b.enabled&&i.enable(a, -this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:k,contextName:b,registry:p,defined:q,urlFetched:U,defQueue:H,Module:Z,makeModuleMap:j,nextTick:l.nextTick,onError:v,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=k.pkgs,c=k.shim,e={paths:!0,config:!0,map:!0};G(a,function(a,b){e[b]? -"map"===b?(k.map||(k.map={}),R(k[b],a,!0,!0)):R(k[b],a,!0):k[b]=a});a.shim&&(G(a.shim,function(a,b){J(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);c[b]=a}),k.shim=c);a.packages&&(y(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ja,"").replace(ea,"")}}),k.pkgs=b);G(p,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=j(b))});if(a.deps||a.callback)i.require(a.deps||[], -a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(aa,arguments));return b||a.exports&&ba(a.exports)}},makeRequire:function(a,f){function d(e,c,h){var g,k;f.enableBuildCallback&&(c&&I(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(I(c))return v(B("requireargs","Invalid require call"),h);if(a&&s(N,e))return N[e](p[a.id]);if(l.get)return l.get(i,e,a,d);g=j(e,a,!1,!0);g=g.id;return!s(q,g)?v(B("notloaded",'Module name "'+g+'" has not been loaded yet for context: '+ -b+(a?"":". Use require([])"))):q[g]}L();i.nextTick(function(){L();k=r(j(null,a));k.skipMap=f.skipMap;k.init(e,c,h,{enabled:!0});D()});return d}f=f||{};R(d,{isBrowser:A,toUrl:function(b){var d,f=b.lastIndexOf("."),g=b.split("/")[0];if(-1!==f&&(!("."===g||".."===g)||1h.attachEvent.toString().indexOf("[native code"))&&!Y?(O=!0,h.attachEvent("onreadystatechange",b.onScriptLoad)):(h.addEventListener("load",b.onScriptLoad,!1),h.addEventListener("error",b.onScriptError,!1)),h.src=d,K=h,D?x.insertBefore(h,D):x.appendChild(h),K=null,h;if(da)try{importScripts(d),b.completeLoad(c)}catch(j){b.onError(B("importscripts","importScripts failed for "+c+" at "+d,j,[c]))}};A&&M(document.getElementsByTagName("script"),function(b){x||(x= -b.parentNode);if(t=b.getAttribute("data-main"))return r.baseUrl||(E=t.split("/"),Q=E.pop(),fa=E.length?E.join("/")+"/":"./",r.baseUrl=fa,t=Q),t=t.replace(ea,""),r.deps=r.deps?r.deps.concat(t):[t],!0});define=function(b,c,d){var l,h;"string"!==typeof b&&(d=c,c=b,b=null);J(c)||(d=c,c=[]);!c.length&&I(d)&&d.length&&(d.toString().replace(la,"").replace(ma,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c));if(O){if(!(l=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"), -function(b){if("interactive"===b.readyState)return P=b}),l=P;l&&(b||(b=l.getAttribute("data-requiremodule")),h=F[l.getAttribute("data-requirecontext")])}(h?h.defQueue:T).push([b,c,d])};define.amd={jQuery:!0};l.exec=function(b){return eval(b)};l(r)}})(this); diff --git a/test/lib/resemble.js b/test/lib/resemble.js new file mode 100644 index 0000000..1cb8c29 --- /dev/null +++ b/test/lib/resemble.js @@ -0,0 +1,535 @@ +/* +Author: James Cryer +Company: Huddle +Last updated date: 21 Feb 2013 +URL: https://github.com/Huddle/Resemble.js +*/ + +(function(_this){ + 'use strict'; + + _this['resemble'] = function( fileData ){ + + var data = {}; + var images = []; + var updateCallbackArray = []; + + var tolerance = { // between 0 and 255 + red: 16, + green: 16, + blue: 16, + minBrightness: 16, + maxBrightness: 240 + }; + + var ignoreAntialiasing = false; + var ignoreColors = false; + + function triggerDataUpdate(){ + var len = updateCallbackArray.length; + var i; + for(i=0;i tolerance.maxBrightness; + } + + function getHue(r,g,b){ + + r = r / 255; + g = g / 255; + b = b / 255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h; + var d; + + if (max == min){ + h = 0; // achromatic + } else{ + d = max - min; + switch(max){ + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + + return h; + } + + function isAntialiased(sourcePix, data, cacheSet, verticalPos, horizontalPos, width){ + var offset; + var targetPix; + var distance = 1; + var i; + var j; + var hasHighContrastSibling = 0; + var hasSiblingWithDifferentHue = 0; + var hasEquivilantSibling = 0; + + addHueInfo(sourcePix); + + for (i = distance*-1; i <= distance; i++){ + for (j = distance*-1; j <= distance; j++){ + + if(i===0 && j===0){ + // ignore source pixel + } else { + + offset = ((verticalPos+j)*width + (horizontalPos+i)) * 4; + targetPix = getPixelInfo(data, offset, cacheSet); + + if(targetPix === null){ + continue; + } + + addBrightnessInfo(targetPix); + addHueInfo(targetPix); + + if( isContrasting(sourcePix, targetPix) ){ + hasHighContrastSibling++; + } + + if( isRGBSame(sourcePix,targetPix) ){ + hasEquivilantSibling++; + } + + if( Math.abs(targetPix.h - sourcePix.h) > 0.3 ){ + hasSiblingWithDifferentHue++; + } + + if( hasSiblingWithDifferentHue > 1 || hasHighContrastSibling > 1){ + return true; + } + } + } + } + + if(hasEquivilantSibling < 2){ + return true; + } + + return false; + } + + function errorPixel(px, offset){ + px[offset] = 255; //r + px[offset + 1] = 0; //g + px[offset + 2] = 255; //b + px[offset + 3] = 255; //a + } + + function copyPixel(px, offset, data){ + px[offset] = data.r; //r + px[offset + 1] = data.g; //g + px[offset + 2] = data.b; //b + px[offset + 3] = 255; //a + } + + function copyGrayScalePixel(px, offset, data){ + px[offset] = data.brightness; //r + px[offset + 1] = data.brightness; //g + px[offset + 2] = data.brightness; //b + px[offset + 3] = 255; //a + } + + + function getPixelInfo(data, offset, cacheSet){ + var r; + var g; + var b; + var d; + + if(typeof data[offset] !== 'undefined'){ + r = data[offset]; + g = data[offset+1]; + b = data[offset+2]; + d = { + r: r, + g: g, + b: b + }; + + return d; + } else { + return null; + } + } + + function addBrightnessInfo(data){ + data.brightness = getBrightness(data.r,data.g,data.b); // 'corrected' lightness + } + + function addHueInfo(data){ + data.h = getHue(data.r,data.g,data.b); + } + + function analyseImages(img1, img2, width, height){ + + var hiddenCanvas = document.createElement('canvas'); + + var data1 = img1.data; + var data2 = img2.data; + + hiddenCanvas.width = width; + hiddenCanvas.height = height; + + var context = hiddenCanvas.getContext('2d'); + var imgd = context.createImageData(width,height); + var targetPix = imgd.data; + + var mismatchCount = 0; + + var time = Date.now(); + + var skip; + + if( (width > 1200 || height > 1200) && ignoreAntialiasing){ + skip = 6; + } + + loop(height, width, function(verticalPos, horizontalPos){ + + if(skip){ // only skip if the image isn't small + if(verticalPos % skip === 0 || horizontalPos % skip === 0){ + return; + } + } + + var offset = (verticalPos*width + horizontalPos) * 4; + var pixel1 = getPixelInfo(data1, offset, 1); + var pixel2 = getPixelInfo(data2, offset, 2); + + if(pixel1 === null || pixel2 === null){ + return; + } + + if (ignoreColors){ + + addBrightnessInfo(pixel1); + addBrightnessInfo(pixel2); + + if( isPixelBrightnessSimilar(pixel1, pixel2) ){ + copyGrayScalePixel(targetPix, offset, pixel2); + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + return; + } + + if( isRGBSimilar(pixel1, pixel2) ){ + copyPixel(targetPix, offset, pixel2); + + } else if( ignoreAntialiasing && ( + addBrightnessInfo(pixel1), // jit pixel info augmentation looks a little weird, sorry. + addBrightnessInfo(pixel2), + isAntialiased(pixel1, data1, 1, verticalPos, horizontalPos, width) || + isAntialiased(pixel2, data2, 2, verticalPos, horizontalPos, width) + )){ + + if( isPixelBrightnessSimilar(pixel1, pixel2) ){ + copyGrayScalePixel(targetPix, offset, pixel2); + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + } else { + errorPixel(targetPix, offset); + mismatchCount++; + } + + }); + + data.misMatchPercentage = (mismatchCount / (height*width) * 100).toFixed(2); + data.analysisTime = Date.now() - time; + + data.getImageDataUrl = function(text){ + var barHeight = 0; + + if(text){ + barHeight = addLabel(text,context,hiddenCanvas); + } + + context.putImageData(imgd, 0, barHeight); + + return hiddenCanvas.toDataURL("image/png"); + }; + } + + function addLabel(text, context, hiddenCanvas){ + var textPadding = 2; + + context.font = '12px sans-serif'; + + var textWidth = context.measureText(text).width + textPadding*2; + var barHeight = 22; + + if(textWidth > hiddenCanvas.width){ + hiddenCanvas.width = textWidth; + } + + hiddenCanvas.height += barHeight; + + context.fillStyle = "#666"; + context.fillRect(0,0,hiddenCanvas.width,barHeight -4); + context.fillStyle = "#fff"; + context.fillRect(0,barHeight -4,hiddenCanvas.width, 4); + + context.fillStyle = "#fff"; + context.textBaseline = "top"; + context.font = '12px sans-serif'; + context.fillText(text, textPadding, 1); + + return barHeight; + } + + function normalise(img, w, h){ + var c; + var context; + + if(img.height < h || img.width < w){ + c = document.createElement('canvas'); + c.width = w; + c.height = h; + context = c.getContext('2d'); + context.putImageData(img, 0, 0); + return context.getImageData(0, 0, w, h); + } + + return img; + } + + function compare(one, two){ + + function onceWeHaveBoth(){ + var width; + var height; + if(images.length === 2){ + width = images[0].width > images[1].width ? images[0].width : images[1].width; + height = images[0].height > images[1].height ? images[0].height : images[1].height; + + if( (images[0].width === images[1].width) && (images[0].height === images[1].height) ){ + data.isSameDimensions = true; + } else { + data.isSameDimensions = false; + } + + analyseImages( normalise(images[0],width, height), normalise(images[1],width, height), width, height); + + triggerDataUpdate(); + } + } + + images = []; + loadImageData(one, onceWeHaveBoth); + loadImageData(two, onceWeHaveBoth); + } + + function getCompareApi(param){ + + var secondFileData, + hasMethod = typeof param === 'function'; + + if( !hasMethod ){ + // assume it's file data + secondFileData = param; + } + + var self = { + ignoreNothing: function(){ + + tolerance.red = 16; + tolerance.green = 16; + tolerance.blue = 16; + tolerance.minBrightness = 16; + tolerance.maxBrightness = 240; + + ignoreAntialiasing = false; + ignoreColors = false; + + if(hasMethod) { param(); } + return self; + }, + ignoreAntialiasing: function(){ + + tolerance.red = 32; + tolerance.green = 32; + tolerance.blue = 32; + tolerance.minBrightness = 64; + tolerance.maxBrightness = 96; + + ignoreAntialiasing = true; + ignoreColors = false; + + if(hasMethod) { param(); } + return self; + }, + ignoreColors: function(){ + + tolerance.minBrightness = 16; + tolerance.maxBrightness = 240; + + ignoreAntialiasing = false; + ignoreColors = true; + + if(hasMethod) { param(); } + return self; + }, + onComplete: function( callback ){ + + updateCallbackArray.push(callback); + + var wrapper = function(){ + compare(fileData, secondFileData); + }; + + wrapper(); + + return getCompareApi(wrapper); + } + }; + + return self; + } + + return { + onComplete: function( callback ){ + updateCallbackArray.push(callback); + loadImageData(fileData, function(imageData, width, height){ + parseImage(imageData.data, width, height); + }); + }, + compareTo: function(secondFileData){ + return getCompareApi(secondFileData); + } + }; + + }; +}(this)); \ No newline at end of file diff --git a/test/testsuite.js b/test/testsuite.js deleted file mode 100644 index b486acb..0000000 --- a/test/testsuite.js +++ /dev/null @@ -1,36 +0,0 @@ -requirejs.config({ - baseUrl: '/test/unit/' -}); - -define(function(require) { - var testModules = [ - 'Pixi', - 'Point', - 'Rectangle', - 'DisplayObject', - 'DisplayObjectContainer', - 'Sprite', - 'MovieClip', - 'InteractionManager', - 'Stage', - 'utils/Utils', - 'utils/EventTarget', - 'utils/Matrix', - 'utils/Detector', - 'renderers/WebGLShaders', - 'renderers/WebGLRenderer', - 'renderers/WebGLBatch', - 'renderers/CanvasRenderer', - 'extras/Strip', - 'extras/Rope', - 'textures/BaseTexture', - 'textures/Texture', - 'loaders/SpriteSheetLoader', - 'loaders/AssetLoader' - ]; - - // Resolve all testModules and then start the Test Runner. - require(testModules, function() { - QUnit.start(); - }); -}); \ No newline at end of file diff --git a/test/textures/SpriteSheet-Aliens.png b/test/textures/SpriteSheet-Aliens.png new file mode 100644 index 0000000000000000000000000000000000000000..210acb152983453d43aa2af40ce80aff7954a3fd GIT binary patch literal 145880 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

    ohRumMi#4|D9WPWyzBZsGG%r77i1eNk~N+NP) zBBSIF@qEgA|AWVGy2_qt-@Q0dH^rsz30C6xjBW8tLB&%Y^+=T|0M8ytSz3UP{oB9d zEwB1j+KaQ)C!Zim8YojFiJKWzGG0Q-fOV(82^9u(m*$xn{~=%c%C|W*KJ!4OQoIlN z*st95YBq1ZhEo4V@NjtF-82^V5rlnsXOSwvdrP4(#Ng=52+K9T_uyCfy_?@h8Yh&i zilCIW`P+3slFES3c+W>4`fAcRb;SQ^>%uSJRdn8eEKS{i^!Nb4T1TN&WaZis28RcU zqL4UASeRR6c6ye@g$B+!wAS-VsvjWyZBob|KKjPr z=zuhJSntqMQi=i!QO0HHb`$E2Oyx)A?nUIOevdC8rMOQk^?yq#?t19@i`|L(or@EB zLtOSAqwxHaPsImaBF;zJqLMN?ZS+j_fnWY4m!E$fX_|t_xada?{)kR@4y8iClO`?V z&I0A~YP2rWYK#$8HuBle-@@$C$y=f*x}y^(w|?LQA7-Gu2(pAyhQ`8vgfeJdL`a4A zmLTk7&4z0rFnDLtM)TzJ5Af+*ev>_8+Zu72&I>8(QuDBfFFf>>)yiHu76;$z5{C$R8SxYYuVl3Cahe2DdnL}*q#))5NNIW z)|dZ`pFHvX-+f}?{!e)6#ZSJNCZ~?@&mkN5`n}3aafM6Mci7ZlB9vG|X3#bxq}(Q? zxL0d^m-qg;C*FGb&s}8YqVGSx+S>F+=lw5x=g-HZ{Lh@2UT_eCSSopslJYasxjP@Z z{-Tpc^Ff~sAM$}OB_5atc;m;`-gjj3;G5GlS@vwtE`}v64I*Vgl4so#O}Vn3YX2sx zLz|F+=JD^}&g^WxU8>aX|LlMN`&}P+`&B!({q&I+U-QNrS$Ed!Xw6>0{PcEOtqH8_ z5+{o&6%v+)aQ;{(r<7)CX@ULwclerK@uLTCNzzlt_UE@A|K+PKa4&H0IbZ%k!6Q}) zA&eB_=u>aMdj5a)`#*f$g@=Lv`m#G7{cld#^PTmtMDS7&n-HSvy-&RGhon$H7J~0S z@y1s?ed?D(7KmT*`NowqmB)ZH$X`j0#J9$o-A z_w4mgMNv3#VBd}{5B~VBXzajV;<$~M5S02T^^H)ft<0sTBuXh7i*wv_=QsJ`4{miP z2tWM5!_VzIwUth-lW~cY@k9U7e|dK~P1CPQrQWb%(^(9!JdH3c(eAXFug_ASIm(eE zhdFv=vO8CwInZboeBW|`-4CT{)T3=`G%S4 z`BmO|ky_hK5?i-vx+k%2yOesTQflv4Z@a(!|L3*edBYXDPz*+u6q}v18=Q0Nz4NO) zK2l0{qC(+0rS$jz>@(lpb!rQpTBp{jb!wejr`D-;YMolA)~R)BomwZ!`hNh68p^$N Sc%Wqf0000grQK{Zk-c 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 GHOb-pi_vXafxSt*kkvEw)Q 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%0DxRf_wfV-cu0rRImKHVeXNb+*5ohoY<=A= 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%0D0Mt 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

    paNms^0;(Mqqi}=(En?sv^uCJ>x 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

    pXaINcdt4>yfyd3A`i9 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%0A`R0 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 z zy_mVET?O?cu5@Q4fcr`9rpwMqDlN~R0wUf)M{BqR-{nc^(H#B5;PjAL@)>LjP%T7) zPNQOIc%iN6lg1sDpj!^07-_;$YdV^i3}A`Z8y!Y5Zri!a=}e+vP8UwUx}6nN$qE1O9<{?!ySlAO)l4 z;N`kxbe?>pl|~O~(g-i8(Z8dmqwidZ8wY#MEh#o8aadsn>@V^J5)pk806a4f;j6#3 z6qZIQ%P*)oXC5w$S?>AdcTli#=k!GMu2`~#Ps`}Vikc|G6wjI1^d>0E@xOa-?D8^Ie#a~Uc@M&?>3}eEgsxhYMQ*dr$g}HSUV7Fi~-Xu!hmESAV z6cMQ9bH+%K>H<0uHX6_I)?$#z#QyWEvuvIEc}?W?lsB&}x_vI%ihk4EB^NC)4;hCg z9V-^?1A(pX0@I`+Tq!Bb=MMc6jmNB|Wc8MSQZnPY11<=WqIyvJPML$u>qqi-cG3s> z`BHZ6tQWh+6t;|-o#aXjsQ_2Gi?yI4P0+o(~&Lc1H0cq%R*`g$?g8F(N|MDA$ zI+=u3NA^qpug-Kq{OmD?bp?mi+JD5)VeG~X@Op`mdi8{t(rL9?#TNPetZbTU__O30 zyj_&STQ-*D3#6pMRz9gxvYs!u$hqMvaI$u>*E=*)_Z|%xFiTVY9X!$Z&L$ZrT|+!j z%jljEopBsJP@@~n9%pKmK7b|Gy)|>(x>0^Gf8yI7WtWjP=vQ?eJLn|b!dH7TH5UuA9Y1M+N-ix{Yw^I0w!S(j7MrmR* zPv)|(0j-%%`l!eWx&k54y{Zl~%fFe|*!Y^NV=V{K$-X?$KrmM>43Nc{O{$CK{C>05B^ z{P9(jR8dO|?1kYgXOZ>?$Oz>eMF@xhALLXGC7_Ow%5U|B>Cw*>lrUV z@~Jl-2r!$yQt#6`t$gnqWI|o!n~V*F$=f%`o&BeL9fni(wiHHs>T}NaOXX;iRzvS~ zcUf7^H%X2GaAmPSy#Q&)SY|X~R!H^=gV&L-UzAvQM~!{Z)X1$g8M`ei@ks5pbgI^J z?RV$AB`xIU2eoBykhXwGUWlk3=K9Y*EyW5k>rf=kIMiP~mxE2kZ~Y5_V7xWRto9`D ziNj_-2X9`V{spF}s(q(h#lLecW{gnRiW?KA&=by4yX%_t-OU0czh!jqD~tRXH>p!l)^NiHE*qO1kQWm#5%Z&JTHYUxSCn9ji6zN}SZ)4mN=DNh=+7NR4 zgn3upnUm=$gHnlkgXheH=6Jk0kzU!iH`GMe#P{&#Ap;BMwPi;*6ScRNpvN^j-(-YK zHKM%B0wuzVsf0K3)*yAuOvqNUx#h)ZK#^o>ciUeXoqo6-(DXFttFqw3tdlR; zYYa1{JO()pZzQm z%NG@fAT|jiY%<=J7YUCW`Q>~2Sl-NLvnad2=VxjDrSke}t_bg_?$tU?kVMs5ZUJ9} z=kc~TPduCYmcLDk!c0mE%K3#YAG0Z_m60auETrb|pR+VK3u;g=odL=|6e!tmSe4{E zF)W%V(kJJax(G-g7i5|e*4tbJ3Q8IKOf3rTs~j=NCa9Oz(eAHw+DbqD1o&UV95Hj9 zIX1)F!+tEz#`wEq8Es51w}+;|1IQKK!0X*P-=$G{m45c@E3mTt{x#xtBt%cn)l9QX zJn&8=@fPH@GjZ^G`hq3Kt3>{+cU8mV;h!m|M1H))KS&~SvnsFLC>F^60Wh3BHs^w2 zzkJ5b2?E=4RPj=?B2MVaec+SwdcxslS#Q6M6YR|CMu>}!if=Mr8id*Sm~&equm59z zjDh`8x|UpNDqCKkl5lpaEhk1eTaQb^Sj~h*B{k6=nF!4Dv0P3umU5=N*r*{T&p!Z?+iQ9i;?9;t^}V}?Kx{DDm!@lIqxNavet81n>Wz=LUmD=WfzY> z-2Gao?6aO5pmsBJeNwvp!EW3Q9-W=xIfL2s(rYYJk22)*O6y`tcU13;<)-Fe;o$F; z&broH-FUlavNf-HaB$Gl*>2zpmjwTtY>|NH47vS`y#3v|ve|izvX9h2+21b4rvd|u znDpPK0*rl`-=07yxnz8qs=y+$9ef0gu>?LzT2#rv}oJ2dzP61jl`WW#q36R{(H zmUOoH*Wfr86Vu@1bl+PWD~;yiV-@wt>SyOH-{Q5fS$U=B4C?KxO$ucwk5>W(Kk9sG0b|o;l?_c1ugH_tc$C8IdIJf#Zrk9m zX4fDcqJI%rJI>4GdGh$a8`TI!t(f~?_9RxXIHQ`!lrslU3!9v76E5eI2XUo3pXgu2 zHz8U@J*%(Rtp0rErG+_bR+OhM_kcO`iSdmnxq4nHVPnxg)^x60EI-=wYA5u4et6l6 z^%d8jVcmN++gVBQE3t|&s1nCqk>z;cW25C5e8>09;7l7>8ELNBY$azY+3SB9W>NLk z-@xaBjL4$yb=#=N#U(E09InB~YjQeo%Zi=5>UzWWZQr#X2{vyKp9n;j|9;4z;}BE| zk^kyQ<`Ex)A;XqCcZ?e(5_S-8fwWA%P;{L!w3|RYmcJ=Ao0pfWhFGuP#xHz}ZRCUd zOZ-K1i^hN+?n zjs;)OH6!iJ=5-Ta%d^&()for``p9T@iFUbaBTc_tse}!esxSE2ig^MfoBbVmN_K=! zu=tSdA&~}`l%2g~?<371j?fF@npSIr>_cn{V`;BzJE6OkbK0sBHjz$e#wIh(G@o0T zrJs0xR$pB~Higw3mMyDcnYQZqzW*2N$c}4W=t=BpxzWS`@o$+{;!tyMM_(-%gea^Y z>c4SX?!!mV?@x0s6)CyoTSZm06aN4A!_1h=3-1z`$B}b?uc&&uNvMA zxhkvwLo4xAUS7)kM6!DD9kUfqN@p}pZ2>DCEY9ES_d$syX_+~nGARB)*SG%uC)a}6 zIKqPm(ncAbR`_KyT*KzIgFe?85%XG( zqiPpag%f1)gx<0hN!5CB6}ttaW73JgRYUJY$Vf-PdiJ$n!Cl_9JFo>;Y#K!l9$Pk- zxsMqa)|&}Gay~imQ#i9Qi^uBdu|3RqE_@#V@cs~TTNqmG@)9Q$?+I$JjWlyAnEmhw z&D~ilt7g8Sb;zx?_=U}GME&*d=9Tohm^q;^BOM}Am{X-^jN|fMU+j&$R$xghRo|XG zcV*a}<96Nl_>wM_w&zLr?+jdbaef@(R2BadcCe2=cGqfP)S6tvdtQ=f!`-0%jlsR8 z&DA!8jdBv||~F)K2oH|fX5_guK7SSIuSgSmKr zt`FmncuJS=R16z3REfS@s3Z-)f4@ozGNT@ubGQ#_`T9cbI5q243RjSo_l91%@Yq-_R9lh8i{5YN zz#+2~kF!l4{d;}f@b%0pqlj`lxO4`bE1Ts_J=4GvR-^3Li}bvyk_{ej>ppW&;FUgC^zGE;z}wm0 zQXhcL$zuPHskaP>s$aW@XUIWvXpnA@4oS(84nZ0Pl#mXQ6quoh?gr`Z2I&R~>244N zq(OS-<^130-1qssKkdDLvDUiQwXV&fe6?*LS+LrG;lkeD6m;w2=l^JVj$9GOj2-jA zU3Sk#?~Qa(|NKGrKRanTZF-wxax8*bU!s_mYLz-vne9Hf`o4Rxwda2Q+qt8nxzG$g z2~idsQZH%obItYWH5uBM}GEw=6C#r?Yc!#Qu`Aibw5YM%Z}elhnG>i4eK9bQLa zdhT(db2z;rhLXBz7G_@@8pPTtZGp;|U*0!VGJbbE-PM(_itXnYSJ91mB}y7~wI?-y zo{TJ-$wC&mxw~ifXN`Rp#KGUN5-g0wr&94|v-W9Zbu=D*QU14Ha-YJCc7L=|fA4nV z=&VUzAnEtB<)L6Jx>!_!7-y=%Jn?eN?>g1Q7dbf%aEN~@1mH|%_Qi~XahcpIa-ZU@ z_Xa2;$cc4~|ET|hbsEsCjY0sd*Fo<(c8B~!wpY5iK0?{oP(k+@rJXJKnBMFU7uPS^ zRk}NG4zKqb@hG3#^!S{pPz%KFRCmZl3FdBkPrrcleRv1@VQL|B<^(JY3kB_!H^>1&pR9f!e z+yz{##@U-DP)bJ7Ofp18ROZ$-3w!kV&rRPy{eq_L0H*t2^9l0FLT!usFmB%|^fcpU>B*jR?%RK691*U6{sHFT3ic;*$*)Rp%eS93Wp}qStZngIH zODE2a1+Q&17i~{WC+=B^K|RWgYX^6q5AG%-?`u#B^#pd`e{#1(pZxsAR#)uB`CDYusQ>Dt-u7l^wfBum$*k?V5p6es>UO3!wc*T} zd`w>a@>fhy>M7?Rl?tS`iXOI2h_g5O?Tzs6bmy;|)9adrD(173P^;6ZZ%GtpkR9@Y z$piYb=zU9xJAk8~9jU#lC1e+_+DrWQ4K~;#M^V9$#VVD&gqw<5J|k7v6QD0 zo?jQ=nKoeosT=dtNC(L%55X?6PeFO|asqU?*6j+=;^OPs;}dZy@+m3O)|2Q(Ddwzi zakLnw&1Jqwqtmx0?Np`ftJe)xf`_Z^DZNVK+K1&S4W<`c#(0|FQNP>h+L|BX7gV*+ zZWBcn2V2@L8ZDV1ZGQbk>J9fIWA~+47xGBwTEDsbvaMk_O3Mj2TH(f0`0Tw(wNnt3 zGh7<{^Gv+8EcoN8nOEa_ZDa_kD~{z9oZ>1}ZV+@YZ zmNjZ6r9*QZzABD8yV;LD+EsZ`d8w<9J(lK5TYG^boJR6<3d+_V@GaAVH2MM%Om{c+xgOY{ z2+hFeyh%upR$JBpmZh2GFQk`^nQecrd3gQH$YX)L0zR`LI8!b^SGV&hZ(fVvHZc}& z<4_IrApNt-bt19?shw=lA zc@`W!Pck;rMvzUCQrO4>tZI^nrWMNuTJ9M-0Wi~_gthh83|Ko8P7g;|(AL($!EtBB zI3Q$Cgt*pngi&B$>4fTiVS}uPi3jgXZLj&*hLfW=K;*>P@$t~{{Amb{v1aCA-v=B# z_x>M)AARB$N!;D1TDKam4NFN*MjxZrkP(u&2BpbM*R$;{O-@ij9#ZC*SXyL;FEXqB zQYslPxsu*mK+AzwpHDv~))Z)ARzH=f6|OTd6v5ZqDoy!YiFB%z;&b1`$7m6Y_|%2nUhT`Y4KX2=s9Va-v?EuVNx(%ta()I_S=!7ZP<3r z2di%2upNaQHjdejGf1*wh~6cQ@&n*MI^Lc#002^*MM?RFTmp%a;613%AdiLq>rM#7 z0obu#|Kz;CFkyU{N3p~6Szhve53K%1UVYZGH;014#2U@u_jE0XJ}jK=?Yr)<iTnW_k6rOP!2A}fd(f?3oidN7)6JfB%BCU=xU!TsUFl6|{%`cFLE5o=i^P=7g{C?fFVs36* zqn(25sk3^U2TD84I`_M5T0)8*6~`@lbek`aj{qx8fT6Cz?yZLuie<#88`YU0T9n-O zbPD-E(qPW!&CIDt1o?oo4Z3tTy@sWR`a0i#swkluyC~zkfOBG|)SC=4-gH3A?bR{~ zGL7#4>Nz)qLV!vk%(Yx0Q){&Hgokh)Bo~osdzea(*x-A<86{4_PzXkzTEVYL{=w)( zDOwIG!cax|aH{rPs%Mhg)gJzn6I4SzoJ{SMRKxIKx8G+qA20pCuvoM0sw4G}%qR?O z!o~Ed2f7wW4sEy^q!KzV3-TGChA@ziv?n4o=Czj|PpGwS;JUby!mP1VWFEVKD+9zIaOut1%av8=1_(i;lYp+_xKzgEpTb#WcP`%u zo%nNiyA+uwNM#XAur4*1jir-AqsIRKdYM{z0o+)bJS4J*KVVls!|h<6_weabM_+E# zpL@uxq5E;)1L|ug5kWjAn7L%ct&z~oN6uNzlV?(@i-1v8dA$j0s%t#`DDp`WLzKkR zk8BiHI1pQM$%H@n!IfsZa^zt-hPo*^fr*nN9ym1dNxwDZ>}&Yx&|K}|;;g@N+(0!|Y%GrL z*n)eYa9<2CeWqSWKs==z@B)+3e{r4p_w=eA?qYIzb5+4>>-Y0p9r6;7qFYa0ejo0?1|`j1m!LLH~ab80aj7_sLOR@e1<`LwzAL{9-OohHoiV#?#)ls%Nab|wqvph~Trf9IRkF*L% zd=e`j*V^66S2Nw`T5<^8c(>c@v|kvc{+8@IXcsLrnuwUyf3{DXl0?C|IXD@wDv-iA zc7M%smX3=pyq7v>;0|A&RHkY2+|M?N@oCbG5QU(oNZQ4B{O0f9L*THi@asH;d{8Gey97DpxUElOKMR(%VeE!cT}&jQt|ZvJX44XjIJp( z{bv^f?bl>uekv$7Bb*}CBh@0u!-*;PodW8w)-TFE;(V!Y_We%rLp~!fG9NE<2D6O9 zsRrEaxSmdxP;;7Rc$wSdg)_)FQ<~@B@V}byxf_jl-HP$`JTs+3NK-9znF3r z61%=UC|^r8avm{sF?~w(G9wN@?^b?dAzv9+Ls2)c+wV1yJI*(@r>A;br=PM#$Rky! zimd%0&h-#EQNUt%n*inS{#DWMU%!i%a<@pejyHj36Gv?5 zCGUq}t=|nIWnebA75EiOFZ|&;q;HxvCDmX*(in@}=F`2He%&mSwAcZr zJP#*ATaTj8rMLdeZ9`rH#zQZDoxDRo$y^>}7BH<@ZvdNiX_HEJ3ReAA?|H13GUF3q z9HJlDUZ;74ewqC-DDL|((vC!5yg3z-Xh^~}g)n^mIZi;$O4P+L8QfJvVdF}Lm$~XZ zI!T#}*%r5(5w|a49d#MUHd}X>^IgxQUG6I2>kM}=P%eS6+2!Wx<7=3`in)eb+)g8P zJ#IpsuU#TUBI;!Y1XwfWCKxl+Sz@i38M#JFThhNeXYFFaf-NHk1XGbN za<*7FsiIGpOEr02gIO**gIOBsZ^3+`IXyQsbAf=wp@U#&E0IPpBTORFK_c;{NM|sU zLYa_{1p|!+xI<2U>d7E&2Q4t>+Tc+q{6D=7E|meSCf@rBXAUV1foxC6 z6yYKYAJc#&h5Ah8=^IW>)IT_Xa2)a{K8ePd<9p|}UjlaMjsJS%DHFrz8 zc>|NfTzd?9xG}K~>7;x^(12e{keW@wB`=49HjFbhJgUeun`+KST325p3oy53Qs@zj z8UIiFclw@U9Mj0jD;*)1Xh2Nr)uh0xcwK9q+_Ruh-#m7L+D?&Du`lxfeEw7@#qmM_ z2x)FjEjizyfqi1Ct+n~&<<7C}%fRjjKLr7RWrUs@I$2Y)+Wo4kedu&;J>6(HfN0FH zf-7hI=zU^E6u!m2PP8}R=)KeXuh+16Pot4RcnpZwpOA|{NFoi>>RA;{^z9uEjA!f!I*fC}Yyjj5tuL!VHGPjP1keTA9p1$eTndp? zD@m(!wL_S!~Vj6ZA(^+hc$?S zxGfHZ9UG%F`n7q0w5JJAzgc+ji~Ls)JISBwLj0>S(~PJtXfDk~RzsS6uP-ReY>60b zoN`|ahPl@K+U{=Z0aTUJZ#ZyM&<$E+S$|xmK zCK)^hk%A9g)XOQnyD}BQGxBA`v4cTHv@}=Oi`t)aSJyV?Hd;7U0>uIN8etcnB_O>I zX~H<-kfnt*g%{&fRCpNFr*FF- zJwrnV!|-Qo0HDRsv{V|~^az3Rna(aKX*+iIe^=tZw*^KQ45pfr3#)rgbMtn#%T(70teo7*u;>%> z3FsOtJv~UsaGl4wlY*FDe^i@{CWXP+-kA}<&{pI58T;du(zw?^y>FW_pCs0NYcHM$ zc^P7nHeMlQ5emeP=G3zI5Kxqtw54JiEZ~nL{cbEpHI|9K2RsR293?;K)=zNdT^Sww zx=d>o@Wo- z2=V{y?f-1?@p)T-xB4Y=W!86I_D@jb(c$&o&RyBbEmMzSwmL~Pi{fI8F{|fOW@y@! zHoeVGjD7aA_XLSklrt~%lS?g1-6ZioD_ScKj*h;3pbPmS!P{Ik*vVG%aB=grimUZSyM@OB`uXzu1i12M7Kdr*~ICb`)}7zo}R2;x}=bZ{vd&Z~HBtcl{*z<1KS~ec=1guD=}-1o#f)AbFIKouv0G?FbiYpf{-x z0PxE&sFUfh1~W~!;l`)8zmJ9vi1NgZDA1M=an<$23>YE{IYd#-!u z+gM=~m6-Lwq4#lKVl!^)xFD-Q`Ak$|wj4TwZSup$cDp2eOE+$jXr^U*08v;ID0x2SHO*0;Eb*4M7C zDJ8uw_^=jYw36Q^^T|2OX9{J+2@RY!Hl58+Cy>k6*1cH_r=zw?w0FKH5PZ!m*huY@ zBLpwG5u6vv#FkRUrrD*$Z^(fJVt2XCJ~ib7yuW(4RxLjkMI~rN@33NYD^RoC)MFQ< zqyBffs_#9GqLyTRfN~rm_sD^IiI1$4{Y6*D8Um{thk&MKmHu=v2qT6FPl=alDsZP| z<8qVgB(B+__fT~wqi-OeMb=vS1%!wwIAtOM2I_go6#wLy9Ue?8=Vob8ZWHS%8a%x~ ztCuBG<|pA(6jPqkd!sTt<(~BCzWdLzo+Wa(sjzCTn5u(l7MjP904Fxjp^6`JVid}m zo3g=Sr<&at=y!k&aPp#a@kKT%U1eJ;5K#nXSWidq4xVJ`>c7Uu{} zgypG`Ot);T-iJcH+L+;)`N9h_#MDn~sPF=^lj+wms{*-)V0*KYQbnc{#!AnASi6>XYVz%J+mD5g)|NsH#2P*PI-s)*?*eQArL$xFHhN8AJF|{0Ho4pEhq} ztpu24c346YyU!as?*{%fK`qV?)ORcio=3BMW;ADTLOqXS2nS&8e2p`T?-fRkAzBKl z86IOxsv9;%p~&_svuu*5De=;tYW_^O2+9DT5p)HD)>UDYht6~i16Gl^#dO%fkc02? z&OU3X`c1e1MusT*rmDW^x~9f@kbJtNU?*~efnopYc$Mn_k%oejkfwOac8p}=ap0H!E4C($t zt|J(lYUt~l9^z<>d+RWirqj>5xsSSiSrqe^&BGgC>Xn$I{Ex$RrMo7iOKm6OIgyI2 zy0(33sdChEo8zekBdPss+CBY1K#H@weHtGbw~bP zr#?wWF3=z^J3P?{m?#+Z$r#m{ZJPH^VXc^}a#&ShX>2h%b@Tv@^9j(!(}f++l2VJKvKW>FUt6-)(vSRVWxT z#a22WuzyseDHpFR5w*l?~ogd8|tV?6)y!Q(X2XD~O#5Vqc zp@aAA)7L=fB!0CW4pcf0Cc`)HYt~n#qE6P<=FOv)R$jf!hBtcTXQ;YHFe_g$aJ3~J zjBOGSP8v2hNn?wkSd@tTB#CzE-ha0>BM~MKV)&*jBR27oY}cLo_h9r-N|;JWZylDC zYf@(d=4s0@%=q!-|0hmQN2*B`u$t^DS@|GY3}DQUTA9_!kM{QhL7R%vO6Jlu|9);t zN(mM!NTiQ44anb_h*gz?&y;Yf*S#U9wtl20&!Gg<$SP85X$6!9v%DB~P^ep;+~I|< zMcJ6~i<@s-5rZ`!UnD+#yq)@nO&&Nosz;DYL)JUC&&1iX<_WH7bk6AxU3X%bsT6!c zi*`W#Vrgy24&4g{gZ1ggXxVDS(qU1(?!5v;HC>)Y8pF>BlAu2p62y?#Jos|2bNsIA zXO*W{K0yk&1}&}2%(?HCKlsoE&d3b8H41@*dj!^1!)Aj!qbTm1bt z_0y+wf-=oykOv(@+hk49E&2x68=Jl_hFiW49(LUp4t!(^t13tK?X)lDx|&o$^c%Rv z4<1ZR+*K_Z>Gn9A)=YH1Ucc5=N{~{*^jJ6DKAC{Jm_EQvasZjLp(UgsP z&kI2op)`YBFl*^bsTBzpS;M?h@jBOQhu1suun%vGXi-v{q=EwMh&_31%aFLksPi_h zAKy1!lOC#eSOsF@K|HX-v}U!L90&XyKKShH*-<{Rq6Nw8#_6&ZU5uBNKv-iC>eIMM z(w70{?7v{zIG|zT?8kwAI_pQQkSYC*Ec8lb~g};dyJ{ zLes8TAx(|PMJ-7E{+v=c9TT&fK}wx6X-}~-ezSBSj&k!GX=d%7*Co%u@K8ERrZmty zCT98!P9o;G6wB>PKdPY5ZA7&(UrGzPVoru!qn-l3AP)p!p}9f+xxJzaTqs&97Wtej zjPBNL4A2FNz>YBi-rzAb)jmU@cC@|m14Plin13T>hXHYVluU$ueDoav;eNJ+U|$DR z`S~-M68Q197qU!V<*5VED%8g8cq15C<0nHiRkC^qY;6J!!@ICw!7Zk*l&PMCKl)}!nI_&@Wl6ujFD>;CSXrn+C zc4+HXv2cH{Q8DYhAG&UdaL)uJsC1b~bYfOVoxY$)DemG*WzsYpkBe4{QkdT6{mn~g zHXawkBsV@f9MeZvI*||)3=FVgi?j{*fWV$ZP3y< zgeooH=ZJcP%CK9c^L6L2Vl^v$LCS6uira)ep;uJdBrku`-6@!h{hiy(3xg24n{2h28EE z6FrcmU1R0?15KmwrIa+>s^?`d=X5`8YyH^%>?ZYU^lV#jbG7Z}-eMr6;H4ETQY@7dUC zj0!X1mg}@4uv0?Rw$h$c$sw8MxaGUKa}jw>+hW(aK=U$088|Ir-(jb0S;i56fDdb0 zWQdn?u(um8V3-$2j0(?<9P>HyFZ9s_@%Qp+fIRDKE6S8}Hc?zvcBPLDj0}cXq`35z z47m)&J-4y7Oq0teuDHKiiO$^)0d!KNzdM&PR*lL9?(EZR96h*Mu!q(Od1H{FU1&}# z_1nxl(P$37i|e63grZF=g5nkAt;)+Vm;VZAmp{cRJ(fM?^eoAvk?(ZPtu@Z6bIJDj zxYfgOl>W?C_*@@dBUYnNrtlqUcMH5+!rq4FS?E~%Zy6VPmYg}IJ*QDuY0C=h%;GrS z^S^EwsGlhYuselK8Aketd+fbL(puG|%HRpo6Wfx3mfU<#B^U^KA|jkzG8g8gyTh}u zlcVog57GT-P!|4AqTBz1(87U1qv)N42sb)xhdaKY{i$k^XbREm8RmM~giKg)MCLOXT-z0>iCbV12FyFfvijP(0=|E^O$ zy0lpv>;3kr|9&DCb5g(sn2+wf)NhNa9A}NZez=)?Rc*7Z!VRF4E#=UW=3qAvDqvz~ zpN?@IGB~F{+;mb5>AaUhGA6PLKj>lySDdkkY1oHqRC+ zdmJP5#rIb~nUo>14Z|Ca!`~NYGyWiyB#GXY5ej2&6OHm}ZUJ_ul<^dme53XX&UXn= zW41F)`YV$7ccIG#QnpzWs1SKmyu8h@Wkz(P(c|^@(D!l0;wAE_S=|DyPyJ6Pxz;d` z*E=au%87rL(0{yn4#P+$vr*S^i*kVp&;i?jKWpC9Jr15s45+&&U1 zlp#8XqS36=N2g7v#NpbAr5%VAGm+$@@d9}R3t^NyywBp}%vjXen-pR<8)B;1&gCI% zLt=Xx9W%gcVYJEm7e zUl2|z2R6Y7M?*(L0}RWmDJvSRzp3DkXX{uQQ)*fJm3XPb5~Z~xMg3_sv}oXJ^B1>k zEa!R_wCNX&;zeCNmR+;Aw>zrFuGy#OOFzHVIDO*w9!A?B!|`{Z`3I(DN?}9igkU#V zepjN5rnG%-28T^1N7p@v-w2m{RLY1LP_nCLe`EOLK;%4tWdvH_F)a5S;c6WPF5Cjo z`iBD@b*z$a8af!@DK^SnrP$j`5$1%4s6;^*Zy^m+vjo6 zev_>hZ_z${KnL>T;qhBX)5rJMMKW<X&*oilWAn2V~$V29C=y%>QOvx(X>!bi#k4xdGf=X=XDile%AJn&@02M z^m&fEN8PK=oT11E?O#Zf=l9^CEAXN$a6bAaL%$84B3zn5f*}cBAfG^)+^IT4x>kBG z@lvwo7S+p*yF=J0JDh&CZ@bU!|z>yQ1&FHA-iU2-Q2E_ zf_Y^mKpVFqAT3f*@&dmN6KFc? zu|6LTD#c$~n&LhewZR5~D}s`DeZQ?1E&6=(7F9cHoB7UJFlAIWV(r!33B5U6ecaY= z>zb4&Vy6eI8Pw?9HU0dvKS&s3OVa6SXAcaFApm>yx#6Ka%Z{a+QzO`dnan{jvd&SQ z8Vt6ksOgsHuWB>5;%K{~)nLtp2p$UH8Z!AG%=o2)0~MC#IFD5N09E=pSa)-$xa~*{ ztku(PCVV`1{=MEvNJFgEWZtf`0tUs|J; z1V1M&TTGU@j6hbokV<~?#P~360~)L-G4_Zw#Q$-n2q+_7}yu6 zgq}u(j~Ra!vlBzoo3fKa z?(g5WN@+-v(e3E_OEm0W3pruDp=S?MvBl+DnP-kMMf+`wErlM@$i7!}hW{+kFUA#t zWZydpn)NQ*grIHzIwM}30~#B*Ry~~beQk3pyru@49NeDt{7VnKeK5Ly{sC?5^`Kr~ z%(p663>6um)Q%7kFvb(ap|L;5&vPb^r;0L&3iu#mN#nqeHyC(kxiLoH|6z!~IFRs+ z*m&Nio(-h_G(zn)8xCKWIYG^`aImmDoulHK){ZU&VF*E}4{c-HKKMSu;my%Bnr25c zRhzbdKY9?mPX&OFH|Yu4jaI1eaMD)Wyj~$PaZ{}B$R*moBAq<$2Wi(3H-k+lyIMafe9R9x<>ke2E!Bn-lO;%V(qt%Q zVDA_aokx|fmkq7M50J(AK0^LbSF3LUKqW16f>?&*i=%& zE!rdnwUzh;$Lion_d_e{oMDCBTFdb3yNq ziO1NqHO?B)2KQL`tIqOnE2xQ|23;fpi)>Kko(WRddi-hu9C@(s$=1LjxccvDjK66GqjJbohF0sJ{=ioBomF_gcPLRU$A4TmCQX>x~ zdHxgKb6%>U-ZCb4_uy7N)DvUso!J!gQTb_zP5~Zja6*b!l6gQ1^FoXWle}_3etujn zKkMt-ZPWcLz5>VNIK*+{!J*7idO&D9VeC45$X#~r)Q}UZwneM20N`$7P|&oe)MRjA z6nS>I-7+_AWj0yi$5PJk#W+x(E+lK!v_5)bCr)aGZ{j*x(()qO4^Y&0ckr-EFWLO zt#xMuO4g#%I$Bir?}gcY+~fa@P3}ZuU6Bm0$31+FgI+IsBCBe!rFDcDg6_LlHI5O# zx!Pn%W*~TxTC(IaD#JbCOL?e-r{{H!D%4B7^YJVsg#Q(B>e?b~n$H8He!@U~)~JH( z*_<-8xhnCmlc33o0-E8C0wVyfF94L-0DAJiR_$K+)!F|>CbRsnQV9ys#`Y%ft%R?3pV08e6 zdmG3yVaHD+5bd6~(m}a%oSxVAox;;a{KwIU897O-@w{INDN}4pY6%9`qN$O?5S?Pw z{cPODOOH40Ukmo{=Z8Cx1DEM}KhkA9lG)+{so2k-#O*lZj=uRXPTWR-znxj|aL{Yr zWk{ROAidwGnEp`Ru3J@WwcqMh{qOrk&GjK|;+eajB@?~8iZzc>e*p=@3BXp;GqV6# zfE66XOT|SMu@?mkelNDJK6YFnVm9!IVWtY#52HRjW*yod%HdS;cQ#br03S0ArE$HbFrUe6 zoP!-J4k*S#@wQQr<_i@DUaw5Bpbe$NMNI8~90yP2hmU!fgTGjsXa*zk3&Et!rIU8+ zSNp%|!j|rs)3HAwaj9L@Lyn*o7|wCPdB<*V9rD#{^AT}gfPb-y-IW_Jdx1qwV@g(8 zll#fGx8xZ9b#xIv{t1mbKK{tjq^fPHImX^B+Td$U z!lVLNO*^voQ{!YA;gdeU_8pD;$9{YzY*in2GWFE%=czZ?i^ zG>4v7(t9|X9|3NT<4ckA4j>74Kyk5_twj(HycoRJW8_j5KPV9by&*VRdn7nn_vzaI z@`TqVvd6wXWDxApJ2}7?RbDjA1havhK~1Gnl+u{YbWX6tgH9AEKM;1MT8-{sqw^P) zqYS7+0ho_{YCUH7)~dtZgZM1Z)A>=N>F>SzFR370hg}jAt-FW)$p6*-4}}2SiI3sG zI~_bbo&ml2QUB)B8fB+R{QP?_`3SYWcI-?0Qwh`k(7+U$Y7;72Bm&EkiEQ~C#Q-h@ zllYbRmFBZ8`?KJb6q0DaN%)BAw<0^GDMICAE9&)MF92I_WK3#8>?mppW~DtcFQy5t zqk9Q~OlC!7sljAxwa^Ghs3f!6Gu129UARuxl0%xL>aQK4c8=?a1@$6@iV9|n=lNVZ zAC;rg zUn70y#betJ$sRgOOm`nT9+SaVCjn~UF6OX+;z{peDT8M5!5v(-_>_z!nlMs zPW0$}{uyeLHK$5IaqQ4Gii z+O;~za$P#w_LTGv=jMptH7V=gMU|q# zMH51~pJLxeLSv%T8i1uAU|6#IQMV7GT3>z$c)pNUO;0sun8zj>X9aZS093yWlZG6; zyq2Wv@mJO8_JDdSlsLQxBnAo?;&ygk-$NhFJg<*4v-VmV7JKPsz*e?dKVV2B<$1IP4*tQ*(Z1ij;+Qf|6+O9R3gHUCd&PwhgLr%hkm-Jqb+x6 zb+%$4yqA}bzpMQ1JN7nlB-j{Cer4ifPx$5Szy6_zQe0Sg^E&o@@?5!(gCL!oJj%BV zz{5w-sV9@PU{8B@vh=HY55*onieR%{4^pajrO2M@9|?84yLOu(W+Cy9N`nf_t*RB-Kr;02`TQ8 zsZt)})koj7AHDlElH>RnA%larn`hc5MHk+N2W{FJ$v;Y7a;o%Bq0CZO+%18ps49SK zD3eqLFY8H*X->bdH6CTmH2PB8q5=*7jF0zAEa*MBe>$3Co>;o@?0X7mgxo+a*N_E? zey^VY&)>hp1uTnU8!Jn#hhH7;Z7VbN54y}dTM&CQJ!JLGq>*;f`GZ*E?KqO+aW=sO zigdpx0fMfMguq79p+b(eKpc4wY1D34stih|OwJ$(BSk`a&(nLywJqvypwGR7MF#*n zk9oT=vU}QFzPbZVcAup6Bj@j5J-(*V(j?z*N;DK`OO3g371U4t;7|S~ z!80wvC7DIWS&#$CZVax~y=Ls$oYiC`sK}W)>cDJ6x4FDWtESB2YzQFD-8Ib;`kb%`553ajMJ>Hx&94l_u6$mEOPI(ac}ic z;2XL_F)=t6hEAdRD7yh(b4(74qLZGZ+J>w&9RN!U_(AYyZdJ{{G$*P5DKobfB*!Mp zSJ~97X;lSUDR(@FcxgUBeK4c}DFm8Nnzv)!i*UlkQ!Mzi<^Y`CcSrZVz3;h;z94g>-VtOlDM!;pEZIttF#9YKv@Lq4HWHV7ee6d|0khXNcegBZHPq*tQneQ1$f zgIbINlGN5YB*K#U6J^Y#Mc#}{uT)`lO9b)WJih3>&FV1m&3kK)yw;}0UWSy#_kYG~ zoC+L6x!f`|i#%QKL9FQgT5A-AO6Y9OzX5&3Mur1ky3qaIi)q#IMNpyKOb#ivIXSqq zbW8R!xaA_P!@Fi%B9o5?_p1JtYBNoufv0bS0ab2!&|_bt`yV{Es6IsrD9Mk10*kv; zW9mM>`JgMS_T(1C+}?a*>e=Lub?YqMbRbJyA}@80#rAHM$d@^p@w$9|q2?e?)?uwM zQ{F&>`1tkUnBCGhk3~EdGa*TDnZA zzG2@3&C%t?$acy2g%*}$)xeWM>dmxNBPsTQR=chY1hp2&If0H@b|bqfMLI!k!sQU- zbd0$87_Rnk^7_iRVf`stp(Ftj&JHWfmXef0ngjZ8h3Pr{||S40x6aK z4_7WcK|n+xcq7>X29O1zOOr4W?Z`L}4e-5?Ct*StWXB-UC;S<(<)P>`8WzB=Llxr` zOAu;kA(F4TuRs`*;9(X)hrk<3 zX=xko2gh+d#KP{cU}OOsrB8+Itt`DBBy;Tg3&cOF)ZPo7-aBL>_QT+>T`w!aXT zp~MkZ5{(EpTUtWAHkHq3ijC+0)XPihh+#$;9Lg9t16k@8Su>}>BMr%$lPF%8Bo3Y$ z%`;E5)9R&OOIj+H>Cs=-ijTm;2viE>W55OH)P#9|3bgwOEfe3i{R1EXoB&r)i=V)$ zvmtUakJ}iEG`scT#=jk3TMs2G8OibT7S~%449O@f2<>gowmDl;p6T}yeQj@5kn2VF zJDV^q(##fIa||!X)p)`3T*@uFXFHEWia`=Dyviulp9r!L3sqr0C66*al z^aDw_)tL_Z_oYpefu}s^z-RPKOjyBoA`t`WcI24-&d*U5WmB+Ju|~q2wQ1@GOux+P z7hPaZdZ#-{ke~D2#xT`tm24UJs*tLb(izG~=b}>JD>Y}ac5?ByWwZWTs0vOQ^;GE)>6^KZjg;i8t~~B!dZ;pbtO}As1fhQ=L;m~5hfj@S_ABCNRUC?iiUz!v z+aGwT;ywz#?g&I+(U;xq#gLfA4au7a*=og>$Kg>fGM!t+)j9Eog}ouDsjR_%uQ#Z< zgu?yfjR2oG6Sjx+9M|dAYo;)1?B8^r=6!raqadtUro$b7-~J0E3HWXK5i$b)q^E}@ zTj3Y!`Yl;itkE3ePj80k?j}*R9JEOG(6W|H+wt)XC+UXh4w~6JPuo0{$hTcv#m^6` zfYR*fpD@Jp9>eF1kN_Zh}%tph+6?);fq23`b*$-Yq6+F(?c$lw+oQ11N+yhr-Pu z`heiQ1}JLh@%D7J8_@eHFy)3&CNN-a!SEGNgCM(*{)>9<*rfY|YYU}m9;Sp|=x^7PG3NlwKvTkcE6e_dzYm_ktm^mFcI$o^%V`vMG3tFpZ7}OIo=T4{ zOYUDa6>u{o)wRz3h~dm8O(+c}#|zn;TGdIV_{!xj@T#0TRddl`^;6}}zJUoNL9FwL zN;!Ae=;~OLB|3>|O2Srcf1{8c7$m2g7-ke}iE5~g{vpnEqI>L8{$ie1$#;kN4kHGD z0mFp6v&8J>sr~<`dh38F+opYZm!%t21VkDoq`OlP5NVJ`kdg+aVV6cpkrV_J>6BPN zVi%>mYk^&*yIE>?f86i;z0Y%h|6kW1Gv~}X#~d@~%#|k~-?k(i^m?O>KPxu6+Ms5@ zHL-+=LpsPKlsw_d26wVP^Lu%14NbNl&^RMBHnytmUPDeZ!dKo;NQ5di5%5Fm`doY!yh7y`EL1G}r)l3=^-e!P4_7vF7n zG$;Y^P}zChg~M!1q{R95wC*_#;uI{dY`SpEUed$i5(r%2{K7ni(ynp?s~wpeRhPu? zzaCd(#2l4)^lobS48zU{2ZUbGdvKu=K725mSmlAyeIq&6zZ|N{(db%F5|FK$n(O@T zXOc76v+Aq|lpRD~(fl9~3IHQGQro;XN-TU!K0T>_`F)oGL$45Hch`a^)>*IEO{O`T zqfP$i(orm{GoHBB7EH^UYKTHK=g!uHAcoF^HVG+4BNT+l%XA+={D_H-={ZaVw2 zg9dYveZ4<=Edu&S!2gv~@HgP1Yz8ZtrIcdW@G(vz@@9cKU@js!hXlu8EKPlMmCGMt zkyDTJ_8@JRWLAMV1B%ml8lTaS_pG^5Wz{$X6Q|C-=IIMw1-m-B8Tu&f!izeA*DH=- zRYcC-l9MHn{T5Ri@7>csx@}I6ntc%~BS_*SWT)1!fm#~~D2?;d>*pyU>jRQ2KV5uw;4Zn*AyFbH*3;`INW;*Xa%cH|Jn<;PinJd_)JyOA?-Rl^ckc{~eh znhi#HmQQYTXlP8USqdn%V19tgg1h_4bw%z|YJ44wRB{8oS56?jnO*u!?l>hz-eI+C zMv2cq6am26y^wod_+z%evtRfeLg^0I?sG}c;$zE_@rmIQraLXfFG_L&` zE-Y#8Kec54rqN~cgG<6a#bMTKtyFB+u>p^_&*Zx^{Nbd zM`D~u1DMnF)wMYhd}%hs>>&0w`!c~=*dpTE2|SH)GjViH)qN?ZsRWwy!S{%%0E@%d zU~k->5RTe8U$GWuFuH zrRp~iy)h3;zHNOC#u=`jD7-)LC_={1!4UL^=U8+X26J}*5dds`Q*(~{KTowgLPmoJ zXdsz>;IjAClvE%*6(bI*P_=2XiF$C0{iBWhVPn$ z*I;;Kp%iFNuYYnLuLs*954a3)tb}LcvG^C_DSD4xu7|=dPO89u|GKdT00B9tIP)?^ zmK@`&L!N~I+|PNCf`g(>SI&!Zn^Uvx{L%FAI(XgJ>=(VC**y`EVKuVji8w33n~_*U z)h%aPz_ZjTqxW_n3tgpF1H7W{>VMePvLvwX-Y$Q>QF+WK!ohL3YHjF_SBtoW?2}@4 z^TQ7F2xy|AZ8zKMHH}0$Szy6-?@<5p zgipuGc|eGT#i?t)LZB1zB2#$t4t2m5Evwzg2FJb((YkL)xqyznl6uC7_ScFOI$pW- zWkMl2RS;sn4Cc9bPM0`d%saYa*DShXv-Qh_pY+||f`P07UHfxSY{?1f8=#PT|Na)fq(H~F~v zOKb}sJf=5o*Xh*~V}|;$nu?ORFaG}dsm>qlPZCu8IW8v-MuL-#Un!czZxX%Yu)=9H z-K@B-2>mCz*&S)$4mWu!zmKoDFN5##7q?3cca=ir4nB@l8>_iDCwi(g!N4SG(V?wU zWZkXkv^JX?e`QCsz&!V?fvm;qn>a+`m&$EDx~w_(1P2U4CRXVj!NhCB-5&Autf_YW zZUWvg^nIx>V##{|R9L{;9)n75Rr+i`*{x>O6fE`EypLs+WkGkRg&*HpT4hefiB4#3h zhQ~k9^G8J~W^Dgad>XAJH_y5d)V!pI+D%CS>tY44x3ydGf#xP)~%skRgF73niOq~m?-@_GvT%wG|+_k>%S z!B30BC*s0V&G49vZed4>Eus1_-Scg4WBo%s0D&*nu9@y&=b1%hz4~J%7@@D}2 zy#5{XO6%u0XJ7SQdchcA@JD;iZaWiWI}F?&A((Sd8fUN!h(iA z(%VmMsvq2Ie|#+-x)*!>QHIyJfk&I>HcN3MUXa^RD1OE9ol`$jU;g_9)4Z43!>`+Q zF$E&5FI}epT%HZ9DZ5g1>^A56;_g4t0Q_Lcah#3YPm=+DUw>>F_K>QX1RJam7Ok>g zxI7pRmm~rkqwoL685JLZP>;?*{_nTYzqV#3blI(gfW*1R7L27iG`5gD4xog$DCm{} z^{t2R?$E6dfgxiKza6M{`NwQ8K8FR-efM#JK2PIfe@Srprx7BuFG3S7)QF`RgsOzqdz|8mherFXHG#x5{BW)S!_J%diF_(Ew zixJI(ywse7`3kKH^2SMdg^J1E?MZA&-lyaBLAvMG+e_QC)fI0XHwmb@Q4WdrkhkMd zZ2`DmdR^K`#n&hBoMD&P zXDz3^)p;`&JnwVE#RyzSA2~c(gW#s|gIopdp~5z9L|i59sEt# zg5ibQoY|kwoM+7DQH;}m4DK4C6(-&0x{jnlD*Y_&F)1`|r;lOp$waDxznBScZv`mcEA zIo-LIWC6OBNK=;p;gf(k!`U!Epmh99^gP?x=uxz%5XA>+EuqMZO_`*D<$A@i{gs6h zV2V9wcJJYM=kl7ucYU?B21D`(ucE{hXVn|(lR;+beQZT(rcZ^kG?Od7 zjK+|?PH{W36LiUoWL1eWSDhqu|FzySIw}zY6i}t7YkMGjV4}ayMAn>*SLIPbX-&12 z^AaKm1)#p1Bu$h2_nr(JCxnM`FXSNL2(?p$+=Z)yiNfq@J0~t!t1ahMfrTE*tfiZu zbUfk#fo>P%ad zEhH3abNYa`f!jt=?BDP%C}~&JsDC?uh9!~0Yw=qr_NnpJ3Nau>bK#uZ7rrG&h(R4&M+ zU(C7ROyhjHwca8<)zF~)n0xJO>g&7QAL)3)r%4_b@JY=Ak|xPf!*^Lb>73uBBt9y1 zYo-~_wE_uo{{}V#_a4m=lmhplbSeH1KsPT;2k&p=_;7+xZikip-;H|nmmHEWg1793 z2j^Klh%E~p#D|OFdHf>p=x!hVu;+FO3kCzfDc{k0WhuM3NtZVdIK5exZR6n9X784- z)t-o%LlG85Iom?K^-EQZEl7+a7#28AbpXg;8nTEhsu$sc4H@o;+NYLwNV3j*A;5G{#8JzKs{cJtQ7ZS95@4nEcKSy8kSdU%N;yPlTl=yVo~qTtiVE z#vHiU+n7A`abRdSkl#v_&nX&N|3JlWp3BT(s;`9t!lk9BS)?`Zqq)XdjeX)8P)#65 zn^9GF@}`w(QEHYyWq-{xNeDQ=`E7Pv5v`aMH*2MT>%`tj}u6+N0`F4fPPl z9zA7&FC2s^;ygBpvKk4=(vu?7ugKfp zzPW_qtcMgE#qU`m>QRZ#S-?*l()PpNfIo7P=!bv}=~D}3oG&|$ZwLRs!R)W@B;Z2& z2)FEuZ0XU7`_ot+%I z_!A109|F_fc(tm|) z{dHg2G{8hJ`{q-TuQDsjcSkcQfpBQ|qxA0z;9lJZFvOewkOn-*bX^x@2R()sZnfUD}{fQ4!rxrh9CF^0tJir#5%^@fUno#9ZLw*W%!Hq$~lR^w;@?4QJMKEP|Pxk1VRZ+hV7 z>Hp%{MsHX9eZIhbp2ID;BIU48QJ=wWL3@s*&Bf2O0f?&d;0@+1xmJQFPCsO_Gi}QX z#)Y6$>#>g6TB53?j^l57&Vh?q0(~myvKb#SQ-520Zd;u1Tx>;>fw{XU1#_I=`Lo1 zWtZ>vZelJMTBnkCyqVgQUL~Z7)*IBWm)NJhtTTH1W$=0eqGM6JP9U-Z?dvR!(l-&y z9*)ry*9z>*&L}=?dbPO-5az?RWiD;>X~6XWw`sQF?X^?0o4 zs33jquNz99>=wMw*iURemP2}_WpynMzpY!;ZwMZ}-3Rjp+@qBt0rIi0K?m{zV` z?wcFQT~shBF!r^M48U17P!{oq@M<{a7oJcBrq(7ZG=NZROVABzQwN2np{77n!GOB5PN(A^{o1XNSw{7B*4KDAX)*O1dXwd&Tf>C?%5(Hu0o_;AVN z6sqVZ9YmVbymy-uSj`=JYlP?x*|q~wG~YF?Z>OCmCUSCM<@&(gao{_v`NDrazinTC zxCosag-%MyS0JISR=OIm$P1Xiz8NSqcp)v|5eLQb`lTtScJ$dN{5S|bNFJ3BNDOF> zy5x&w3D+h1d&E;I_7=dX7h1BL$uv4Uo ziHSpTee&{`Eok?U4gFHOS*in|!8y~oy&#wWTtO5cI7&|V{hh~Sp|`D}A3|?mN9XfHk|*N<%eoF#8xS*9Max1yM|rV>K;+0I=UjEGaW88IFUY^k2k)lI8hF4 z_YK44$CG1Mb-9?(ms-Pq0b2Pn$6M0Ud7D3f=GBWN-!-_npn13Z6hCLo+`b~Yd?A1P zc(_>!)a#kdp%6x1u}j2|Pjz^tbsia~=5~**u;K)I@sQZNf3a4OZFbAq#56*@CZ^RK?09>@7 zV6a4n!@Rhl*5EIm*8XIeR(Z?}iI*=0APZ>wsEg=<3%q?S2TuJhC__?8))(10+gHc3 ztH6YjE_XNfu96ag1DS~Ig5&mp2+L88H)8IY&>s>pim}Yht4keaM#mO-IL6f`PF%t& z?yVnik)6yhg(`RSnhuVxolG^(PbzoHV5VxZahI27N#31xoh`asJ%{M1kN^@Ga6Xu> z4#Hvru!n+|f38$v$CGy+E?q!@`T2iXm=o<;&p+&eBv|#QwZGqVs^4d)OVX zcbcjL)^#B}bIp?ew+&tsVtA*tL~)sxkjcZc%=%v~bhKGHT>FwbxsCm}ysgb4B+h;I z^o`?*cyDU`d^AX}i~Jrul1!SI`(xEx-!N?QR_z;0VXVb2vf-ik&)!g`b zKr?<4A@kD^?vzA{(T{*m%1^SMa|)6mxs;pf=eNtf@HRIGbmdPz8IG!kh1Fd>PVC*; zl>aGECXuAB;B~;_A3P`UNjC9xg{5a@#dGC{NW9orydKIoPGQXbKq11bi7Kp$A1&8A->hU9#1iM6muCQRT|fPicB8zW;uW*1;qPP>=GkV z%l%V>b`b3)Q7Y^kCUUQW%f&AZOtn@29a+9z3-ELV7lhj}Imm zSsH$XQ!bF$gBBvqciu210ttp(A_GX@hy|%mX+tk}ZRN)MLwd3| z^Zh9J49&D!E1xfs1A5dWOUUnkPjw^vDpEhd%l58f`3|9t#fj%0PKqMjLIA$kaZ(wT zAT~k+@n5~bNdI&IF8XILCPZGRr`bF(yZo%*h`luXPt6g=4MNEaV|z``a9P*Op8@D! zyJ3%V>Zf5I!G8&EE8|3qA*2X~8};AAtV0Yk8rkofuaq=IWy+g+X3l4r{S=KH!ykNJ z{AQdG{s&@TQ~R?$Gn9Xp$VC3f-!0Xy-VemRZfG#)IG=N5Y4re^-S z5e@6lLvoyalve2N+t89{8R#9AX3kd!4=L1A;fFg*<@NjkSBHj_hf|+ES^G0oJ;Y2h z{d_7%_FSZ9R!ov=*4e`KxufxF^wJ^8`K+!h54Jk9 z(lPVjZ0cgtP0O@+iYnxq0JN{E$Gzw_!?gesPWuWQ_;8+6lAW7`gNkE9uO!muQ;|;x zf=MG7XTWk3aDQ|fp#*Pw1jl6Gl-+}PQdIoQ`nu@>VB}%_HDyGT@zgaMd=R#XPahr} zPM_tzwCYAt;#7cWc|YqQnMOsS+4m8v;`YroE{==C|? zT@Pra*h_hBd(*RWDW-9bW^wh`M)LO$NuVRyI9(`n@m%`(zRoQNKud&8?2JPBsFfU@{EorQ! zU&Wh*#0Rxsi6m^vq<&G->*-5p`L?R$Jh&KO?~aRePFR}z^bGjHSr~*b1=gV`ARNJi zS-Bt_8*i`i^OuKA?+2ey{;$Ky`V$tUGMa2go9h=1lP7I1RoT2rz(+dL{E3Rc;NSZHC2^@ zX*UrO%MkDVOEuJ;?>OFLs)l^G64CUtI7Y=?`y0xYiyWCAD#jJjUV8V}GG}kold8jB zD<*kAQ%xh5SnZ|CPL}U2BsBlERJ~CdWOBAM<1k_?FGj>yZj{a8F7v6Mo3u5mIMwwI z)R|mJZ%yPk*R+^vajr@6;;*W`Dgtvc{P?JFcLdZeIKo#2sU_RX(^Jw@U1`S&%=$6T ztAnwb;Qym2^cx@y!o1$xKj*)Lx}E>`1t|38%jKfX*@*4{9ZyEg@ zFv@umi^aYA57qVr8!HaL3aH>p%nOm90g^w?Of1`nu0c9AzKA9Xk7b`_@@Goj?u`f| zzx73GIGr=}ECeMD(K`{l&lms{Kvb4xy3R#__`fkNG6%FA((2)hz$5fcbhn%bbh875 z0#fupl)D1o$FbmDFjpcCXGaaR-nok_cqbg3d*5^<9R(+@jB8jo8M$i-Pv@u4a$Fl8 z6uQm{Sva|k3RhFv%Y}+29pqEl$Dk8??Gre9o2`4uhc%QZn@azbm#4Dcwgiv@%AuTK1yc&7RXF%C;oO3C|ItsTR*;`I};2%Y6c>L_nm0ULCPo z?3#UbZ$4bi?|>~Xp9PzsZ~J##0E^LAmm~OD=3xq@^?Z;fO1wpB%|oX9Er}l%-v_nN zF5{rVsCF|P8V{7o_Ae^<fs;q+;ZdC*J2y`4EG6S8BEm_ zcnjrYFwU#~@DmouO7KOQg-hb&BrJ(MOOsqj?>H_cl!?Bu3Fvvta)Qg-6xNP%d!Lch zI|n!ZRG5`gNLtwnYG7f`aVvY+lUWr5>)8KWQ~j*o975~J0{7oy^3&Y|wt5>WSo(U!1Gl&?d6i3P`) zD7E*8u+kAfoV2f(D+V@vz2YFxx_(XU%K@+AgPaJpxkYnxcoG6{hx_Bu#uxxzE^HK$ zqWL8TUd4gJileQ7o}f6hYE7scVEvtix|BZdG*ZeZST2o1cS1=>znUosoxFu`N!WgJ!2vXQ=q5P z9XFKUMu%f%FRp?M{ipPeLFwR9x!Xa=8y_)dp>jS66)|I+(MAT$quCmcuy0g>LzbWq z!t}|yG}m10>}eUiQ~Bzn)l4fQ>fWrx#$}|&#>S56`p=Z1#6Dzh;sQlSiRZ}+_MS8d zE;wfQ>#R0A4A{E)hmo$5xKq8Wg#l32mzd}l2Pj$8AaNL`q7ZHs_DBy#ew+5VQb#@Uh&2=p8_cV-aj$O>tix-`X0KivaE4!j93g_Ay+U4&Wf$2;D?-*xm;D zSD^TGyY0GK6Q}4z+ZH+!d@@5AQgMnTtFMV6q-|pW(%5palLdx>Xisz`?1)fxWb18g zba-*`g&+Cxeu#Sjdl$)G`t{w@my)VjHwEfOH(T28CaWf^4jsHddg%3bs!@x>ShsS8 zq4x+Q)l;a>Jc3P=kDa6>yG!4vpG|bUsetdiPDMYh-)_~aD9_*?`A{OKS6st7eV(so z%e6MTF8;+p3N+pz-B_ULX&XBJj2w?s*&?-evS5x&no>!w1+5 z-K>OFqS{Xa!PUziB+cMu-9(E2K#=(E{0875v!W#7q2b;QIs&)1*K{(CMk70r!G$2f zbcDry_~p;f?~f%xz}sfM&%$@s`3ok*qr!z22oi~*iSEd@JKgiic^L*;eZlpFQIV() zVRbcYzP$s>Ho9aa4Mw!Q@c4&;Svj*fv-s7G zV-VI~n*uj_3d`|~v+s>O<12e@Y|NrjqcU#mPF1v6M4rfOk3@$e z5HkxiT}1C$R=G`oKq%7I-C)}Hsw3h*^J4^iM;<_{+&S!0@RUnKw9lzl8mDnLV~)nK z4&tC2_F-Jn@j>Quq96~#EOsmtMYAO6)`mj8Q0{4{y%5~2`2|VsAGyaH0k_4gwP2^v z|AvAv8bUa-kqjk&OEL5=-|<4*;S|a+?H&+|wftNL0IS!2LXFuukvzvngm+T*1Ha)f zC*)nw&bx&SRb}SSX#A+3x^Ty){`k0*uwMG-gUZy$ZhAFA@=)ex1)zqq=JY4tngMU; z(~2O)x!$jA`t60L-`qxF7DMwF_NYFU3`_no&b|mqdxZ44cMGMO>ZO6bt&;jdVKQUk zp`KUgc2bX5KS%P%bhB<167f7f1eeA}04wwMs|w8T*wEIH`XBF$^y40OYm?kQ-|R24 zerhaS{yl=w(fO~GEWJcSoJ2v083>>!`o#;n2g{4dqy*R|kuQQVBKErYc$45}lB@b0 zfLuMEM|vojXWuh+%aOM2@$tb^3`QN2vkATq^Q4IU|FJG3fPiH5Pe6y`-H@s^+=kke zPJ(y=0X5nY9`D>rhHC}GCfqQJU+`#&d&tS#+S@6VZ1I~vB6^&G_?AivopCLV0`<-B z3uqE-!#yObRW5|Dyl8Zx!zKRsh9+zrLwx+hG{D^anj#)pal8kB@RpX z3L+b3H>t^aKk){tzG}6*T2JgnIZLZ~jktJ+YsFS~V+hx)yVO%Thg_TrIG=sC!$CX# zR37gXEgWQCTc=_@A3uv3L65n26$1C@h%Y44aem1A6`Yu$<>jP=n?50Uadn*ey@#P6W0vaVX=aMv4QItlG<*t?hY#$nK;rul8boi*XSh);iRD_=@; zUJ&JQLH~z(AuC!n z^fu`$o9g=A#wM+Iq|&4-CKM%|?XQwgHaOwf#o(Pc-R%a?Tf}z7iWlhqcq}Dmibps;ViY{DM=~8%@CVvN82O#Sr%>sBuGxEaudMQvbGpRK6okT=rf_2G=czgJT0F5E=@Z0uQr*s(+_ zvx<@u@vC2=oh(IK_tewPvl~Rx{Y+{T9D|#WOV_KyA!3{q#w}Wv06cvN{%oy?(Yq<= zEFFS)pT${nkj+}Dxs%u8_n6YmGqFM@@!wbYLe%5m#MPtvmAp*$U#alYN7$UnID_Y3 z;6&=dSb4WB;a=i_(h0LmwCezFmiH39ae}>yKRD|#3UZZNLZTb>;EFSS=KnGu9uUfv zA8Uh%##;9+j5?4kl9k`SP|43EY#CY^AM2x_t@PFu`6?U_ZziiD)_y!h+Hq( z$aW(ack*+Ii3e8M({Vi%Ln<-myZ3_iqdlYs_q`G;fBr15@A>N8zP->IoXw?MC7?&1 zLeaKYB=~hg6mXaU5gaN!zu<~5Llyd4``73zJ6ESvpidJnWYbT(PK77oqvnI;9 zV7u`tOPe+ho!O5SJpn^cVg6DcMEzF=H!wF)fJPQFM;*O!xOaI|HV&y-LN{$W|2LnG zS0n+Us-$o&8(87LxT=@Id}GTWehB`;E$_O4X+D;a$MY!d5fU*Z&Jl~o6>NNv2Sn%~ zpM$>atwl#b?i!?e@c+qaZ`5|pPN#;m$+W(E>oNpyl`)#nUO`F8B)b5bpSMQwHb;=t z6(7M}@YD1hrm85Ion+;KBJgox$5cfvNL>oM7(~CCaht;~zFc38_Te03Q^YMd`j{+( zpTOZ)hQmV66%M()v?o)|x5I#a*0N!(L>Ixti3Ym@edu;06K_~uDdUZ$S$Xuuc=`*2 z&v*0DK*mDE?~Ge0SMb5OJGQ8#yO%{+Ay2rA-jZtenCi0br=Ye+Vr@xFPEDtYMLYS1 zXtMbV?cPzsE30pR&5O@B66x*@rCGLgA-@}G0oy_@_LuVcQ_!KZFqzFCP}M1ZpsOt0 zS;;2U&14_>2v42=(Owd;a0#GJ0>tv+0RVtQZBD=yz?E(>ISdRXy5{a2YXUU%ZkOO@ z@8M9SJlrjVnFS7fY`S@LTR+a;Hxb2?j;nh4)^qCW7TG$8z!p{X;`F@(FKC&Cvk0`o z#oq;$18q^|XSz0LG!0>MKNT9oLN0oH^Usft{;=pyPDaZ0r?ymD8!DVBG@)FAsx@8B z05xmm7Re#RxBva^c-aTUOk!Mw=VGs8GmQJ6RJocj4L~{>opY`~s~mHF;#0f)tg`&( zFu6c6H83cP+2-_!t0+x{Sa}eZP6zg_7tELt&CbqFZK?u^h1o0=v|&Q7Suy2Swxt!jSJM%udfoR~X$(M0K2U_YJ)DQI+dJ#R^*nO|UYvm2k^Mxf}~zj;N&( z55Ah=M3mLqx?v4ABmclGcb_&(?tq+n8y{QB%CA2tx|wZ|w{VarCqSo4%*NXjQmC*x z2wRh_i~gett#;HuKLpS{{J&lR*z6$;I|{qOVK>0HtND8GV?@<48pNdD`j*TeI@YxS z{(*ZdR61~*SSgS27RmPo#|%8{R8y+hw(EP>3ligROmR*X*M$ex2Gu5;pG*t0f&MVu zKYBa-{TQ(S{0!%2PypVat_H@oFUS)$pLG|9KE+TsT+-=%woG>Svdsh3ws#Pg2=n$> z3J893Gdl)!eiqY9`z1=y-6Y?hQmeNF!ioad_>55bGtFd=gQTn{c3Sor_ms8@CHC8LST9vdK_kXPxZ96+WZqw z%VLB|X%(R~19iwp!4JyjR`DSuoe>lH1{a1O;!j^jW@x-GXg{UN%FZz(&dA$Z0b}_v zF#6DsuXWz3r=`hJoz<_O^hE-4G7>Rky#o-xRyg*@Uj6y37UVO&^Bo}Ob_!3Y6AtWmnn2(vS)Y zfcEkm-2udS;D9E8>R4lp;|XcUfW6)m`O6Rb-tTPqv!k6mKP{SM=Ukus&W8@<>4FvV z|71Vk%04~iZmK0}?7Ww{=(Eh;XN4UKMg;q02MP?=NVb`f_uU(cT9E*{&4%Tq?8k+Cu!2u$D|ROUnc z?a^^dh=TKhDb`8#5#j*J9XOU>feA|`{>M5FwI2aGp4N);U3-Gc^-(OptqH~+0k==? zr`KWpQo|H%t+ObL@L?}Y9BKTl4e^lGpom$NQn)?~hXu%yK-VJTG-z-}1-vUH!Ia z-tv@2QMRPQPxN3vwGQ?Te7G*P-?ue|V$MRLnh=Sx8a{07f%awFHhCOW+*X@j40y#Y zW${vRHFHwscQXFetkj^}QNk4&}8t za1TA&_sLeN+#`O}zp72%vh>S0<>5(Vx5yLy4+6=7bP<~SJYYcoAYF`(UE$)&jp(ZT z_4!++I}MrTiK-U81ye9imEE;?1BDttLM0@r5ZShd1=0C5pnkTghC}$DgGQC;0zw{{ z3Gv2u$ST!RbwKlQj_~};jyFtcrk|R=0DVdW7u9Qr-q-Mr9`jSb^EcBX{XnXlDOmiH z4?lwMJ6Glqk>N8hFRavnH zlX;QrM$0viKXr2t#tzLsEGo@4enz)gd5W`m!uMByJ>!~edjM>Ccj=`4B=@2gMOv{T zzn_136q_BK@L~L(J!Rios-Shm#g%lrlDy}gm(Ytr&sR3{o`mS`Qflq9rv}XSn>uAU zXL{SS_BIfR}ykxFQW~v&^1>mU)$t;FD^umYg=X0P4lelqS}+weY~knbI_R=z5qovm}9Hlu31*yy%3q841_?gyw zYGxK)gBD$T6H_+{r+Yt(wpNJD+`?LT?OV-vP?;RIegW8(WjWvODDH@V7iY(^*@S!? z0siNJVa9l<;Df+02|z6&u80Yv*YVIO0ylAD6WJ&8xL~Lqk>@6$-E!AD`KFaV;x4}_ zL-Q&dxA{_r!0z>MN$GdJ&ucn7RRbh|HNe92^S4zWE*s09Ur;G4OS76Xq-9osB0`L- z3H!+QTGBf?Kk)<%sS;-v&|9*7wu>XB)52rzGhncNIkP2iX7+v*b5SRgQfu}lvtP%e zvC{xbDV8k#iuU;tP2(JUa$W_e%24!;_`Cts^t7t{*Ps9yl*`n}1T*<65s7vOG%15E zta_vvyog6I%>ziV&DGw`f)eZilb?Q=>`25^9gqKyxDXp2;Gz7fF`#h~tWOzoy)lh~ zeYwNBHocqq1`i2B7qs)pb+`RxNxwddeBJ2-XW_IMU;-xBQJ-;{?Rz4VY)n=sKWp!5 ztFWbS-DG^99t;5vMjlt1JZ|O`+{1hK%r-6%0W&b8mf!uo|HgzBUw%R5=B|%jCue5NVqR7tS3X)<|Isy8@^0+AS#l zBP8+>(5s2UcIHGe=LV_kq3B9hs%-Uz#OoPz+MjpI*IHo|LZ1dB`rY(N9lB+o7Hx9P z30AEA;ABpHZ4<%VpFS`bkjy2d6PN*+{R$QcypuB92^RS@`x>In?0c;$k^Wr z5I<)4pUX(kS4Pz`o1fJEP4+cN!u=P_|2a-n$#a0^*-C!<{t~>D5c}@X=7HtID_qV- zlPp1+J5I~$r@?M2AkTE73DBG{h`wq&Zxb*hZ$Y;|0@w*`nG%y$tQ9ECOY90}56Ta0 zm%}oYLMrhyIi(4n#8Uq9ahI&`N;b&JS*g(Wo93kgko!VH-ty4h?pJ5 zPr7hbaxg+vi{$d4(l0&Gx$UL(Ot7`-!0qReL^{e;gYL9!J@O3H-%~964Me?a@UI;D zF3F`K!i~Lr|pa|3nlaaNl#J$V}UKW`Ry%d zFAJ91=}SN%Cp;|cQ496JHk2M89-F+X6aF_f#8(jM{ZIYRyw)VX2ev`?` zG*gUgkrJr|E;#Rw9uaB{r5M1VkoBYqP&&j`x^!%v?;5-NOwYrVxa@hG7z@1A6Y7F)`AzIq_noMG%w zRb&an?=BVr+al?IFf5zK95n9T6+b#kVb;`ox1%OV63g99?PE~XAl6p-bGATsz9Zev z{T{KwOS@`;0FtXvsxB&oc+%AorcvZO#n|;hpOeYXPGdta`{w@uom+&rk1uO8N!EVW z>i_A+2{U(gS@<;^VG`bviOzWqt$_%RH%>v!-#G;280LS%*H%#PU`CoI8-Mf3lq<>w za2p=z2-j5m|K46ywcg6S`}+80@Za=U+6>HQ(?dY}t_QUbJ3FUo&@=6UitGLphyvNy z2Ei$<;7`GM`Y7Ryhg6}8rY^FF)M(qqCrxZq!3a)Om8E^J{*4!VL@9EQ3Et2aEVujA zxVvhWwsNd~jWw}gUpUaI*IB_@-@N>6Q}Y9AlhBd>IGt7S9#?3c^JxHX>Cyj6b_?M; zV#6At6hE&f_7vt0Knq@>so-!zK zu>!C;a?sTjd5%soSUQTMb!5_r)eV+pOU@V%_! z`Qo2hQ{4E7W~L4VHzx#U*n4*R`Eb>{6Ub%mZy1AXliyan>}i!=zm-ZKnu7(y7w5{1oj+V zy1fj*VNgx6ZS=xg5UxYwIGO~RAdt&P#20+MHCQG0!0n71yP6+vH&WzTH#ee z3x=hLMFIp3BtRf12o^yl&{qs3kOVi7EvyM-IpPum2&+)w0z!=uNe|x#9dM) zxZ>;g1AyX}VjYx1ihW4w=Bn-jS<7)h6q4_44$5N)OEwMunWd-3%{3~z>U6^AQKoAD zqkQ4BZh@rZ8f7}TX+Rzg9Md|m{ljmh{ad$8?H{At%yWaCuYdCMdQ}!IZIy02_4D}w z=we3lv{re1TmgzCyY4_l`IcBe$N~GaPCK|&6vpTAEu4?1KcV+b-XkUXyo6+Ng3z-$fp49@sNq2 z&V(|h+2XX%L}N{>@w$f3&FjEEbd<(;V@)Ep?yocDH6ZTSw2`)&5|8$n`Hpiq53y`G zZ^sv#dAY&)*Ja35JJQ1uc)~NqXjFkH^xnQgGHhZ1cp#8ps)|Bhq4vUm-6HlhJ^MVd zd_Av6-=y*jTWZ^$?!?EQuE&c;f4J0la^3sR15UMOORmR4;&s21P@w7Gh(|0F$BMKT z$|-l_P~HjOmvIp)BiOshuqH=5L3)kG2Jp&pG;*0rU0anEeZ+Jz>*K`f*f=xI^nHv# z%Z{kfVB7}=L0V4@w&%bvUOW3DBo&cKL?}C=9u`yQ-l#F%t4V(>>aM8WN&N18LqGvc!p zzlCycGaUaV>w&pR>N6csDXlO8`8eOho0qzCj_>Fhcbjg$KvCH0sDFY?3^CBq5BW%( z>_?P((V{?KcB=t6c`5$Q%PrBKxHu^HG|lSz!aRCO*v$k!^J@v_lbnDl&QQ-#{<* zg{OE_5$(V0O!@-GAT*i~sX-xeR*Qed-hv7hvv{ywwR4KfpWPJJjnAa= z$Xc?6#?pvLc>M?tL$_ITk=g#T2l3!WgdlM+Bdk zmks&;dL-oZlgbeq;mUB!pMo{Y+exJLm8Te!w?i^j1H(6E+LG*B#@*}zi9$)3Tk;gF z0lgEm{))Yw6=bu|q>2L1d|-2a09m-n;OCGvgql5Zx?dWzmV*3ds5uM9x3YPk#MHn- z_a=AFW%CK2;hS*x+(dINd}D{?4|iwX$fq4+!iTIWz=SR5M5o`uSSU2rX(W}L2!lPY z{Vc78;eRX>`quk0kYEJt+E07mPtO&pV(zi<4E=BdGg~NW=RP^$ZCGaF84&p)$wKQ0 z?#E5127B$|E^Pd4+WeRiX7@hfVvf9Hr%q0-ocD+JG@chWQCy}7K0ewNeGNyg+*=lQ za?$lWW2SL~>v|pLcZ)=%t?5yX70^qZxeFb5!~2#KXt+xFw<#JdV9M)K$`gO6mGEmM ze-cHcQx=t8Cf@qXQ7lzs_zsr;K_cX9$yzN$<@?%Z^isyf#3aM|{V?kykoeGPs>@^x zM*mbHLupr!u53mX*`}m&j#vqDo6^yPpUFdf+eVWDSLz3%M zq-bgXgmEOaA^=cw(4?y_i^X{}U~*!LX_^^1hxuyuzMO>DZl_NOe||>{tY1!e^D^#r zj5i)=`*T{>F)6|2hAw}-FW_w`I!toc?`MhodkD~A(3|XD#+0`q7?6jb4kOqasNrND z6INZD@^n8}lbKHKgSd!fzX3_*taESN?!t$Pud98@*@!j8nermx1|o z)ghu+Z&a7i=Y4qVou@Jnd%)=;vN#@vHh7Ycn`KBxaegE8ZHZkj&0R_`X~8hl>=ZU< znU@5HT|9dx=*X2sZ;LDbS8Mm>i(TP#GOQ?`ly1pR=O{d_pF`H@tmOg8-HIel;Sc;@ z{*4}r7CUqUh&I=7do-olOh_X>(5v!S4!JP`ue*;YG7J;Lml+^LR{#{PIMn~v?d6Uc z%fH&gDe~vlW!vDq+67)`2fbRL{ow`vDcfC>o#$%UTMd_OA>B^6Hq_EDl@Ez8^c6}m zP_mGTK+5UAltGW{Sh-jPP`z=SdZ|JC3%PUk+*gExg_a}=EG`U07R!)4gA^6{g8;cv zlMc^QEKbtliB=8LFA!Gx5c!~cGR^QMYpNCaDr>F%D~ej6Y1y;nMv(;`-X+~)EsVo$ z>X!E0WZeOryAj6lMZBMAH0nBcx3Zt}&>75pJoRkMx?n=++>bQ;EKc0C${pLnR2O&E zWk7s3VJ(c#naqKP>YFI;S^X|-_t#10Fq#Oc-C6}-uDOo4R7klCFAm0dhB+-}T`6rE zOgGiTr4Sw+6W#B;j=*ZK?>(U>uYU>7J(QbEI(vd(Gt|Ib@N&FR=y1#BaO)in1(wxO zGp;Uh%l$rtLc=!R#(ERWfCZTE37*ek$Hg5TyH0?*{;5_9I$#y5cjxXvT_2}aYoW3M zC|uym|0$uNyfC@qP1T$CG4{NtST|}kP?Ly%@Rx${eDVU}cp zDveug&I9oli+Q|&L$|a*D|Pwz(-7^@R385Zh3*zrXNVl5nTO5ZlO!&lm|z3K*jQqA zCa$i34GF|c77UFeH3|=~(-nQT0Y%OR3C{?dK5*;aayP(e3ANlo`<)YRw$nL!@=3x< zYbL;A9V`PdN%Q9=&28SV#Wi`vLap_77V6L^X|YlH4o!!(-j}rzM`B2VvJg>xwxXt! zNKYHCD$R61N%c9#eBo1_x<1t3sj@A0k00jIb@jNBTG^4`_B6iCSZkPWc#;;$K8MbB zA4D{sc{|g_Y*nt6jb^F7EDpG^DWkuIcbC(;0;H>F9JmuXyoN*xh59-Dn*qt(<{Jl3 z^Vqb~EiQ&r7upmw3sJgTrllz-V}(D~`xKJu-yviW5R1JUqKDIqyx2wxG&(33>d4Ty z@_n0k8&q>Nx^(f#MP_RcdaDe z-r!PiRZPyj8P7m>!^3U%cv1`=X@5pnuB2ga&_s9%zIX(P_;_)#jpd46rAb)1h^HDN zr!BL0j}tSAk2k(%bS&@+<|*vvvzulR_ft7w;*NIrIC4QHhi6n5R>&9HZy)f2(N;8R zPY#~Ff#pz(3qGOj953uQlS=_ICgslFluK(#h_7aQZrx!G#IAh{@GV{B)>PITEl6!7 zVJ$IGn>`?Eq(npUuZUMlz&XN%B6NUVb%zkvBGf6a2m#%f_f6u6=td&FNC1f4VZM_} zfR|O~1J>9>uB9suk4o)AdhdN-!Ko@W?+f2CZ1lG{5#c4@`P@paK~0soOf({cV6C(z z;fNNy%83QGsZvrohxWh9%n<1I;LXa2BO~dgp(#>7zPL@=kK343&PBy4*U06r83L#6 zDeg6x^kZl#6Pl7;?!9M#9ov28ovCL~zUl00rq`Oo-gI9Qep5o0`XumJY1R6(+&D+b z!PNSl$@+q7q4N?#yDHp&eEbZW%eA2xO`yHEzD?id$^RQ8X{A}-JnrYq6o*S|5DuOR zLF>;-L$fEyoYl%numz^B&$s+C3??ElIRZl5s8jT&T3e3Ux@n<&V3M-sGHue+>NGY? zLTr=~3Op~CdT$hY7=A?WnDqc2bzFZpv?7CNDS?2%hpc)LiG}Hz6E;RDxfFn5I!@68|yk4LS zRkYt06NrL8HnEA@)q;M4DSr2d5?^JmZT(&28zlx$W2e$9het$n$@#v9Ag6c9t$kuB zK}`1=Zl=?wS9+@rd(-Wf-!2Uw+1o1jQj1_q7ne5)J`a7klH~2jH*m2^$EMw7%2}oF zw3myLKF>UO2AIE>aOE>fRt6E>olUnTHkfxhH327zh-kl0%)kfU(sgP<;7%Y@+mC6; z9_X2h$j31tDE{E`(G;Sa*6fUzSk;=e-$dtpho&;+HsV&{P|fwBI;~RjS7gf!vmHrM zszs>Gf$5V7uxP8n-fS+D@(HU8Ga9V@69&_%3_Rd}@~)W)mcGn%T_Rj5!QO-k^s~`f zGXust;s%XjpRply8ag+N#+e(jWjpz=W|b`rys6~}XbWrJLJ6Epl4WvF4h1H0jGM`U zu(?Jh?~spb8&F1eiaSF)^|8FIGGX3Vtwpgo0ZGgzs1e!12xTg1eys+*;s(RVwIC`~ zZxKGjWdTes9{aR?ppnrvUMh7?*Sl&T;W7aM_idMdPJtRV*QyJpx-vh4Jt`RG^faOI zi{b~$Qe~$7a;cA)Y)SHNpC+$pV8u%e#TxMpDJ8TZ#jP_xYE>=Jg34G&B18{6lqF&{ zJaJP;*@LXQB)2B3_oW5wQt~7@6kU477{J%Su{6+_pKaE z#Fsus$eA`O^^by-4_n)-kt&QNRQpTktIkWw45NL9WdZ-Y5C9*KsNZXq>|yu>-Nibs z1Y9*m)wWRbi$8%9Z0^FyHPzM1903&iqbSkz6W8{j+E7(&9V=YF{zzwO(h^tqv)CB+ z*vKT2=#imFj(i#FLa;9*c$BBwzb1NI1r|yIq>GNvb{FyeW=;NmcbCl~N*f<;KCaU3 zFsq#EV_|cI%v*P{n#;bIQta!27BQAuffU#LHd?kucS&t}-UYKeQLeZVr+jk33d+u`mmow%0v~-73a)yb0+_h{P(+lSTQ8_QYNxLE k|9$@Jf&Z@_Xp%s1tLJ}%9oyq#)ffX09z9U^V|4ca0Z9Mc%K!iX literal 0 HcmV?d00001 diff --git a/test/textures/bunny.png b/test/textures/bunny.png new file mode 100644 index 0000000000000000000000000000000000000000..79c31675083b7ffc272a6370bc189360bde484d0 GIT binary patch literal 449 zcmV;y0Y3hTP)SOJFMz`0@qn1GK$9W|wOohG3Lai}FkWLtiT<2<{JbM8>W7|R$! zUuNqg#gmKmsTnILy&K;zJjd^_40xy)%EA1>FWWk~LFpr>Et|!Hv(V>Hs9!2xEQJ>~!qz76HLsxFXdG zs5~GjUDeD6dXvG$_#HtoUok|M-X@BSTy{VK4P?TJZcz}O&FVzD0fZu8Yajr@?2aYL r_Q@_>J=ju&>AqoA-=wzwF98MsNX4 Date: Tue, 24 Sep 2013 09:32:56 -0700 Subject: [PATCH 02/12] Squashed commit of the following (jshint): commit 09d68fb83686b82a2cbac0d99abcc7e0899d6724 Author: Dr. Kibitz Date: Tue Sep 10 13:14:22 2013 -0700 ignore W069 just in 4 methods commit 931afab48f374194a808bedac4e31dd9c20d2ae4 Author: Dr. Kibitz Date: Tue Sep 10 13:14:03 2013 -0700 fix for warning W055 commit 43ad62a89a1c83e8da85dd9f9bb6e8a7c0acd59d Author: Dr. Kibitz Date: Tue Sep 10 13:13:46 2013 -0700 rename HEXtoRGB to hex2rgb commit adc2a1e83823061709dbf1d4b037bebeddc7281c Author: Dr. Kibitz Date: Tue Sep 10 13:13:02 2013 -0700 Changed some jshint settings commit 0d8eb1ef71332b076a0f9bd565633c92395ed5ec Author: Dr. Kibitz Date: Sun Sep 1 16:16:53 2013 -0700 unittest-refactor branch compatible jshint setup commit 3e91e79dab7c34dbb60bf364124d2ef7df93ec6d Author: Dr. Kibitz Date: Sun Sep 1 11:15:34 2013 -0700 Final progress, jshint passed commit c0f3750a06616195cf76149091dce4a1da7717ab Author: Dr. Kibitz Date: Sun Sep 1 10:31:36 2013 -0700 More progress commit b2118949bb47cbeffaf53d2cb1a978c8f9ffdf49 Author: Dr. Kibitz Date: Sun Sep 1 02:38:10 2013 -0700 jshint progress --- .jshintrc | 72 + Gruntfile.js | 28 +- src/pixi/InteractionManager.js | 857 +++--- src/pixi/Intro.js | 2 +- src/pixi/core/Matrix.js | 298 +- src/pixi/core/Point.js | 26 +- src/pixi/core/Polygon.js | 12 +- src/pixi/core/Rectangle.js | 70 +- src/pixi/display/DisplayObject.js | 651 ++-- src/pixi/display/DisplayObjectContainer.js | 468 ++- src/pixi/display/MovieClip.js | 144 +- src/pixi/display/Sprite.js | 152 +- src/pixi/display/Stage.js | 124 +- src/pixi/extras/CustomRenderable.js | 10 +- src/pixi/extras/Rope.js | 222 +- src/pixi/extras/Spine.js | 2827 +++++++++--------- src/pixi/extras/Strip.js | 110 +- src/pixi/extras/TilingSprite.js | 88 +- src/pixi/filters/FilterBlock.js | 6 +- src/pixi/filters/MaskFilter.js | 4 +- src/pixi/loaders/AssetLoader.js | 57 +- src/pixi/loaders/JsonLoader.js | 198 +- src/pixi/loaders/SpineLoader.js | 70 +- src/pixi/loaders/SpriteSheetLoader.js | 132 +- src/pixi/primitives/Graphics.js | 100 +- src/pixi/renderers/canvas/CanvasGraphics.js | 323 +- src/pixi/renderers/canvas/CanvasRenderer.js | 392 +-- src/pixi/renderers/webgl/WebGLBatch.js | 611 ++-- src/pixi/renderers/webgl/WebGLGraphics.js | 624 ++-- src/pixi/renderers/webgl/WebGLRenderGroup.js | 1309 ++++---- src/pixi/renderers/webgl/WebGLRenderer.js | 302 +- src/pixi/renderers/webgl/WebGLShaders.js | 60 +- src/pixi/text/BitmapText.js | 8 +- src/pixi/text/Text.js | 226 +- src/pixi/textures/BaseTexture.js | 170 +- src/pixi/textures/RenderTexture.js | 240 +- src/pixi/textures/Texture.js | 150 +- src/pixi/utils/Detector.js | 20 +- src/pixi/utils/EventTarget.js | 56 +- src/pixi/utils/Polyk.js | 194 +- src/pixi/utils/Utils.js | 96 +- 41 files changed, 5776 insertions(+), 5733 deletions(-) create mode 100644 .jshintrc diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..99e1b16 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,72 @@ +{ + "passfail" : false, + "maxerr" : 0, + "browser" : true, + + "node" : false, + "rhino" : false, + "couch" : false, + "wsh" : false, + + "jquery" : false, + "prototypejs" : false, + "mootools" : false, + "dojo" : false, + "predef" : [ + "_", + "google", + "jasmine", + "describe", + "xdescribe", + "it", + "xit", + "beforeEach", + "afterEach", + "expect", + "spyOn", + "runs", + "waits", + "waitsFor", + "Benchmark", + "Backbone", + "Modernizr" + ], + + "debug" : false, + "devel" : false, + + "es5" : false, + "strict" : false, + "globalstrict" : false, + + "smarttabs" : true, + "asi" : true, + "laxbreak" : false, + "bitwise" : false, + "boss" : false, + "curly" : false, + "eqeqeq" : false, + "eqnull" : true, + "evil" : false, + "expr" : false, + "forin" : false, + "immed" : true, + "latedef" : true, + "loopfunc" : false, + "noarg" : true, + "regexp" : true, + "regexdash" : false, + "scripturl" : true, + "shadow" : false, + "supernew" : false, + "undef" : false, + + "newcap" : true, + "noempty" : true, + "nonew" : false, + "nomen" : false, + "onevar" : false, + "plusplus" : false, + "sub" : false, + "trailing" : true +} diff --git a/Gruntfile.js b/Gruntfile.js index b083b49..440f6d5 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -93,11 +93,24 @@ module.exports = function(grunt) { } }, jshint: { - beforeconcat: srcFiles, - test: ['<%= files.testBlob %>'], - options: { - asi: true, - smarttabs: true + beforeconcat: { + src: srcFiles, + options: { + jshintrc: '.jshintrc', + ignores: ['<%= dirs.src %>/{Intro,Outro}.js'] + } + }, + afterconcat: { + src: '<%= files.build %>', + options: { + jshintrc: '.jshintrc', + } + }, + test: { + src: ['<%= files.testBlob %>'], + options: { + expr: true + } } }, uglify: { @@ -182,8 +195,9 @@ module.exports = function(grunt) { } ) - grunt.registerTask('default', ['concat', 'uglify', 'distribute']); - grunt.registerTask('build', ['concat', 'uglify', 'distribute']); + grunt.registerTask('lintconcat', ['jshint:beforeconcat', 'concat', 'jshint:afterconcat']); + grunt.registerTask('default', ['lintconcat', 'uglify', 'distribute']); + grunt.registerTask('build', ['lintconcat', 'uglify', 'distribute']); grunt.registerTask('test', ['build', 'connect:qunit', 'qunit']); grunt.registerTask('docs', ['yuidoc']); diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index a7c520e..56a55f5 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -14,56 +14,55 @@ */ PIXI.InteractionManager = function(stage) { - /** - * a refference to the stage - * - * @property stage - * @type Stage - */ - this.stage = stage; + /** + * a refference to the stage + * + * @property stage + * @type Stage + */ + this.stage = stage; - /** - * the mouse data - * - * @property mouse - * @type InteractionData - */ - this.mouse = new PIXI.InteractionData(); + /** + * the mouse data + * + * @property mouse + * @type InteractionData + */ + this.mouse = new PIXI.InteractionData(); - /** - * an object that stores current touches (InteractionData) by id reference - * - * @property touchs - * @type Object - */ - this.touchs = {}; + /** + * an object that stores current touches (InteractionData) by id reference + * + * @property touchs + * @type Object + */ + this.touchs = {}; - // helpers - this.tempPoint = new PIXI.Point(); - //this.tempMatrix = mat3.create(); + // helpers + this.tempPoint = new PIXI.Point(); + //this.tempMatrix = mat3.create(); - this.mouseoverEnabled = true; + this.mouseoverEnabled = true; - //tiny little interactiveData pool! - this.pool = []; + //tiny little interactiveData pool! + this.pool = []; - this.interactiveItems = []; - this.interactionDOMElement = null; + this.interactiveItems = []; + this.interactionDOMElement = null; - //this will make it so that you dont have to call bind all the time - this.onMouseMove = this.onMouseMove.bind( this ); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseOut = this.onMouseOut.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); + //this will make it so that you dont have to call bind all the time + this.onMouseMove = this.onMouseMove.bind( this ); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseOut = this.onMouseOut.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); - this.onTouchStart = this.onTouchStart.bind(this); - this.onTouchEnd = this.onTouchEnd.bind(this); - this.onTouchMove = this.onTouchMove.bind(this); + this.onTouchStart = this.onTouchStart.bind(this); + this.onTouchEnd = this.onTouchEnd.bind(this); + this.onTouchMove = this.onTouchMove.bind(this); - - this.last = 0; + this.last = 0; } // constructor @@ -79,38 +78,37 @@ PIXI.InteractionManager.prototype.constructor = PIXI.InteractionManager; */ PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject, iParent) { - var children = displayObject.children; - var length = children.length; + var children = displayObject.children; - /// make an interaction tree... {item.__interactiveParent} - for (var i = length-1; i >= 0; i--) - { - var child = children[i]; + /// make an interaction tree... {item.__interactiveParent} + for (var i = children.length - 1; i >= 0; i--) + { + var child = children[i]; -// if(child.visible) { - // push all interactive bits - if(child.interactive) - { - iParent.interactiveChildren = true; - //child.__iParent = iParent; - this.interactiveItems.push(child); +// if(child.visible) { + // push all interactive bits + if(child.interactive) + { + iParent.interactiveChildren = true; + //child.__iParent = iParent; + this.interactiveItems.push(child); - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, child); - } - } - else - { - child.__iParent = null; + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, child); + } + } + else + { + child.__iParent = null; - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, iParent); - } - } -// } - } + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, iParent); + } + } +// } + } } /** @@ -122,15 +120,15 @@ PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObj */ PIXI.InteractionManager.prototype.setTarget = function(target) { - this.target = target; + this.target = target; - //check if the dom element has been set. If it has don't do anything - if( this.interactionDOMElement === null ) { + //check if the dom element has been set. If it has don't do anything + if( this.interactionDOMElement === null ) { - this.setTargetDomElement( target.view ); - } + this.setTargetDomElement( target.view ); + } - document.body.addEventListener('mouseup', this.onMouseUp, true); + document.body.addEventListener('mouseup', this.onMouseUp, true); } @@ -145,42 +143,42 @@ PIXI.InteractionManager.prototype.setTarget = function(target) */ PIXI.InteractionManager.prototype.setTargetDomElement = function(domElement) { - //remove previouse listeners - if( this.interactionDOMElement !== null ) - { - this.interactionDOMElement.style['-ms-content-zooming'] = ''; - this.interactionDOMElement.style['-ms-touch-action'] = ''; + //remove previouse listeners + if( this.interactionDOMElement !== null ) + { + this.interactionDOMElement.style['-ms-content-zooming'] = ''; + this.interactionDOMElement.style['-ms-touch-action'] = ''; - this.interactionDOMElement.removeEventListener('mousemove', this.onMouseMove, true); - this.interactionDOMElement.removeEventListener('mousedown', this.onMouseDown, true); - this.interactionDOMElement.removeEventListener('mouseout', this.onMouseOut, true); + this.interactionDOMElement.removeEventListener('mousemove', this.onMouseMove, true); + this.interactionDOMElement.removeEventListener('mousedown', this.onMouseDown, true); + this.interactionDOMElement.removeEventListener('mouseout', this.onMouseOut, true); - // aint no multi touch just yet! - this.interactionDOMElement.removeEventListener('touchstart', this.onTouchStart, true); - this.interactionDOMElement.removeEventListener('touchend', this.onTouchEnd, true); - this.interactionDOMElement.removeEventListener('touchmove', this.onTouchMove, true); - } + // aint no multi touch just yet! + this.interactionDOMElement.removeEventListener('touchstart', this.onTouchStart, true); + this.interactionDOMElement.removeEventListener('touchend', this.onTouchEnd, true); + this.interactionDOMElement.removeEventListener('touchmove', this.onTouchMove, true); + } - if (window.navigator.msPointerEnabled) - { - // time to remove some of that zoom in ja.. - domElement.style['-ms-content-zooming'] = 'none'; - domElement.style['-ms-touch-action'] = 'none'; + if (window.navigator.msPointerEnabled) + { + // time to remove some of that zoom in ja.. + domElement.style['-ms-content-zooming'] = 'none'; + domElement.style['-ms-touch-action'] = 'none'; - // DO some window specific touch! - } + // DO some window specific touch! + } - this.interactionDOMElement = domElement; + this.interactionDOMElement = domElement; - domElement.addEventListener('mousemove', this.onMouseMove, true); - domElement.addEventListener('mousedown', this.onMouseDown, true); - domElement.addEventListener('mouseout', this.onMouseOut, true); + domElement.addEventListener('mousemove', this.onMouseMove, true); + domElement.addEventListener('mousedown', this.onMouseDown, true); + domElement.addEventListener('mouseout', this.onMouseOut, true); - // aint no multi touch just yet! - domElement.addEventListener('touchstart', this.onTouchStart, true); - domElement.addEventListener('touchend', this.onTouchEnd, true); - domElement.addEventListener('touchmove', this.onTouchMove, true); + // aint no multi touch just yet! + domElement.addEventListener('touchstart', this.onTouchStart, true); + domElement.addEventListener('touchend', this.onTouchEnd, true); + domElement.addEventListener('touchmove', this.onTouchMove, true); } @@ -192,84 +190,86 @@ PIXI.InteractionManager.prototype.setTargetDomElement = function(domElement) */ PIXI.InteractionManager.prototype.update = function() { - if(!this.target)return; + if(!this.target)return; - // frequency of 30fps?? - var now = Date.now(); - var diff = now - this.last; - diff = (diff * 30) / 1000; - if(diff < 1)return; - this.last = now; - // + // frequency of 30fps?? + var now = Date.now(); + var diff = now - this.last; + diff = (diff * 30) / 1000; + if (diff < 1) return; + this.last = now; + // - // ok.. so mouse events?? - // yes for now :) - // OPTIMSE - how often to check?? - if(this.dirty) - { - this.dirty = false; + var i, l; - var len = this.interactiveItems.length; + // ok.. so mouse events?? + // yes for now :) + // OPTIMSE - how often to check?? + if(this.dirty) + { + this.dirty = false; - for (var i=0; i < len; i++) { - this.interactiveItems[i].interactiveChildren = false; - } + for (i = 0, l = this.interactiveItems.length; i < l; i++) { + this.interactiveItems[i].interactiveChildren = false; + } - this.interactiveItems = []; + this.interactiveItems = []; - if(this.stage.interactive)this.interactiveItems.push(this.stage); - // go through and collect all the objects that are interactive.. - this.collectInteractiveSprite(this.stage, this.stage); - } + if (this.stage.interactive) this.interactiveItems.push(this.stage); + // go through and collect all the objects that are interactive.. + this.collectInteractiveSprite(this.stage, this.stage); + } - // loop through interactive objects! - var length = this.interactiveItems.length; + // loop through interactive objects! + var length = this.interactiveItems.length; - this.interactionDOMElement.style.cursor = "default"; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; + this.interactionDOMElement.style.cursor = "default"; - //if(!item.visible)continue; - - // OPTIMISATION - only calculate every time if the mousemove function exists.. - // OK so.. does the object have any other interactive functions? - // hit-test the clip! + // loop through interactive objects! + for (i = 0, l = this.interactiveItems.length; i < l; i++) + { + var item = this.interactiveItems[i]; - if(item.mouseover || item.mouseout || item.buttonMode) - { - // ok so there are some functions so lets hit test it.. - item.__hit = this.hitTest(item, this.mouse); - this.mouse.target = item; - // ok so deal with interactions.. - // loks like there was a hit! - if(item.__hit) - { - if(item.buttonMode) this.interactionDOMElement.style.cursor = "pointer"; + //if(!item.visible)continue; - if(!item.__isOver) - { + // OPTIMISATION - only calculate every time if the mousemove function exists.. + // OK so.. does the object have any other interactive functions? + // hit-test the clip! - if(item.mouseover)item.mouseover(this.mouse); - item.__isOver = true; - } - } - else - { - if(item.__isOver) - { - // roll out! - if(item.mouseout)item.mouseout(this.mouse); - item.__isOver = false; - } - } - } - // ---> - } + if(item.mouseover || item.mouseout || item.buttonMode) + { + // ok so there are some functions so lets hit test it.. + item.__hit = this.hitTest(item, this.mouse); + this.mouse.target = item; + // ok so deal with interactions.. + // loks like there was a hit! + if(item.__hit) + { + if(item.buttonMode) this.interactionDOMElement.style.cursor = "pointer"; + + if(!item.__isOver) + { + + if(item.mouseover)item.mouseover(this.mouse); + item.__isOver = true; + } + } + else + { + if(item.__isOver) + { + // roll out! + if(item.mouseout)item.mouseout(this.mouse); + item.__isOver = false; + } + } + } + + // ---> + } } /** @@ -281,27 +281,21 @@ PIXI.InteractionManager.prototype.update = function() */ PIXI.InteractionManager.prototype.onMouseMove = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event - // TODO optimize by not check EVERY TIME! maybe half as often? // - var rect = this.interactionDOMElement.getBoundingClientRect(); + this.mouse.originalEvent = event || window.event; //IE uses window.event + // TODO optimize by not check EVERY TIME! maybe half as often? // + var rect = this.interactionDOMElement.getBoundingClientRect(); - this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); - this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); + this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); + this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); - var length = this.interactiveItems.length; - var global = this.mouse.global; - - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mousemove) - { - //call the function! - item.mousemove(this.mouse); - } - } + for (var i = 0, l = this.interactiveItems.length; i < l; i++) + { + var item = this.interactiveItems[i]; + if (item.mousemove) { + //call the function! + item.mousemove(this.mouse); + } + } } /** @@ -313,60 +307,57 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event) */ PIXI.InteractionManager.prototype.onMouseDown = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event + this.mouse.originalEvent = event || window.event; //IE uses window.event - // loop through inteaction tree... - // hit test each item! -> - // get interactive items under point?? - //stage.__i - var length = this.interactiveItems.length; - var global = this.mouse.global; + // loop through inteaction tree... + // hit test each item! -> + // get interactive items under point?? + //stage.__i + var index = 0; + var parent = this.stage; - var index = 0; - var parent = this.stage; + // while + // hit test + for (var i = 0, l = this.interactiveItems.length; i < l; i++) + { + var item = this.interactiveItems[i]; - // while - // hit test - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; + if(item.mousedown || item.click) + { + item.__mouseIsDown = true; + item.__hit = this.hitTest(item, this.mouse); - if(item.mousedown || item.click) - { - item.__mouseIsDown = true; - item.__hit = this.hitTest(item, this.mouse); + if(item.__hit) + { + //call the function! + if(item.mousedown)item.mousedown(this.mouse); + item.__isDown = true; - if(item.__hit) - { - //call the function! - if(item.mousedown)item.mousedown(this.mouse); - item.__isDown = true; - - // just the one! - if(!item.interactiveChildren)break; - } - } - } + // just the one! + if(!item.interactiveChildren)break; + } + } + } } PIXI.InteractionManager.prototype.onMouseOut = function(event) { - var length = this.interactiveItems.length; + var length = this.interactiveItems.length; - this.interactionDOMElement.style.cursor = "default"; + this.interactionDOMElement.style.cursor = "default"; - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; + for (var i = 0, l = this.interactiveItems.length; i < l; i++) + { + var item = this.interactiveItems[i]; - if(item.__isOver) - { - this.mouse.target = item; - if(item.mouseout)item.mouseout(this.mouse); - item.__isOver = false; - } - } + if(item.__isOver) + { + this.mouse.target = item; + if(item.mouseout)item.mouseout(this.mouse); + item.__isOver = false; + } + } } /** @@ -378,47 +369,43 @@ PIXI.InteractionManager.prototype.onMouseOut = function(event) */ PIXI.InteractionManager.prototype.onMouseUp = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event + this.mouse.originalEvent = event || window.event; //IE uses window.event - var global = this.mouse.global; + var up = false; + for (var i = 0, l = this.interactiveItems.length; i < l; i++) + { + var item = this.interactiveItems[i]; - var length = this.interactiveItems.length; - var up = false; + if(item.mouseup || item.mouseupoutside || item.click) + { + item.__hit = this.hitTest(item, this.mouse); - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; + if(item.__hit && !up) + { + //call the function! + if(item.mouseup) + { + item.mouseup(this.mouse); + } + if(item.__isDown) + { + if(item.click)item.click(this.mouse); + } - if(item.mouseup || item.mouseupoutside || item.click) - { - item.__hit = this.hitTest(item, this.mouse); + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.mouseupoutside)item.mouseupoutside(this.mouse); + } + } - if(item.__hit && !up) - { - //call the function! - if(item.mouseup) - { - item.mouseup(this.mouse); - } - if(item.__isDown) - { - if(item.click)item.click(this.mouse); - } - - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.mouseupoutside)item.mouseupoutside(this.mouse); - } - } - - item.__isDown = false; - } - } + item.__isDown = false; + } + } } /** @@ -431,67 +418,65 @@ PIXI.InteractionManager.prototype.onMouseUp = function(event) */ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) { - var global = interactionData.global; + var global = interactionData.global; - if(item.vcount !== PIXI.visibleCount)return false; + if(item.vcount !== PIXI.visibleCount)return false; - var isSprite = (item instanceof PIXI.Sprite), - worldTransform = item.worldTransform, - a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], - a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], - id = 1 / (a00 * a11 + a01 * -a10), - x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, - y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; + 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; - interactionData.target = item; + interactionData.target = item; - //a sprite or display object with a hit area defined - if(item.hitArea && item.hitArea.contains) { - if(item.hitArea.contains(x, y)) { - //if(isSprite) - interactionData.target = item; + //a sprite or display object with a hit area defined + if(item.hitArea && item.hitArea.contains) { + if(item.hitArea.contains(x, y)) { + //if(isSprite) + interactionData.target = item; - return true; - } + return true; + } - return false; - } - // 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; + return false; + } + // a sprite with no hitarea defined + else if(isSprite) + { + var width = item.texture.frame.width, + height = item.texture.frame.height, + x1 = -width * item.anchor.x, + y1; - if(x > x1 && x < x1 + width) - { - y1 = -height * item.anchor.y; + if(x > x1 && x < x1 + width) + { + y1 = -height * item.anchor.y; - if(y > y1 && y < y1 + height) - { - // set the target property if a hit is true! - interactionData.target = item - return true; - } - } - } + if(y > y1 && y < y1 + height) + { + // set the target property if a hit is true! + interactionData.target = item + return true; + } + } + } - var length = item.children.length; + for (var i = 0, l = item.children.length; i < l; i++) + { + var tempItem = item.children[i]; + var hit = this.hitTest(tempItem, interactionData); + if(hit) + { + // hmm.. TODO SET CORRECT TARGET? + interactionData.target = item + return true; + } + } - for (var i = 0; i < length; i++) - { - var tempItem = item.children[i]; - var hit = this.hitTest(tempItem, interactionData); - if(hit) - { - // hmm.. TODO SET CORRECT TARGET? - interactionData.target = item - return true; - } - } - - return false; + return false; } /** @@ -503,26 +488,26 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) */ PIXI.InteractionManager.prototype.onTouchMove = function(event) { - var rect = this.interactionDOMElement.getBoundingClientRect(); - var changedTouches = event.changedTouches; + var rect = this.interactionDOMElement.getBoundingClientRect(), + changedTouches = event.changedTouches, + i, l, touchEvent, touchData, item; - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - touchData.originalEvent = event || window.event; + for (i = 0, l = changedTouches.length; i < l; i++) + { + touchEvent = changedTouches[i]; + touchData = this.touchs[touchEvent.identifier]; + touchData.originalEvent = event || window.event; - // update the touch position - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - } + // update the touch position + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - var length = this.interactiveItems.length; - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - if(item.touchmove)item.touchmove(touchData); - } + for (ii = 0, ll = this.interactiveItems.length; ii < ll; ii++) + { + item = this.interactiveItems[i]; + if (item.touchmove) item.touchmove(touchData); + } + } } /** @@ -534,44 +519,42 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event) */ PIXI.InteractionManager.prototype.onTouchStart = function(event) { - var rect = this.interactionDOMElement.getBoundingClientRect(); + var rect = this.interactionDOMElement.getBoundingClientRect(), + changedTouches = event.changedTouches; - var changedTouches = event.changedTouches; - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; + for (var i = 0, l = changedTouches.length; i < l; i++) + { + var touchEvent = changedTouches[i]; - var touchData = this.pool.pop(); - if(!touchData)touchData = new PIXI.InteractionData(); + var touchData = this.pool.pop(); + if (!touchData) touchData = new PIXI.InteractionData(); - touchData.originalEvent = event || window.event; + touchData.originalEvent = event || window.event; - this.touchs[touchEvent.identifier] = touchData; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + this.touchs[touchEvent.identifier] = touchData; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - var length = this.interactiveItems.length; + for (var ii = 0, ll = this.interactiveItems.length; ii < ll; ii++) + { + var item = this.interactiveItems[ii]; - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; + if (item.touchstart || item.tap) + { + item.__hit = this.hitTest(item, touchData); - if(item.touchstart || item.tap) - { - item.__hit = this.hitTest(item, touchData); + if (item.__hit) + { + //call the function! + if (item.touchstart) item.touchstart(touchData); + item.__isDown = true; + item.__touchData = touchData; - if(item.__hit) - { - //call the function! - if(item.touchstart)item.touchstart(touchData); - item.__isDown = true; - item.__touchData = touchData; - - if(!item.interactiveChildren)break; - } - } - } - } + if(!item.interactiveChildren)break; + } + } + } + } } /** @@ -583,66 +566,60 @@ PIXI.InteractionManager.prototype.onTouchStart = function(event) */ PIXI.InteractionManager.prototype.onTouchEnd = function(event) { - //this.mouse.originalEvent = event || window.event; //IE uses window.event - var rect = this.interactionDOMElement.getBoundingClientRect(); - var changedTouches = event.changedTouches; + //this.mouse.originalEvent = event || window.event; //IE uses window.event + var rect = this.interactionDOMElement.getBoundingClientRect(), + changedTouches = event.changedTouches; - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - var up = false; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + for (var i = 0, l = changedTouches.length; i < l; i++) + { + var touchEvent = changedTouches[i]; + var touchData = this.touchs[touchEvent.identifier]; + var up = false; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - var length = this.interactiveItems.length; - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; - var itemTouchData = item.__touchData; // <-- Here! - item.__hit = this.hitTest(item, touchData); + for (var ii = 0, ll = this.interactiveItems.length; ii < ll; ii++) + { + var item = this.interactiveItems[ii]; + var itemTouchData = item.__touchData; // <-- Here! + item.__hit = this.hitTest(item, touchData); - if(itemTouchData == touchData) - { - // so this one WAS down... - touchData.originalEvent = event || window.event; - // hitTest?? + if(itemTouchData == touchData) + { + // so this one WAS down... + touchData.originalEvent = event || window.event; + // hitTest?? - if(item.touchend || item.tap) - { - if(item.__hit && !up) - { - if(item.touchend)item.touchend(touchData); - if(item.__isDown) - { - if(item.tap)item.tap(touchData); - } + if(item.touchend || item.tap) + { + if(item.__hit && !up) + { + if(item.touchend)item.touchend(touchData); + if(item.__isDown) + { + if(item.tap)item.tap(touchData); + } - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.touchendoutside)item.touchendoutside(touchData); - } - } + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.touchendoutside)item.touchendoutside(touchData); + } + } - item.__isDown = false; - } + item.__isDown = false; + } - item.__touchData = null; - - } - else - { - - } - } - // remove the touch.. - this.pool.push(touchData); - this.touchs[touchEvent.identifier] = null; - } + item.__touchData = null; + } + } + // remove the touch.. + this.pool.push(touchData); + this.touchs[touchEvent.identifier] = null; + } } /** @@ -653,32 +630,32 @@ PIXI.InteractionManager.prototype.onTouchEnd = function(event) */ PIXI.InteractionData = function() { - /** - * This point stores the global coords of where the touch/mouse event happened - * - * @property global - * @type Point - */ - this.global = new PIXI.Point(); + /** + * This point stores the global coords of where the touch/mouse event happened + * + * @property global + * @type Point + */ + this.global = new PIXI.Point(); - // this is here for legacy... but will remove - this.local = new PIXI.Point(); + // this is here for legacy... but will remove + this.local = new PIXI.Point(); - /** - * The target Sprite that was interacted with - * - * @property target - * @type Sprite - */ - this.target; + /** + * The target Sprite that was interacted with + * + * @property target + * @type Sprite + */ + this.target = null; - /** - * When passed to an event handler, this will be the original DOM Event that was captured - * - * @property originalEvent - * @type Event - */ - this.originalEvent; + /** + * When passed to an event handler, this will be the original DOM Event that was captured + * + * @property originalEvent + * @type Event + */ + this.originalEvent = null; } /** @@ -690,16 +667,16 @@ PIXI.InteractionData = function() */ PIXI.InteractionData.prototype.getLocalPosition = function(displayObject) { - var worldTransform = displayObject.worldTransform; - var global = this.global; + var worldTransform = displayObject.worldTransform; + var global = this.global; - // do a cheeky transform to get the mouse coords; - var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], + // do a cheeky transform to get the mouse coords; + var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], id = 1 / (a00 * a11 + a01 * -a10); - // set the mouse coords... - return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, - a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id) + // set the mouse coords... + return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, + a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id) } // constructor diff --git a/src/pixi/Intro.js b/src/pixi/Intro.js index ff81c3e..07d01da 100644 --- a/src/pixi/Intro.js +++ b/src/pixi/Intro.js @@ -4,4 +4,4 @@ (function(){ - var root = this; + var root = this; diff --git a/src/pixi/core/Matrix.js b/src/pixi/core/Matrix.js index 923682c..b2760c0 100644 --- a/src/pixi/core/Matrix.js +++ b/src/pixi/core/Matrix.js @@ -16,35 +16,35 @@ PIXI.mat3 = {}; PIXI.mat3.create = function() { - var matrix = new PIXI.Matrix(9); + 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; + 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; + return matrix; } PIXI.mat3.identity = function(matrix) { - 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; + 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; + return matrix; } @@ -52,76 +52,76 @@ PIXI.mat4 = {}; PIXI.mat4.create = function() { - var matrix = new PIXI.Matrix(16); + 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; + 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; + return matrix; } PIXI.mat3.multiply = function (mat, mat2, dest) { - if (!dest) { dest = mat; } + 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], + // 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]; + 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[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[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; + 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; + return dest; } PIXI.mat3.clone = function(mat) { - var matrix = new PIXI.Matrix(9); + var matrix = new PIXI.Matrix(9); - matrix[0] = mat[0]; - matrix[1] = mat[1]; - matrix[2] = mat[2]; - matrix[3] = mat[3]; - matrix[4] = mat[4]; - matrix[5] = mat[5]; - matrix[6] = mat[6]; - matrix[7] = mat[7]; - matrix[8] = mat[8]; + matrix[0] = mat[0]; + matrix[1] = mat[1]; + matrix[2] = mat[2]; + matrix[3] = mat[3]; + matrix[4] = mat[4]; + matrix[5] = mat[5]; + matrix[6] = mat[6]; + matrix[7] = mat[7]; + matrix[8] = mat[8]; - return matrix; + return matrix; } PIXI.mat3.transpose = function (mat, dest) { - // If we are transposing ourselves we can skip a few steps but have to cache some values + // If we are transposing ourselves we can skip a few steps but have to cache some values if (!dest || mat === dest) { var a01 = mat[1], a02 = mat[2], a12 = mat[5]; @@ -149,29 +149,29 @@ PIXI.mat3.transpose = function (mat, dest) PIXI.mat3.toMat4 = function (mat, dest) { - if (!dest) { dest = PIXI.mat4.create(); } + if (!dest) { dest = PIXI.mat4.create(); } - dest[15] = 1; - dest[14] = 0; - dest[13] = 0; - dest[12] = 0; + 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[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[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]; + dest[3] = 0; + dest[2] = mat[2]; + dest[1] = mat[1]; + dest[0] = mat[0]; - return dest; + return dest; } @@ -180,82 +180,82 @@ PIXI.mat3.toMat4 = function (mat, dest) PIXI.mat4.create = function() { - var matrix = new PIXI.Matrix(16); + 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; + 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; + 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]; + // 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; - } + 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; + 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; } + 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 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 + // 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; diff --git a/src/pixi/core/Point.js b/src/pixi/core/Point.js index 7c7fe2d..b1f9cd2 100644 --- a/src/pixi/core/Point.js +++ b/src/pixi/core/Point.js @@ -12,19 +12,19 @@ */ PIXI.Point = function(x, y) { - /** - * @property x - * @type Number - * @default 0 - */ - this.x = x || 0; + /** + * @property x + * @type Number + * @default 0 + */ + this.x = x || 0; - /** - * @property y - * @type Number - * @default 0 - */ - this.y = y || 0; + /** + * @property y + * @type Number + * @default 0 + */ + this.y = y || 0; } /** @@ -35,7 +35,7 @@ PIXI.Point = function(x, y) */ PIXI.Point.prototype.clone = function() { - return new PIXI.Point(this.x, this.y); + return new PIXI.Point(this.x, this.y); } // constructor diff --git a/src/pixi/core/Polygon.js b/src/pixi/core/Polygon.js index 4ef74f1..445882e 100644 --- a/src/pixi/core/Polygon.js +++ b/src/pixi/core/Polygon.js @@ -29,7 +29,7 @@ PIXI.Polygon = function(points) points = p; } - this.points = points; + this.points = points; } /** @@ -40,12 +40,12 @@ PIXI.Polygon = function(points) */ PIXI.Polygon.prototype.clone = function() { - var points = []; - for (var i=0; i= x1 && x <= x1 + this.width) - { - var y1 = this.y; + var x1 = this.x; + if(x >= x1 && x <= x1 + this.width) + { + var y1 = this.y; - if(y >= y1 && y <= y1 + this.height) - { - return true; - } - } + if(y >= y1 && y <= y1 + this.height) + { + return true; + } + } - return false; + return false; } // constructor diff --git a/src/pixi/display/DisplayObject.js b/src/pixi/display/DisplayObject.js index f7874f3..489be52 100644 --- a/src/pixi/display/DisplayObject.js +++ b/src/pixi/display/DisplayObject.js @@ -10,233 +10,233 @@ */ PIXI.DisplayObject = function() { - this.last = this; - this.first = this; + this.last = this; + this.first = this; - /** - * The coordinate of the object relative to the local coordinates of the parent. - * - * @property position - * @type Point - */ - this.position = new PIXI.Point(); + /** + * The coordinate of the object relative to the local coordinates of the parent. + * + * @property position + * @type Point + */ + this.position = new PIXI.Point(); - /** - * The scale factor of the object. - * - * @property scale - * @type Point - */ - this.scale = new PIXI.Point(1,1);//{x:1, y:1}; + /** + * The scale factor of the object. + * + * @property scale + * @type Point + */ + this.scale = new PIXI.Point(1,1);//{x:1, y:1}; - /** - * The pivot point of the displayObject that it rotates around - * - * @property pivot - * @type Point - */ - this.pivot = new PIXI.Point(0,0); + /** + * The pivot point of the displayObject that it rotates around + * + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); - /** - * The rotation of the object in radians. - * - * @property rotation - * @type Number - */ - this.rotation = 0; + /** + * The rotation of the object in radians. + * + * @property rotation + * @type Number + */ + this.rotation = 0; - /** - * The opacity of the object. - * - * @property alpha - * @type Number - */ - this.alpha = 1; + /** + * The opacity of the object. + * + * @property alpha + * @type Number + */ + this.alpha = 1; - /** - * The visibility of the object. - * - * @property visible - * @type Boolean - */ - this.visible = true; + /** + * The visibility of the object. + * + * @property visible + * @type Boolean + */ + this.visible = true; - /** - * This is the defined area that will pick up mouse / touch events. It is null by default. - * Setting 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) - * - * @property hitArea - * @type Rectangle|Circle|Ellipse|Polygon - */ - this.hitArea = null; + /** + * This is the defined area that will pick up mouse / touch events. It is null by default. + * Setting 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) + * + * @property hitArea + * @type Rectangle|Circle|Ellipse|Polygon + */ + this.hitArea = null; - /** - * This is used to indicate if the displayObject should display a mouse hand cursor on rollover - * - * @property buttonMode - * @type Boolean - */ - this.buttonMode = false; + /** + * This is used to indicate if the displayObject should display a mouse hand cursor on rollover + * + * @property buttonMode + * @type Boolean + */ + this.buttonMode = false; - /** - * Can this object be rendered - * - * @property renderable - * @type Boolean - */ - this.renderable = false; + /** + * Can this object be rendered + * + * @property renderable + * @type Boolean + */ + this.renderable = false; - /** - * [read-only] The display object container that contains this display object. - * - * @property parent - * @type DisplayObjectContainer - * @readOnly - */ - this.parent = null; + /** + * [read-only] The display object container that contains this display object. + * + * @property parent + * @type DisplayObjectContainer + * @readOnly + */ + this.parent = null; - /** - * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. - * - * @property stage - * @type Stage - * @readOnly - */ - this.stage = null; + /** + * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. + * + * @property stage + * @type Stage + * @readOnly + */ + this.stage = null; - /** - * [read-only] The multiplied alpha of the displayobject - * - * @property worldAlpha - * @type Number - * @readOnly - */ - this.worldAlpha = 1; + /** + * [read-only] The multiplied alpha of the displayobject + * + * @property worldAlpha + * @type Number + * @readOnly + */ + this.worldAlpha = 1; - /** - * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property - * - * @property _interactive - * @type Boolean - * @readOnly - * @private - */ - this._interactive = false; + /** + * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property + * + * @property _interactive + * @type Boolean + * @readOnly + * @private + */ + this._interactive = false; - /** - * [read-only] Current transform of the object based on world (parent) factors - * - * @property worldTransform - * @type Mat3 - * @readOnly - * @private - */ - this.worldTransform = PIXI.mat3.create()//mat3.identity(); + /** + * [read-only] Current transform of the object based on world (parent) factors + * + * @property worldTransform + * @type Mat3 + * @readOnly + * @private + */ + this.worldTransform = PIXI.mat3.create()//mat3.identity(); - /** - * [read-only] Current transform of the object locally - * - * @property localTransform - * @type Mat3 - * @readOnly - * @private - */ - this.localTransform = PIXI.mat3.create()//mat3.identity(); + /** + * [read-only] Current transform of the object locally + * + * @property localTransform + * @type Mat3 + * @readOnly + * @private + */ + this.localTransform = PIXI.mat3.create()//mat3.identity(); - /** - * [NYI] Unkown - * - * @property color - * @type Array<> - * @private - */ - this.color = []; + /** + * [NYI] Unkown + * + * @property color + * @type Array<> + * @private + */ + this.color = []; - /** - * [NYI] Holds whether or not this object is dynamic, for rendering optimization - * - * @property dynamic - * @type Boolean - * @private - */ - this.dynamic = true; + /** + * [NYI] Holds whether or not this object is dynamic, for rendering optimization + * + * @property dynamic + * @type Boolean + * @private + */ + this.dynamic = true; - // chach that puppy! - this._sr = 0; - this._cr = 1; + // chach that puppy! + this._sr = 0; + this._cr = 1; - /* - * MOUSE Callbacks - */ + /* + * MOUSE Callbacks + */ - /** - * A callback that is used when the users clicks on the displayObject with their mouse - * @method click - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users clicks on the displayObject with their mouse + * @method click + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user clicks the mouse down over the sprite - * @method mousedown - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user clicks the mouse down over the sprite + * @method mousedown + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the mouse that was over the displayObject - * for this callback to be fired the mouse must have been pressed down over the displayObject - * @method mouseup - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases the mouse that was over the displayObject + * for this callback to be fired the mouse must have been pressed down over the displayObject + * @method mouseup + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject - * for this callback to be fired, The touch must have started over the displayObject - * @method mouseupoutside - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject + * for this callback to be fired, The touch must have started over the displayObject + * @method mouseupoutside + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the users mouse rolls over the displayObject - * @method mouseover - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users mouse rolls over the displayObject + * @method mouseover + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the users mouse leaves the displayObject - * @method mouseout - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users mouse leaves the displayObject + * @method mouseout + * @param interactionData {InteractionData} + */ - /* - * TOUCH Callbacks - */ + /* + * TOUCH Callbacks + */ - /** - * A callback that is used when the users taps on the sprite with their finger - * basically a touch version of click - * @method tap - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users taps on the sprite with their finger + * basically a touch version of click + * @method tap + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user touch's over the displayObject - * @method touchstart - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user touch's over the displayObject + * @method touchstart + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases a touch over the displayObject - * @method touchend - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases a touch over the displayObject + * @method touchend + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the touch that was over the displayObject - * for this callback to be fired, The touch must have started over the sprite - * @method touchendoutside - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases the touch that was over the displayObject + * for this callback to be fired, The touch must have started over the sprite + * @method touchendoutside + * @param interactionData {InteractionData} + */ } // constructor @@ -252,7 +252,7 @@ PIXI.DisplayObject.prototype.constructor = PIXI.DisplayObject; */ PIXI.DisplayObject.prototype.setInteractive = function(interactive) { - this.interactive = interactive; + this.interactive = interactive; } /** @@ -267,11 +267,11 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'interactive', { return this._interactive; }, set: function(value) { - this._interactive = value; + this._interactive = value; - // TODO more to be done here.. - // need to sort out a re-crawl! - if(this.stage)this.stage.dirty = true; + // TODO more to be done here.. + // need to sort out a re-crawl! + if(this.stage)this.stage.dirty = true; } }); @@ -293,11 +293,11 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'mask', { if(value) { - this.addFilter(value) + this.addFilter(value) } else { - this.removeFilter(); + this.removeFilter(); } } }); @@ -311,93 +311,88 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'mask', { */ PIXI.DisplayObject.prototype.addFilter = function(mask) { - if(this.filter)return; - this.filter = true; + if(this.filter)return; + this.filter = true; - // insert a filter block.. - var start = new PIXI.FilterBlock(); - var end = new PIXI.FilterBlock(); + // insert a filter block.. + var start = new PIXI.FilterBlock(); + var end = new PIXI.FilterBlock(); - start.mask = mask; - end.mask = mask; + start.mask = mask; + end.mask = mask; - start.first = start.last = this; - end.first = end.last = this; + start.first = start.last = this; + end.first = end.last = this; - start.open = true; + start.open = true; - /* - * insert start - */ + /* + * insert start + */ + var childFirst, childLast, nextObject, previousObject; + childFirst = childLast = start; - var childFirst = start - var childLast = start - var nextObject; - var previousObject; + previousObject = this.first._iPrev; - previousObject = this.first._iPrev; + if(previousObject) + { + nextObject = previousObject._iNext; + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; + } + else + { + nextObject = this; + } - if(previousObject) - { - nextObject = previousObject._iNext; - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; - } - else - { - nextObject = this; - } - - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } - // now insert the end filter block.. + // now insert the end filter block.. - /* - * insert end filter - */ - var childFirst = end - var childLast = end - var nextObject = null; - var previousObject = null; + /* + * insert end filter + */ + childFirst = childLast = end + nextObject = previousObject = null; - previousObject = this.last; - nextObject = previousObject._iNext; + previousObject = this.last; + nextObject = previousObject._iNext; - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; - var updateLast = this; + var updateLast = this; - var prevLast = this.last; - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = end; - } - updateLast = updateLast.parent; - } + var prevLast = this.last; + while(updateLast) + { + if(updateLast.last == prevLast) + { + updateLast.last = end; + } + updateLast = updateLast.parent; + } - this.first = start; + this.first = start; - // if webGL... - if(this.__renderGroup) - { - this.__renderGroup.addFilterBlocks(start, end); - } + // if webGL... + if(this.__renderGroup) + { + this.__renderGroup.addFilterBlocks(start, end); + } - mask.renderable = false; + mask.renderable = false; } @@ -409,49 +404,47 @@ PIXI.DisplayObject.prototype.addFilter = function(mask) */ PIXI.DisplayObject.prototype.removeFilter = function() { - if(!this.filter)return; - this.filter = false; + if(!this.filter)return; + this.filter = false; - // modify the list.. - var startBlock = this.first; + // modify the list.. + var startBlock = this.first, + lastBlock = this.last, + nextObject = startBlock._iNext, + previousObject = startBlock._iPrev; - var nextObject = startBlock._iNext; - var previousObject = startBlock._iPrev; + if (nextObject) nextObject._iPrev = previousObject; + if (previousObject) previousObject._iNext = nextObject; - if(nextObject)nextObject._iPrev = previousObject; - if(previousObject)previousObject._iNext = nextObject; - - this.first = startBlock._iNext; + this.first = startBlock._iNext; - // remove the end filter - var lastBlock = this.last; + // remove the end filter + nextObject = lastBlock._iNext; + previousObject = lastBlock._iPrev; - var nextObject = lastBlock._iNext; - var previousObject = lastBlock._iPrev; + if (nextObject) nextObject._iPrev = previousObject; + previousObject._iNext = nextObject; - if(nextObject)nextObject._iPrev = previousObject; - previousObject._iNext = nextObject; + // this is always true too! + var tempLast = lastBlock._iPrev; + // need to make sure the parents last is updated too + var updateLast = this; + while(updateLast.last == lastBlock) + { + updateLast.last = tempLast; + updateLast = updateLast.parent; + if(!updateLast)break; + } - // this is always true too! - var tempLast = lastBlock._iPrev; - // need to make sure the parents last is updated too - var updateLast = this; - while(updateLast.last == lastBlock) - { - updateLast.last = tempLast; - updateLast = updateLast.parent; - if(!updateLast)break; - } + var mask = startBlock.mask + mask.renderable = true; - var mask = startBlock.mask - mask.renderable = true; - - // if webGL... - if(this.__renderGroup) - { - this.__renderGroup.removeFilterBlocks(startBlock, lastBlock); - } + // if webGL... + if(this.__renderGroup) + { + this.__renderGroup.removeFilterBlocks(startBlock, lastBlock); + } } /* @@ -462,27 +455,27 @@ PIXI.DisplayObject.prototype.removeFilter = function() */ PIXI.DisplayObject.prototype.updateTransform = function() { - // TODO OPTIMIZE THIS!! with dirty - if(this.rotation !== this.rotationCache) - { - this.rotationCache = this.rotation; - this._sr = Math.sin(this.rotation); - this._cr = Math.cos(this.rotation); - } + // TODO OPTIMIZE THIS!! with dirty + if(this.rotation !== this.rotationCache) + { + this.rotationCache = this.rotation; + this._sr = Math.sin(this.rotation); + this._cr = Math.cos(this.rotation); + } - var localTransform = this.localTransform; - var parentTransform = this.parent.worldTransform; - var worldTransform = this.worldTransform; - //console.log(localTransform) - localTransform[0] = this._cr * this.scale.x; - localTransform[1] = -this._sr * this.scale.y - localTransform[3] = this._sr * this.scale.x; - localTransform[4] = this._cr * this.scale.y; + var localTransform = this.localTransform; + var parentTransform = this.parent.worldTransform; + var worldTransform = this.worldTransform; + //console.log(localTransform) + localTransform[0] = this._cr * this.scale.x; + localTransform[1] = -this._sr * this.scale.y + localTransform[3] = this._sr * this.scale.x; + localTransform[4] = this._cr * this.scale.y; - // TODO --> do we even need a local matrix??? + // TODO --> do we even need a local matrix??? - var px = this.pivot.x; - var py = this.pivot.y; + var px = this.pivot.x; + var py = this.pivot.y; // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = this.position.x - localTransform[0] * px - py * localTransform[1], @@ -491,8 +484,8 @@ PIXI.DisplayObject.prototype.updateTransform = function() b00 = parentTransform[0], b01 = parentTransform[1], b02 = parentTransform[2], b10 = parentTransform[3], b11 = parentTransform[4], b12 = parentTransform[5]; - localTransform[2] = a02 - localTransform[5] = a12 + localTransform[2] = a02 + localTransform[5] = a12 worldTransform[0] = b00 * a00 + b01 * a10; worldTransform[1] = b00 * a01 + b01 * a11; @@ -502,11 +495,11 @@ PIXI.DisplayObject.prototype.updateTransform = function() worldTransform[4] = b10 * a01 + b11 * a11; worldTransform[5] = b10 * a02 + b11 * a12 + b12; - // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! - // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! + // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); + this.worldAlpha = this.alpha * this.parent.worldAlpha; - this.vcount = PIXI.visibleCount; + this.vcount = PIXI.visibleCount; } diff --git a/src/pixi/display/DisplayObjectContainer.js b/src/pixi/display/DisplayObjectContainer.js index a438b3f..e2c295d 100644 --- a/src/pixi/display/DisplayObjectContainer.js +++ b/src/pixi/display/DisplayObjectContainer.js @@ -13,16 +13,16 @@ */ PIXI.DisplayObjectContainer = function() { - PIXI.DisplayObject.call( this ); + PIXI.DisplayObject.call( this ); - /** - * [read-only] The of children of this container. - * - * @property children - * @type Array - * @readOnly - */ - this.children = []; + /** + * [read-only] The of children of this container. + * + * @property children + * @type Array + * @readOnly + */ + this.children = []; } // constructor @@ -49,83 +49,80 @@ Object.defineProperty(PIXI.DisplayObjectContainer.prototype, 'visible', { */ PIXI.DisplayObjectContainer.prototype.addChild = function(child) { - if(child.parent != undefined) - { + if (child.parent) { + //// COULD BE THIS??? + child.parent.removeChild(child); + // return; + } + child.parent = this; - //// COULD BE THIS??? - child.parent.removeChild(child); - // return; - } + this.children.push(child); - child.parent = this; + // update the stage refference.. - this.children.push(child); + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = this.stage; + tmpChild = tmpChild._iNext; + } + while(tmpChild) + } - // update the stage refference.. + // LINKED LIST // - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = this.stage; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } + // modify the list.. + var childFirst = child.first + var childLast = child.last; + var nextObject; + var previousObject; - // LINKED LIST // + // this could be wrong if there is a filter?? + if(this.filter) + { + previousObject = this.last._iPrev; + } + else + { + previousObject = this.last; + } - // modify the list.. - var childFirst = child.first - var childLast = child.last; - var nextObject; - var previousObject; + nextObject = previousObject._iNext; - // this could be wrong if there is a filter?? - if(this.filter) - { - previousObject = this.last._iPrev; - } - else - { - previousObject = this.last; - } + // always true in this case + // need to make sure the parents last is updated too + var updateLast = this; + var prevLast = previousObject; - nextObject = previousObject._iNext; + while(updateLast) + { + if(updateLast.last == prevLast) + { + updateLast.last = child.last; + } + updateLast = updateLast.parent; + } - // always true in this case - // need to make sure the parents last is updated too - var updateLast = this; - var prevLast = previousObject; + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = child.last; - } - updateLast = updateLast.parent; - } + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } - - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; - - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } @@ -138,82 +135,81 @@ PIXI.DisplayObjectContainer.prototype.addChild = function(child) */ PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) { - if(index >= 0 && index <= this.children.length) - { - if(child.parent != undefined) - { - child.parent.removeChild(child); - } - child.parent = this; + if(index >= 0 && index <= this.children.length) + { + if (child.parent) { + child.parent.removeChild(child); + } + child.parent = this; - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = this.stage; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = this.stage; + tmpChild = tmpChild._iNext; + } + while(tmpChild) + } - // modify the list.. - var childFirst = child.first; - var childLast = child.last; - var nextObject; - var previousObject; + // modify the list.. + var childFirst = child.first; + var childLast = child.last; + var nextObject; + var previousObject; - if(index == this.children.length) - { - previousObject = this.last; - var updateLast = this; - var prevLast = this.last; - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = child.last; - } - updateLast = updateLast.parent; - } - } - else if(index == 0) - { - previousObject = this; - } - else - { - previousObject = this.children[index-1].last; - } + if(index === this.children.length) + { + previousObject = this.last; + var updateLast = this; + var prevLast = this.last; + while(updateLast) + { + if(updateLast.last == prevLast) + { + updateLast.last = child.last; + } + updateLast = updateLast.parent; + } + } + else if(!index) + { + previousObject = this; + } + else + { + previousObject = this.children[index-1].last; + } - nextObject = previousObject._iNext; + nextObject = previousObject._iNext; - // always true in this case - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } + // always true in this case + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; - this.children.splice(index, 0, child); - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } + this.children.splice(index, 0, child); + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } - } - else - { - throw new Error(child + " The index "+ index +" supplied is out of bounds " + this.children.length); - } + } + else + { + throw new Error(child + " The index "+ index +" supplied is out of bounds " + this.children.length); + } } /** @@ -226,43 +222,43 @@ PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) */ PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) { - /* - * this funtion needs to be recoded.. - * can be done a lot faster.. - */ - return; + /* + * this funtion needs to be recoded.. + * can be done a lot faster.. + */ + return; - // need to fix this function :/ - /* - // TODO I already know this?? - var index = this.children.indexOf( child ); - var index2 = this.children.indexOf( child2 ); + // need to fix this function :/ + /* + // TODO I already know this?? + var index = this.children.indexOf( child ); + var index2 = this.children.indexOf( child2 ); - if ( index !== -1 && index2 !== -1 ) - { - // cool + if ( index !== -1 && index2 !== -1 ) + { + // cool - /* - if(this.stage) - { - // this is to satisfy the webGL batching.. - // TODO sure there is a nicer way to achieve this! - this.stage.__removeChild(child); - this.stage.__removeChild(child2); + /* + if(this.stage) + { + // this is to satisfy the webGL batching.. + // TODO sure there is a nicer way to achieve this! + this.stage.__removeChild(child); + this.stage.__removeChild(child2); - this.stage.__addChild(child); - this.stage.__addChild(child2); - } + this.stage.__addChild(child); + this.stage.__addChild(child2); + } - // swap the positions.. - this.children[index] = child2; - this.children[index2] = child; + // swap the positions.. + this.children[index] = child2; + this.children[index2] = child; - } - else - { - throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); - }*/ + } + else + { + throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); + }*/ } /** @@ -273,14 +269,14 @@ PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) */ PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) { - if(index >= 0 && index < this.children.length) - { - return this.children[index]; - } - else - { - throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); - } + if(index >= 0 && index < this.children.length) + { + return this.children[index]; + } + else + { + throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); + } } /** @@ -291,62 +287,62 @@ PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) */ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { - var index = this.children.indexOf( child ); - if ( index !== -1 ) - { - // unlink // - // modify the list.. - var childFirst = child.first; - var childLast = child.last; + var index = this.children.indexOf( child ); + if ( index !== -1 ) + { + // unlink // + // modify the list.. + var childFirst = child.first; + var childLast = child.last; - var nextObject = childLast._iNext; - var previousObject = childFirst._iPrev; + var nextObject = childLast._iNext; + var previousObject = childFirst._iPrev; - if(nextObject)nextObject._iPrev = previousObject; - previousObject._iNext = nextObject; + if(nextObject)nextObject._iPrev = previousObject; + previousObject._iNext = nextObject; - if(this.last == childLast) - { - var tempLast = childFirst._iPrev; - // need to make sure the parents last is updated too - var updateLast = this; - while(updateLast.last == childLast.last) - { - updateLast.last = tempLast; - updateLast = updateLast.parent; - if(!updateLast)break; - } - } + if(this.last == childLast) + { + var tempLast = childFirst._iPrev; + // need to make sure the parents last is updated too + var updateLast = this; + while(updateLast.last == childLast.last) + { + updateLast.last = tempLast; + updateLast = updateLast.parent; + if(!updateLast)break; + } + } - childLast._iNext = null; - childFirst._iPrev = null; + childLast._iNext = null; + childFirst._iPrev = null; - // update the stage reference.. - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = null; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } + // update the stage reference.. + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = null; + tmpChild = tmpChild._iNext; + } + while(tmpChild) + } - // webGL trim - if(child.__renderGroup) - { - child.__renderGroup.removeDisplayObjectAndChildren(child); - } + // webGL trim + if(child.__renderGroup) + { + child.__renderGroup.removeDisplayObjectAndChildren(child); + } - child.parent = undefined; - this.children.splice( index, 1 ); - } - else - { - throw new Error(child + " The supplied DisplayObject must be a child of the caller " + this); - } + child.parent = undefined; + this.children.splice( index, 1 ); + } + else + { + throw new Error(child + " The supplied DisplayObject must be a child of the caller " + this); + } } /* @@ -357,12 +353,12 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) */ PIXI.DisplayObjectContainer.prototype.updateTransform = function() { - if(!this.visible)return; + if(!this.visible)return; - PIXI.DisplayObject.prototype.updateTransform.call( this ); + PIXI.DisplayObject.prototype.updateTransform.call( this ); - for(var i=0,j=this.children.length; i= this.textures.length) - { - this.gotoAndStop(this.textures.length - 1); - if(this.onComplete) - { - this.onComplete(); - } - } + if(this.loop || round < this.textures.length) + { + this.setTexture(this.textures[round % this.textures.length]); + } + else if(round >= this.textures.length) + { + this.gotoAndStop(this.textures.length - 1); + if(this.onComplete) + { + this.onComplete(); + } + } } \ No newline at end of file diff --git a/src/pixi/display/Sprite.js b/src/pixi/display/Sprite.js index f88b628..c66c473 100644 --- a/src/pixi/display/Sprite.js +++ b/src/pixi/display/Sprite.js @@ -18,65 +18,65 @@ PIXI.blendModes.SCREEN = 1; */ PIXI.Sprite = function(texture) { - PIXI.DisplayObjectContainer.call( this ); + PIXI.DisplayObjectContainer.call( this ); - /** - * The anchor sets the origin point of the texture. - * The default is 0,0 this means the textures origin is the top left - * Setting than anchor to 0.5,0.5 means the textures origin is centered - * Setting the anchor to 1,1 would mean the textures origin points will be the bottom right - * + /** + * The anchor sets the origin point of the texture. + * The default is 0,0 this means the textures origin is the top left + * Setting than anchor to 0.5,0.5 means the textures origin is centered + * Setting the anchor to 1,1 would mean the textures origin points will be the bottom right + * * @property anchor * @type Point */ - this.anchor = new PIXI.Point(); + this.anchor = new PIXI.Point(); - /** - * The texture that the sprite is using - * - * @property texture - * @type Texture - */ - this.texture = texture; + /** + * The texture that the sprite is using + * + * @property texture + * @type Texture + */ + this.texture = texture; - /** - * The blend mode of sprite. - * currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN - * - * @property blendMode - * @type Number - */ - this.blendMode = PIXI.blendModes.NORMAL; + /** + * The blend mode of sprite. + * currently supports PIXI.blendModes.NORMAL and PIXI.blendModes.SCREEN + * + * @property blendMode + * @type Number + */ + this.blendMode = PIXI.blendModes.NORMAL; - /** - * The width of the sprite (this is initially set by the texture) - * - * @property _width - * @type Number - * @private - */ - this._width = 0; + /** + * The width of the sprite (this is initially set by the texture) + * + * @property _width + * @type Number + * @private + */ + this._width = 0; - /** - * The height of the sprite (this is initially set by the texture) - * - * @property _height - * @type Number - * @private - */ - this._height = 0; + /** + * The height of the sprite (this is initially set by the texture) + * + * @property _height + * @type Number + * @private + */ + this._height = 0; - if(texture.baseTexture.hasLoaded) - { - this.updateFrame = true; - } - else - { - this.onTextureUpdateBind = this.onTextureUpdate.bind(this); - this.texture.addEventListener( 'update', this.onTextureUpdateBind ); - } + if(texture.baseTexture.hasLoaded) + { + this.updateFrame = true; + } + else + { + this.onTextureUpdateBind = this.onTextureUpdate.bind(this); + this.texture.addEventListener( 'update', this.onTextureUpdateBind ); + } - this.renderable = true; + this.renderable = true; } // constructor @@ -94,7 +94,7 @@ Object.defineProperty(PIXI.Sprite.prototype, 'width', { return this.scale.x * this.texture.frame.width; }, set: function(value) { - this.scale.x = value / this.texture.frame.width + this.scale.x = value / this.texture.frame.width this._width = value; } }); @@ -110,7 +110,7 @@ Object.defineProperty(PIXI.Sprite.prototype, 'height', { return this.scale.y * this.texture.frame.height; }, set: function(value) { - this.scale.y = value / this.texture.frame.height + this.scale.y = value / this.texture.frame.height this._height = value; } }); @@ -123,23 +123,23 @@ Object.defineProperty(PIXI.Sprite.prototype, 'height', { */ PIXI.Sprite.prototype.setTexture = function(texture) { - // stop current texture; - if(this.texture.baseTexture != texture.baseTexture) - { - this.textureChange = true; - this.texture = texture; + // stop current texture; + if(this.texture.baseTexture != texture.baseTexture) + { + this.textureChange = true; + this.texture = texture; - if(this.__renderGroup) - { - this.__renderGroup.updateTexture(this); - } - } - else - { - this.texture = texture; - } + if(this.__renderGroup) + { + this.__renderGroup.updateTexture(this); + } + } + else + { + this.texture = texture; + } - this.updateFrame = true; + this.updateFrame = true; } /** @@ -151,13 +151,13 @@ PIXI.Sprite.prototype.setTexture = function(texture) */ PIXI.Sprite.prototype.onTextureUpdate = function(event) { - //this.texture.removeEventListener( 'update', this.onTextureUpdateBind ); + //this.texture.removeEventListener( 'update', this.onTextureUpdateBind ); - // so if _width is 0 then width was not set.. - if(this._width)this.scale.x = this._width / this.texture.frame.width; - if(this._height)this.scale.y = this._height / this.texture.frame.height; + // so if _width is 0 then width was not set.. + if(this._width)this.scale.x = this._width / this.texture.frame.width; + if(this._height)this.scale.y = this._height / this.texture.frame.height; - this.updateFrame = true; + this.updateFrame = true; } // some helper functions.. @@ -174,9 +174,9 @@ PIXI.Sprite.prototype.onTextureUpdate = function(event) */ PIXI.Sprite.fromFrame = function(frameId) { - var texture = PIXI.TextureCache[frameId]; - if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache" + this); - return new PIXI.Sprite(texture); + var texture = PIXI.TextureCache[frameId]; + if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache" + this); + return new PIXI.Sprite(texture); } /** @@ -191,7 +191,7 @@ PIXI.Sprite.fromFrame = function(frameId) */ PIXI.Sprite.fromImage = function(imageId) { - var texture = PIXI.Texture.fromImage(imageId); - return new PIXI.Sprite(texture); + var texture = PIXI.Texture.fromImage(imageId); + return new PIXI.Sprite(texture); } diff --git a/src/pixi/display/Stage.js b/src/pixi/display/Stage.js index 222e25f..ca681aa 100644 --- a/src/pixi/display/Stage.js +++ b/src/pixi/display/Stage.js @@ -9,58 +9,58 @@ * @extends DisplayObjectContainer * @constructor * @param backgroundColor {Number} the background color of the stage, easiest way to pass this in is in hex format - * like: 0xFFFFFF for white + * like: 0xFFFFFF for white */ PIXI.Stage = function(backgroundColor) { - PIXI.DisplayObjectContainer.call( this ); + PIXI.DisplayObjectContainer.call( this ); - /** - * [read-only] Current transform of the object based on world (parent) factors - * - * @property worldTransform - * @type Mat3 - * @readOnly - * @private - */ - this.worldTransform = PIXI.mat3.create(); + /** + * [read-only] Current transform of the object based on world (parent) factors + * + * @property worldTransform + * @type Mat3 + * @readOnly + * @private + */ + this.worldTransform = PIXI.mat3.create(); - /** - * Whether or not the stage is interactive - * - * @property interactive - * @type Boolean - */ - this.interactive = true; + /** + * Whether or not the stage is interactive + * + * @property interactive + * @type Boolean + */ + this.interactive = true; - /** - * The interaction manage for this stage, manages all interactive activity on the stage - * - * @property interactive - * @type InteractionManager - */ - this.interactionManager = new PIXI.InteractionManager(this); + /** + * The interaction manage for this stage, manages all interactive activity on the stage + * + * @property interactive + * @type InteractionManager + */ + this.interactionManager = new PIXI.InteractionManager(this); - /** - * Whether the stage is dirty and needs to have interactions updated - * - * @property dirty - * @type Boolean - * @private - */ - this.dirty = true; + /** + * Whether the stage is dirty and needs to have interactions updated + * + * @property dirty + * @type Boolean + * @private + */ + this.dirty = true; - this.__childrenAdded = []; - this.__childrenRemoved = []; + this.__childrenAdded = []; + this.__childrenRemoved = []; - //the stage is it's own stage - this.stage = this; + //the stage is it's own stage + this.stage = this; - //optimize hit detection a bit - this.stage.hitArea = new PIXI.Rectangle(0,0,100000, 100000); + //optimize hit detection a bit + this.stage.hitArea = new PIXI.Rectangle(0,0,100000, 100000); - this.setBackgroundColor(backgroundColor); - this.worldVisible = true; + this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -76,7 +76,7 @@ PIXI.Stage.prototype.constructor = PIXI.Stage; */ PIXI.Stage.prototype.setInteractionDelegate = function(domElement) { - this.interactionManager.setTargetDomElement( domElement ); + this.interactionManager.setTargetDomElement( domElement ); } /* @@ -87,23 +87,23 @@ PIXI.Stage.prototype.setInteractionDelegate = function(domElement) */ PIXI.Stage.prototype.updateTransform = function() { - this.worldAlpha = 1; - this.vcount = PIXI.visibleCount; + this.worldAlpha = 1; + this.vcount = PIXI.visibleCount; - for(var i=0,j=this.children.length; i 1)ratio = 1; - perp.y = -(nextPoint.x - lastPoint.x); - perp.x = nextPoint.y - lastPoint.y; + perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); + num = this.texture.height/2//(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; + perp.x /= perpLength; + perp.y /= perpLength; - var ratio = (1 - (i / (total-1))) * 10; - if(ratio > 1)ratio = 1; + perp.x *= num; + perp.y *= num; - var perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); - var num = this.texture.height/2//(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; - perp.x /= perpLength; - perp.y /= perpLength; + verticies[index] = point.x + perp.x + verticies[index+1] = point.y + perp.y + verticies[index+2] = point.x - perp.x + verticies[index+3] = point.y - perp.y - perp.x *= num; - perp.y *= num; + lastPoint = point; + } - verticies[index] = point.x + perp.x - verticies[index+1] = point.y + perp.y - verticies[index+2] = point.x - perp.x - verticies[index+3] = point.y - perp.y - - lastPoint = point; - } - - PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); + PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); } PIXI.Rope.prototype.setTexture = function(texture) { - // stop current texture - this.texture = texture; - this.updateFrame = true; + // stop current texture + this.texture = texture; + this.updateFrame = true; } diff --git a/src/pixi/extras/Spine.js b/src/pixi/extras/Spine.js index 27995ae..61a00c7 100644 --- a/src/pixi/extras/Spine.js +++ b/src/pixi/extras/Spine.js @@ -7,6 +7,1350 @@ * */ +/* + * 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), 10); + 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) 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) 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) 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) 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, + amount; + + 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. + 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); + + 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; + }, + 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]; + 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 (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 ? this.bones[0] : 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].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 = { + defaultMix: 0, + 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 : this.defaultMix; + } +}; + +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 ? this.queue[this.queue.length - 1].animation : this.current; + 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) { + /*jshint -W069*/ + var skeletonData = new spine.SkeletonData(), + boneData; + + // 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"]; + } + 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 (i = 0, n = slots.length; i < n; i++) { + var slotMap = slots[i]; + 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) { + /*jshint -W069*/ + name = map["name"] || name; + + var type = spine.AttachmentType[map["type"] || "region"]; + + if (type == spine.AttachmentType.region) { + var attachment = new spine.RegionAttachment(); + 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(); + + attachment.rendererObject = {}; + attachment.rendererObject.name = name; + attachment.rendererObject.scale = {}; + attachment.rendererObject.scale.x = attachment.scaleX; + attachment.rendererObject.scale.y = attachment.scaleY; + attachment.rendererObject.rotation = -attachment.rotation * Math.PI / 180; + return attachment; + } + + throw "Unknown attachment type: " + type; + }, + + readAnimation: function (name, map, skeletonData) { + /*jshint -W069*/ + var timelines = []; + var duration = 0; + var frameIndex, timeline, timelineName, valueMap, values, + i, n; + + 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 (timelineName in boneMap) { + if (!boneMap.hasOwnProperty(timelineName)) continue; + values = boneMap[timelineName]; + if (timelineName == "rotate") { + timeline = new spine.RotateTimeline(values.length); + timeline.boneIndex = boneIndex; + + frameIndex = 0; + for (i = 0, n = values.length; i < n; i++) { + 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 timelineScale = 1; + if (timelineName == "scale") + timeline = new spine.ScaleTimeline(values.length); + else { + timeline = new spine.TranslateTimeline(values.length); + timelineScale = this.scale; + } + timeline.boneIndex = boneIndex; + + frameIndex = 0; + for (i = 0, n = values.length; i < n; i++) { + 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 (timelineName in slotMap) { + if (!slotMap.hasOwnProperty(timelineName)) continue; + values = slotMap[timelineName]; + if (timelineName == "color") { + timeline = new spine.ColorTimeline(values.length); + timeline.slotIndex = slotIndex; + + frameIndex = 0; + for (i = 0, n = values.length; i < n; i++) { + 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") { + timeline = new spine.AttachmentTimeline(values.length); + timeline.slotIndex = slotIndex; + + frameIndex = 0; + for (i = 0, n = values.length; i < n; i++) { + valueMap = values[i]; + timeline.setFrame(frameIndex++, valueMap["time"], valueMap["name"]); + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[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) { + /*jshint -W069*/ + 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) + 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], 10); + var y = parseInt(tuple[1], 10); + + reader.readTuple(tuple); + var width = parseInt(tuple[0], 10); + var height = parseInt(tuple[1], 10); + + 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], 10), parseInt(tuple[1], 10), parseInt(tuple[2], 10), parseInt(tuple[3], 10)]; + + if (reader.readTuple(tuple) == 4) { // pad is optional, but only present with splits + region.pads = [parseInt(tuple[0], 10), parseInt(tuple[1], 10), parseInt(tuple[2], 10), parseInt(tuple[3], 10)]; + + reader.readTuple(tuple); + } + } + + region.originalWidth = parseInt(tuple[0], 10); + region.originalHeight = parseInt(tuple[1], 10); + + reader.readTuple(tuple); + region.offsetX = parseInt(tuple[0], 10); + region.offsetY = parseInt(tuple[1], 10); + + region.index = parseInt(reader.readValue(), 10); + + 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) 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; + } +} + +spine.Bone.yDown = true; +PIXI.AnimCache = {}; + /** * 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 @@ -18,37 +1362,37 @@ * @param url {String} The url of the spine anim file to be used */ PIXI.Spine = function (url) { - PIXI.DisplayObjectContainer.call(this); + PIXI.DisplayObjectContainer.call(this); - this.spineData = PIXI.AnimCache[url]; + this.spineData = PIXI.AnimCache[url]; - if (!this.spineData) { - throw new Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: " + url); - } + if (!this.spineData) { + throw new Error("Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: " + url); + } - this.skeleton = new spine.Skeleton(this.spineData); - this.skeleton.updateWorldTransform(); + this.skeleton = new spine.Skeleton(this.spineData); + this.skeleton.updateWorldTransform(); - this.stateData = new spine.AnimationStateData(this.spineData); - this.state = new spine.AnimationState(this.stateData); + this.stateData = new spine.AnimationStateData(this.spineData); + this.state = new spine.AnimationState(this.stateData); - this.slotContainers = []; + this.slotContainers = []; - for (var i = 0, n = this.skeleton.drawOrder.length; i < n; i++) { - var slot = this.skeleton.drawOrder[i]; - var attachment = slot.attachment; - var slotContainer = new PIXI.DisplayObjectContainer(); - this.slotContainers.push(slotContainer); - this.addChild(slotContainer); - if (!(attachment instanceof spine.RegionAttachment)) { - continue; - } - var spriteName = attachment.rendererObject.name; - var sprite = this.createSprite(slot, attachment.rendererObject); - slot.currentSprite = sprite; - slot.currentSpriteName = spriteName; - slotContainer.addChild(sprite); - } + for (var i = 0, n = this.skeleton.drawOrder.length; i < n; i++) { + var slot = this.skeleton.drawOrder[i]; + var attachment = slot.attachment; + var slotContainer = new PIXI.DisplayObjectContainer(); + this.slotContainers.push(slotContainer); + this.addChild(slotContainer); + if (!(attachment instanceof spine.RegionAttachment)) { + continue; + } + var spriteName = attachment.rendererObject.name; + var sprite = this.createSprite(slot, attachment.rendererObject); + slot.currentSprite = sprite; + slot.currentSpriteName = spriteName; + slotContainer.addChild(sprite); + } }; PIXI.Spine.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); @@ -61,1400 +1405,65 @@ PIXI.Spine.prototype.constructor = PIXI.Spine; * @private */ PIXI.Spine.prototype.updateTransform = function () { - this.lastTime = this.lastTime || Date.now(); - var timeDelta = (Date.now() - this.lastTime) * 0.001; - this.lastTime = Date.now(); - this.state.update(timeDelta); - this.state.apply(this.skeleton); - this.skeleton.updateWorldTransform(); + this.lastTime = this.lastTime || Date.now(); + var timeDelta = (Date.now() - this.lastTime) * 0.001; + this.lastTime = Date.now(); + this.state.update(timeDelta); + this.state.apply(this.skeleton); + this.skeleton.updateWorldTransform(); - var drawOrder = this.skeleton.drawOrder; - for (var i = 0, n = drawOrder.length; i < n; i++) { - var slot = drawOrder[i]; - var attachment = slot.attachment; - var slotContainer = this.slotContainers[i]; - if (!(attachment instanceof spine.RegionAttachment)) { - slotContainer.visible = false; - continue; - } + var drawOrder = this.skeleton.drawOrder; + for (var i = 0, n = drawOrder.length; i < n; i++) { + var slot = drawOrder[i]; + var attachment = slot.attachment; + var slotContainer = this.slotContainers[i]; + if (!(attachment instanceof spine.RegionAttachment)) { + slotContainer.visible = false; + continue; + } - if (attachment.rendererObject) { - if (!slot.currentSpriteName || slot.currentSpriteName != attachment.name) { - var spriteName = attachment.rendererObject.name; - if (slot.currentSprite !== undefined) { - slot.currentSprite.visible = false; - } - slot.sprites = slot.sprites || {}; - if (slot.sprites[spriteName] !== undefined) { - slot.sprites[spriteName].visible = true; - } else { - var sprite = this.createSprite(slot, attachment.rendererObject); - slotContainer.addChild(sprite); - } - slot.currentSprite = slot.sprites[spriteName]; - slot.currentSpriteName = spriteName; - } - } - slotContainer.visible = true; + if (attachment.rendererObject) { + if (!slot.currentSpriteName || slot.currentSpriteName != attachment.name) { + var spriteName = attachment.rendererObject.name; + if (slot.currentSprite !== undefined) { + slot.currentSprite.visible = false; + } + slot.sprites = slot.sprites || {}; + if (slot.sprites[spriteName] !== undefined) { + slot.sprites[spriteName].visible = true; + } else { + var sprite = this.createSprite(slot, attachment.rendererObject); + slotContainer.addChild(sprite); + } + slot.currentSprite = slot.sprites[spriteName]; + slot.currentSpriteName = spriteName; + } + } + slotContainer.visible = true; - var bone = slot.bone; + var bone = slot.bone; - slotContainer.position.x = bone.worldX + attachment.x * bone.m00 + attachment.y * bone.m01; - slotContainer.position.y = bone.worldY + attachment.x * bone.m10 + attachment.y * bone.m11; - slotContainer.scale.x = bone.worldScaleX; - slotContainer.scale.y = bone.worldScaleY; + slotContainer.position.x = bone.worldX + attachment.x * bone.m00 + attachment.y * bone.m01; + slotContainer.position.y = bone.worldY + attachment.x * bone.m10 + attachment.y * bone.m11; + slotContainer.scale.x = bone.worldScaleX; + slotContainer.scale.y = bone.worldScaleY; - slotContainer.rotation = -(slot.bone.worldRotation * Math.PI / 180); - } + slotContainer.rotation = -(slot.bone.worldRotation * Math.PI / 180); + } - PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); + PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); }; PIXI.Spine.prototype.createSprite = function (slot, descriptor) { - var name = PIXI.TextureCache[descriptor.name] ? descriptor.name : descriptor.name + ".png"; - var sprite = new PIXI.Sprite(PIXI.Texture.fromFrame(name)); - sprite.scale = descriptor.scale; - sprite.rotation = descriptor.rotation; - sprite.anchor.x = sprite.anchor.y = 0.5; + var name = PIXI.TextureCache[descriptor.name] ? descriptor.name : descriptor.name + ".png"; + var sprite = new PIXI.Sprite(PIXI.Texture.fromFrame(name)); + sprite.scale = descriptor.scale; + sprite.rotation = descriptor.rotation; + sprite.anchor.x = sprite.anchor.y = 0.5; - slot.sprites = slot.sprites || {}; - slot.sprites[descriptor.name] = sprite; - return sprite; + slot.sprites = slot.sprites || {}; + slot.sprites[descriptor.name] = sprite; + return sprite; }; -/* - * 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; - }, - 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]; - 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 = { - defaultMix: 0, - 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 : this.defaultMix; - } -}; - -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"]; - - if (type == spine.AttachmentType.region) { - var attachment = new spine.RegionAttachment(); - 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(); - - attachment.rendererObject = {}; - attachment.rendererObject.name = name; - attachment.rendererObject.scale = {}; - attachment.rendererObject.scale.x = attachment.scaleX; - attachment.rendererObject.scale.y = attachment.scaleY; - attachment.rendererObject.rotation = -attachment.rotation * Math.PI / 180; - return attachment; - } - - throw "Unknown attachment type: " + type; - }, - - 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); - duration = Math.max(duration, timeline.frames[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; diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index 857e412..68c9ea9 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -4,65 +4,65 @@ PIXI.Strip = function(texture, width, height) { - PIXI.DisplayObjectContainer.call( this ); - this.texture = texture; - this.blendMode = PIXI.blendModes.NORMAL; + PIXI.DisplayObjectContainer.call( this ); + this.texture = texture; + this.blendMode = PIXI.blendModes.NORMAL; - try - { - this.uvs = new Float32Array([0, 1, - 1, 1, - 1, 0, 0,1]); + try + { + this.uvs = new Float32Array([0, 1, + 1, 1, + 1, 0, 0,1]); - this.verticies = new Float32Array([0, 0, - 0,0, - 0,0, 0, - 0, 0]); + this.verticies = new Float32Array([0, 0, + 0,0, + 0,0, 0, + 0, 0]); - this.colors = new Float32Array([1, 1, 1, 1]); + this.colors = new Float32Array([1, 1, 1, 1]); - this.indices = new Uint16Array([0, 1, 2, 3]); - } - catch(error) - { - this.uvs = [0, 1, - 1, 1, - 1, 0, 0,1]; + this.indices = new Uint16Array([0, 1, 2, 3]); + } + catch(error) + { + this.uvs = [0, 1, + 1, 1, + 1, 0, 0,1]; - this.verticies = [0, 0, - 0,0, - 0,0, 0, - 0, 0]; + this.verticies = [0, 0, + 0,0, + 0,0, 0, + 0, 0]; - this.colors = [1, 1, 1, 1]; + this.colors = [1, 1, 1, 1]; - this.indices = [0, 1, 2, 3]; - } + this.indices = [0, 1, 2, 3]; + } - /* - this.uvs = new Float32Array() - this.verticies = new Float32Array() - this.colors = new Float32Array() - this.indices = new Uint16Array() + /* + this.uvs = new Float32Array() + this.verticies = new Float32Array() + this.colors = new Float32Array() + this.indices = new Uint16Array() */ - this.width = width; - this.height = height; + this.width = width; + this.height = height; - // load the texture! - if(texture.baseTexture.hasLoaded) - { - this.width = this.texture.frame.width; - this.height = this.texture.frame.height; - this.updateFrame = true; - } - else - { - this.onTextureUpdateBind = this.onTextureUpdate.bind(this); - this.texture.addEventListener( 'update', this.onTextureUpdateBind ); - } + // load the texture! + if(texture.baseTexture.hasLoaded) + { + this.width = this.texture.frame.width; + this.height = this.texture.frame.height; + this.updateFrame = true; + } + else + { + this.onTextureUpdateBind = this.onTextureUpdate.bind(this); + this.texture.addEventListener( 'update', this.onTextureUpdateBind ); + } - this.renderable = true; + this.renderable = true; } // constructor @@ -71,19 +71,19 @@ PIXI.Strip.prototype.constructor = PIXI.Strip; PIXI.Strip.prototype.setTexture = function(texture) { - //TODO SET THE TEXTURES - //TODO VISIBILITY + //TODO SET THE TEXTURES + //TODO VISIBILITY - // stop current texture - this.texture = texture; - this.width = texture.frame.width; - this.height = texture.frame.height; - this.updateFrame = true; + // stop current texture + this.texture = texture; + this.width = texture.frame.width; + this.height = texture.frame.height; + this.updateFrame = true; } PIXI.Strip.prototype.onTextureUpdate = function(event) { - this.updateFrame = true; + this.updateFrame = true; } // some helper functions.. diff --git a/src/pixi/extras/TilingSprite.js b/src/pixi/extras/TilingSprite.js index be2e93f..d12fa24 100644 --- a/src/pixi/extras/TilingSprite.js +++ b/src/pixi/extras/TilingSprite.js @@ -14,51 +14,51 @@ */ PIXI.TilingSprite = function(texture, width, height) { - PIXI.DisplayObjectContainer.call( this ); + PIXI.DisplayObjectContainer.call( this ); - /** - * The texture that the sprite is using - * - * @property texture - * @type Texture - */ - this.texture = texture; + /** + * The texture that the sprite is using + * + * @property texture + * @type Texture + */ + this.texture = texture; - /** - * The width of the tiling sprite - * - * @property width - * @type Number - */ - this.width = width; + /** + * The width of the tiling sprite + * + * @property width + * @type Number + */ + this.width = width; - /** - * The height of the tiling sprite - * - * @property height - * @type Number - */ - this.height = height; + /** + * The height of the tiling sprite + * + * @property height + * @type Number + */ + this.height = height; - /** - * The scaling of the image that is being tiled - * - * @property tileScale - * @type Point - */ - this.tileScale = new PIXI.Point(1,1); + /** + * The scaling of the image that is being tiled + * + * @property tileScale + * @type Point + */ + this.tileScale = new PIXI.Point(1,1); - /** - * The offset position of the image that is being tiled - * - * @property tilePosition - * @type Point - */ - this.tilePosition = new PIXI.Point(0,0); + /** + * The offset position of the image that is being tiled + * + * @property tilePosition + * @type Point + */ + this.tilePosition = new PIXI.Point(0,0); - this.renderable = true; + this.renderable = true; - this.blendMode = PIXI.blendModes.NORMAL + this.blendMode = PIXI.blendModes.NORMAL } // constructor @@ -73,12 +73,12 @@ PIXI.TilingSprite.prototype.constructor = PIXI.TilingSprite; */ PIXI.TilingSprite.prototype.setTexture = function(texture) { - //TODO SET THE TEXTURES - //TODO VISIBILITY + //TODO SET THE TEXTURES + //TODO VISIBILITY - // stop current texture - this.texture = texture; - this.updateFrame = true; + // stop current texture + this.texture = texture; + this.updateFrame = true; } /** @@ -90,6 +90,6 @@ PIXI.TilingSprite.prototype.setTexture = function(texture) */ PIXI.TilingSprite.prototype.onTextureUpdate = function(event) { - this.updateFrame = true; + this.updateFrame = true; } diff --git a/src/pixi/filters/FilterBlock.js b/src/pixi/filters/FilterBlock.js index c473233..4b906c3 100644 --- a/src/pixi/filters/FilterBlock.js +++ b/src/pixi/filters/FilterBlock.js @@ -6,8 +6,8 @@ PIXI.FilterBlock = function(mask) { - this.graphics = mask - this.visible = true; - this.renderable = true; + this.graphics = mask + this.visible = true; + this.renderable = true; } diff --git a/src/pixi/filters/MaskFilter.js b/src/pixi/filters/MaskFilter.js index 1cf00eb..7bcc135 100644 --- a/src/pixi/filters/MaskFilter.js +++ b/src/pixi/filters/MaskFilter.js @@ -6,7 +6,7 @@ PIXI.MaskFilter = function(graphics) { - // the graphics data that will be used for filtering - this.graphics; + // the graphics data that will be used for filtering + this.graphics; } diff --git a/src/pixi/loaders/AssetLoader.js b/src/pixi/loaders/AssetLoader.js index 02e02a9..b7f2c9c 100644 --- a/src/pixi/loaders/AssetLoader.js +++ b/src/pixi/loaders/AssetLoader.js @@ -20,15 +20,15 @@ */ PIXI.AssetLoader = function(assetURLs, crossorigin) { - PIXI.EventTarget.call(this); + PIXI.EventTarget.call(this); - /** - * The array of asset URLs that are going to be loaded + /** + * The array of asset URLs that are going to be loaded * - * @property assetURLs - * @type Array - */ - this.assetURLs = assetURLs; + * @property assetURLs + * @type Array + */ + this.assetURLs = assetURLs; /** * Whether the requests should be treated as cross origin @@ -36,7 +36,7 @@ PIXI.AssetLoader = function(assetURLs, crossorigin) * @property crossorigin * @type Boolean */ - this.crossorigin = crossorigin; + this.crossorigin = crossorigin; /** * Maps file extension to loader types @@ -80,25 +80,26 @@ PIXI.AssetLoader.prototype.load = function() { var scope = this; - this.loadCount = this.assetURLs.length; + function onLoad() { + scope.onAssetLoaded(); + } - for (var i=0; i < this.assetURLs.length; i++) - { - var fileName = this.assetURLs[i]; - var fileType = fileName.split(".").pop().toLowerCase(); + this.loadCount = this.assetURLs.length; - var loaderClass = this.loadersByType[fileType]; - if(!loaderClass) + for (var i = 0, l = this.assetURLs.length; i < l; i++) + { + var fileName = this.assetURLs[i]; + var fileType = fileName.split(".").pop().toLowerCase(); + + var Constructor = this.loadersByType[fileType]; + if(!Constructor) throw new Error(fileType + " is an unsupported file type"); - var loader = new loaderClass(fileName, this.crossorigin); + var loader = new Constructor(fileName, this.crossorigin); - loader.addEventListener("loaded", function() - { - scope.onAssetLoaded(); - }); + loader.addEventListener("loaded", onLoad); loader.load(); - } + } }; /** @@ -110,13 +111,13 @@ PIXI.AssetLoader.prototype.load = function() PIXI.AssetLoader.prototype.onAssetLoaded = function() { this.loadCount--; - this.dispatchEvent({type: "onProgress", content: this}); - if(this.onProgress) this.onProgress(); + this.dispatchEvent({type: "onProgress", content: this}); + if (this.onProgress) this.onProgress(); - if(this.loadCount == 0) - { - this.dispatchEvent({type: "onComplete", content: this}); - if(this.onComplete) this.onComplete(); - } + if (!this.loadCount) + { + this.dispatchEvent({type: "onComplete", content: this}); + if(this.onComplete) this.onComplete(); + } }; diff --git a/src/pixi/loaders/JsonLoader.js b/src/pixi/loaders/JsonLoader.js index 640ecbf..e20794f 100644 --- a/src/pixi/loaders/JsonLoader.js +++ b/src/pixi/loaders/JsonLoader.js @@ -14,41 +14,41 @@ * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.JsonLoader = function (url, crossorigin) { - PIXI.EventTarget.call(this); + PIXI.EventTarget.call(this); - /** - * The url of the bitmap font data - * - * @property url - * @type String - */ - this.url = url; + /** + * The url of the bitmap font data + * + * @property url + * @type String + */ + this.url = url; - /** - * Whether the requests should be treated as cross origin - * - * @property crossorigin - * @type Boolean - */ - this.crossorigin = crossorigin; + /** + * Whether the requests should be treated as cross origin + * + * @property crossorigin + * @type Boolean + */ + this.crossorigin = crossorigin; - /** - * [read-only] The base url of the bitmap font data - * - * @property baseUrl - * @type String - * @readOnly - */ - this.baseUrl = url.replace(/[^\/]*$/, ""); + /** + * [read-only] The base url of the bitmap font data + * + * @property baseUrl + * @type String + * @readOnly + */ + this.baseUrl = url.replace(/[^\/]*$/, ""); - /** - * [read-only] Whether the data has loaded yet - * - * @property loaded - * @type Boolean - * @readOnly - */ - this.loaded = false; + /** + * [read-only] Whether the data has loaded yet + * + * @property loaded + * @type Boolean + * @readOnly + */ + this.loaded = false; }; @@ -61,15 +61,15 @@ PIXI.JsonLoader.prototype.constructor = PIXI.JsonLoader; * @method load */ PIXI.JsonLoader.prototype.load = function () { - this.ajaxRequest = new AjaxRequest(); - var scope = this; - this.ajaxRequest.onreadystatechange = function () { - scope.onJSONLoaded(); - }; + this.ajaxRequest = new AjaxRequest(); + var scope = this; + this.ajaxRequest.onreadystatechange = function () { + scope.onJSONLoaded(); + }; - this.ajaxRequest.open("GET", this.url, true); - if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType("application/json"); - this.ajaxRequest.send(null); + this.ajaxRequest.open("GET", this.url, true); + if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType("application/json"); + this.ajaxRequest.send(null); }; /** @@ -79,62 +79,62 @@ PIXI.JsonLoader.prototype.load = function () { * @private */ 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); + if (this.ajaxRequest.readyState == 4) { + if (this.ajaxRequest.status == 200 || window.location.href.indexOf("http") == -1) { + this.json = JSON.parse(this.ajaxRequest.responseText); - 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; + 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(); - }); + 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! - } - } - } + 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(); + 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(); - } - } + } + 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(); + } + } }; /** @@ -144,11 +144,11 @@ PIXI.JsonLoader.prototype.onJSONLoaded = function () { * @private */ PIXI.JsonLoader.prototype.onLoaded = function () { - this.loaded = true; - this.dispatchEvent({ - type: "loaded", - content: this - }); + this.loaded = true; + this.dispatchEvent({ + type: "loaded", + content: this + }); }; /** @@ -158,8 +158,8 @@ PIXI.JsonLoader.prototype.onLoaded = function () { * @private */ PIXI.JsonLoader.prototype.onError = function () { - this.dispatchEvent({ - type: "error", - content: this - }); + this.dispatchEvent({ + type: "error", + content: this + }); }; \ No newline at end of file diff --git a/src/pixi/loaders/SpineLoader.js b/src/pixi/loaders/SpineLoader.js index 0036098..f0e4ce1 100644 --- a/src/pixi/loaders/SpineLoader.js +++ b/src/pixi/loaders/SpineLoader.js @@ -23,32 +23,32 @@ */ PIXI.SpineLoader = function(url, crossorigin) { - PIXI.EventTarget.call(this); + PIXI.EventTarget.call(this); - /** - * The url of the bitmap font data - * - * @property url - * @type String - */ - this.url = url; + /** + * The url of the bitmap font data + * + * @property url + * @type String + */ + this.url = url; - /** - * Whether the requests should be treated as cross origin - * - * @property crossorigin - * @type Boolean - */ - this.crossorigin = crossorigin; + /** + * Whether the requests should be treated as cross origin + * + * @property crossorigin + * @type Boolean + */ + this.crossorigin = crossorigin; - /** - * [read-only] Whether the data has loaded yet - * - * @property loaded - * @type Boolean - * @readOnly - */ - this.loaded = false; + /** + * [read-only] Whether the data has loaded yet + * + * @property loaded + * @type Boolean + * @readOnly + */ + this.loaded = false; } PIXI.SpineLoader.prototype.constructor = PIXI.SpineLoader; @@ -60,13 +60,13 @@ PIXI.SpineLoader.prototype.constructor = PIXI.SpineLoader; */ 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(); + 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(); }; /** @@ -76,12 +76,12 @@ PIXI.SpineLoader.prototype.load = function () { * @private */ PIXI.SpineLoader.prototype.onJSONLoaded = function (event) { - var spineJsonParser = new spine.SkeletonJson(); - var skeletonData = spineJsonParser.readSkeletonData(this.json); + var spineJsonParser = new spine.SkeletonJson(); + var skeletonData = spineJsonParser.readSkeletonData(this.json); - PIXI.AnimCache[this.url] = skeletonData; + PIXI.AnimCache[this.url] = skeletonData; - this.onLoaded(); + this.onLoaded(); }; /** @@ -91,7 +91,7 @@ PIXI.SpineLoader.prototype.onJSONLoaded = function (event) { * @private */ PIXI.SpineLoader.prototype.onLoaded = function () { - this.loaded = true; + this.loaded = true; this.dispatchEvent({type: "loaded", content: this}); }; diff --git a/src/pixi/loaders/SpriteSheetLoader.js b/src/pixi/loaders/SpriteSheetLoader.js index 169fb70..d0fe441 100644 --- a/src/pixi/loaders/SpriteSheetLoader.js +++ b/src/pixi/loaders/SpriteSheetLoader.js @@ -19,37 +19,37 @@ */ PIXI.SpriteSheetLoader = function (url, crossorigin) { - /* - * i use texture packer to load the assets.. - * http://www.codeandweb.com/texturepacker - * make sure to set the format as "JSON" - */ - PIXI.EventTarget.call(this); + /* + * i use texture packer to load the assets.. + * http://www.codeandweb.com/texturepacker + * make sure to set the format as "JSON" + */ + PIXI.EventTarget.call(this); - /** - * The url of the bitmap font data - * - * @property url - * @type String - */ - this.url = url; + /** + * The url of the bitmap font data + * + * @property url + * @type String + */ + this.url = url; - /** - * Whether the requests should be treated as cross origin - * - * @property crossorigin - * @type Boolean - */ - this.crossorigin = crossorigin; + /** + * Whether the requests should be treated as cross origin + * + * @property crossorigin + * @type Boolean + */ + this.crossorigin = crossorigin; - /** - * [read-only] The base url of the bitmap font data - * - * @property baseUrl - * @type String - * @readOnly - */ - this.baseUrl = url.replace(/[^\/]*$/, ""); + /** + * [read-only] The base url of the bitmap font data + * + * @property baseUrl + * @type String + * @readOnly + */ + this.baseUrl = url.replace(/[^\/]*$/, ""); /** * The texture being loaded @@ -65,7 +65,7 @@ PIXI.SpriteSheetLoader = function (url, crossorigin) { * @property frames * @type Object */ - this.frames = {}; + this.frames = {}; }; // constructor @@ -77,13 +77,13 @@ PIXI.SpriteSheetLoader.prototype.constructor = PIXI.SpriteSheetLoader; * @method load */ PIXI.SpriteSheetLoader.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(); + 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(); }; /** @@ -93,35 +93,35 @@ PIXI.SpriteSheetLoader.prototype.load = function () { * @private */ PIXI.SpriteSheetLoader.prototype.onJSONLoaded = function () { - var scope = this; - var textureUrl = this.baseUrl + this.json.meta.image; - var image = new PIXI.ImageLoader(textureUrl, this.crossorigin); - var frameData = this.json.frames; + 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(); - }); + 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! - } - } - } + 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(); + image.load(); }; /** * Invoke when all files are loaded (json and texture) @@ -130,8 +130,8 @@ PIXI.SpriteSheetLoader.prototype.onJSONLoaded = function () { * @private */ PIXI.SpriteSheetLoader.prototype.onLoaded = function () { - this.dispatchEvent({ - type: "loaded", - content: this - }); + this.dispatchEvent({ + type: "loaded", + content: this + }); }; diff --git a/src/pixi/primitives/Graphics.js b/src/pixi/primitives/Graphics.js index f718178..d87faf4 100644 --- a/src/pixi/primitives/Graphics.js +++ b/src/pixi/primitives/Graphics.js @@ -14,9 +14,9 @@ */ PIXI.Graphics = function() { - PIXI.DisplayObjectContainer.call( this ); + PIXI.DisplayObjectContainer.call( this ); - this.renderable = true; + this.renderable = true; /** * The alpha of the fill of this graphics object @@ -24,7 +24,7 @@ PIXI.Graphics = function() * @property fillAlpha * @type Number */ - this.fillAlpha = 1; + this.fillAlpha = 1; /** * The width of any lines drawn @@ -32,7 +32,7 @@ PIXI.Graphics = function() * @property lineWidth * @type Number */ - this.lineWidth = 0; + this.lineWidth = 0; /** * The color of any lines drawn @@ -40,7 +40,7 @@ PIXI.Graphics = function() * @property lineColor * @type String */ - this.lineColor = "black"; + this.lineColor = "black"; /** * Graphics data @@ -49,7 +49,7 @@ PIXI.Graphics = function() * @type Array * @private */ - this.graphicsData = []; + this.graphicsData = []; /** * Current path @@ -58,7 +58,7 @@ PIXI.Graphics = function() * @type Object * @private */ - this.currentPath = {points:[]}; + this.currentPath = {points:[]}; } // constructor @@ -75,16 +75,16 @@ PIXI.Graphics.prototype.constructor = PIXI.Graphics; */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { - if(this.currentPath.points.length == 0)this.graphicsData.pop(); + if (!this.currentPath.points.length) this.graphicsData.pop(); - this.lineWidth = lineWidth || 0; - this.lineColor = color || 0; - this.lineAlpha = (alpha == undefined) ? 1 : alpha; + this.lineWidth = lineWidth || 0; + this.lineColor = color || 0; + this.lineAlpha = (arguments.length < 3) ? 1 : alpha; - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, - fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - this.graphicsData.push(this.currentPath); + this.graphicsData.push(this.currentPath); } /** @@ -96,14 +96,14 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) */ PIXI.Graphics.prototype.moveTo = function(x, y) { - if(this.currentPath.points.length == 0)this.graphicsData.pop(); + if (!this.currentPath.points.length) this.graphicsData.pop(); - this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, - fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; + this.currentPath = this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; - this.currentPath.points.push(x, y); + this.currentPath.points.push(x, y); - this.graphicsData.push(this.currentPath); + this.graphicsData.push(this.currentPath); } /** @@ -116,8 +116,8 @@ PIXI.Graphics.prototype.moveTo = function(x, y) */ PIXI.Graphics.prototype.lineTo = function(x, y) { - this.currentPath.points.push(x, y); - this.dirty = true; + this.currentPath.points.push(x, y); + this.dirty = true; } /** @@ -130,9 +130,9 @@ PIXI.Graphics.prototype.lineTo = function(x, y) */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { - this.filling = true; - this.fillColor = color || 0; - this.fillAlpha = (alpha == undefined) ? 1 : alpha; + this.filling = true; + this.fillColor = color || 0; + this.fillAlpha = (arguments.length < 2) ? 1 : alpha; } /** @@ -142,9 +142,9 @@ PIXI.Graphics.prototype.beginFill = function(color, alpha) */ PIXI.Graphics.prototype.endFill = function() { - this.filling = false; - this.fillColor = null; - this.fillAlpha = 1; + this.filling = false; + this.fillColor = null; + this.fillAlpha = 1; } /** @@ -157,14 +157,14 @@ PIXI.Graphics.prototype.endFill = function() */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { - if(this.currentPath.points.length == 0)this.graphicsData.pop(); + if (!this.currentPath.points.length) this.graphicsData.pop(); - this.currentPath = {lineWidth:this.lineWidth, 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.currentPath = {lineWidth:this.lineWidth, 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; + this.graphicsData.push(this.currentPath); + this.dirty = true; } /** @@ -177,14 +177,14 @@ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) */ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) { - if(this.currentPath.points.length == 0)this.graphicsData.pop(); + if (!this.currentPath.points.length) this.graphicsData.pop(); - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, - fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, radius, radius], type:PIXI.Graphics.CIRC}; - this.graphicsData.push(this.currentPath); - this.dirty = true; + this.graphicsData.push(this.currentPath); + this.dirty = true; } /** @@ -198,14 +198,14 @@ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) */ PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) { - if(this.currentPath.points.length == 0)this.graphicsData.pop(); + if (!this.currentPath.points.length) this.graphicsData.pop(); - this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, - fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, - points:[x, y, width, height], type:PIXI.Graphics.ELIP}; + this.currentPath = {lineWidth:this.lineWidth, lineColor:this.lineColor, lineAlpha:this.lineAlpha, + fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, + points:[x, y, width, height], type:PIXI.Graphics.ELIP}; - this.graphicsData.push(this.currentPath); - this.dirty = true; + this.graphicsData.push(this.currentPath); + this.dirty = true; } /** @@ -215,12 +215,12 @@ PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) */ PIXI.Graphics.prototype.clear = function() { - this.lineWidth = 0; - this.filling = false; + this.lineWidth = 0; + this.filling = false; - this.dirty = true; - this.clearDirty = true; - this.graphicsData = []; + this.dirty = true; + this.clearDirty = true; + this.graphicsData = []; } // SOME TYPES: diff --git a/src/pixi/renderers/canvas/CanvasGraphics.js b/src/pixi/renderers/canvas/CanvasGraphics.js index df1c4cb..138b8a9 100644 --- a/src/pixi/renderers/canvas/CanvasGraphics.js +++ b/src/pixi/renderers/canvas/CanvasGraphics.js @@ -25,127 +25,127 @@ PIXI.CanvasGraphics = function() */ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) { - var worldAlpha = graphics.worldAlpha; + var worldAlpha = graphics.worldAlpha; - for (var i=0; i < graphics.graphicsData.length; i++) - { - var data = graphics.graphicsData[i]; - var points = data.points; + 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.strokeStyle = color = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); - context.lineWidth = data.lineWidth; + context.lineWidth = data.lineWidth; - if(data.type == PIXI.Graphics.POLY) - { - context.beginPath(); + if(data.type == PIXI.Graphics.POLY) + { + context.beginPath(); - context.moveTo(points[0], points[1]); + context.moveTo(points[0], points[1]); - for (var j=1; j < points.length/2; j++) - { - context.lineTo(points[j * 2], points[j * 2 + 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(); - } + // 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(); + } - if(data.fill) - { - context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fill(); - } - if(data.lineWidth) - { - context.globalAlpha = data.lineAlpha * worldAlpha; - context.stroke(); - } - } - else if(data.type == PIXI.Graphics.RECT) - { + if(data.fill) + { + context.globalAlpha = data.fillAlpha * worldAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha * worldAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.RECT) + { - if(data.fillColor || data.fillColor === 0) - { - context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fillRect(points[0], points[1], points[2], points[3]); + if(data.fillColor || data.fillColor === 0) + { + context.globalAlpha = data.fillAlpha * worldAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fillRect(points[0], points[1], points[2], points[3]); - } - if(data.lineWidth) - { - context.globalAlpha = data.lineAlpha * worldAlpha; - context.strokeRect(points[0], points[1], points[2], points[3]); - } + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha * worldAlpha; + 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(); + } + 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.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fill(); - } - if(data.lineWidth) - { - context.globalAlpha = data.lineAlpha * worldAlpha; - context.stroke(); - } - } - else if(data.type == PIXI.Graphics.ELIP) - { + if(data.fill) + { + context.globalAlpha = data.fillAlpha * worldAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha * worldAlpha; + context.stroke(); + } + } + else if(data.type == PIXI.Graphics.ELIP) + { - // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - var elipseData = data.points; + var elipseData = data.points; - var w = elipseData[2] * 2; - var h = elipseData[3] * 2; + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; - var x = elipseData[0] - w/2; - var y = elipseData[1] - h/2; + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; - context.beginPath(); + context.beginPath(); - var kappa = .5522848, - ox = (w / 2) * kappa, // control point offset horizontal - oy = (h / 2) * kappa, // control point offset vertical - xe = x + w, // x-end - ye = y + h, // y-end - xm = x + w / 2, // x-middle - ym = y + h / 2; // y-middle + var kappa = 0.5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle - context.moveTo(x, ym); - context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - context.closePath(); + context.closePath(); - if(data.fill) - { - context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); - context.fill(); - } - if(data.lineWidth) - { - context.globalAlpha = data.lineAlpha * worldAlpha; - context.stroke(); - } - } + if(data.fill) + { + context.globalAlpha = data.fillAlpha * worldAlpha; + context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fill(); + } + if(data.lineWidth) + { + context.globalAlpha = data.lineAlpha * worldAlpha; + context.stroke(); + } + } - }; + } } /* @@ -159,80 +159,79 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) */ PIXI.CanvasGraphics.renderGraphicsMask = function(graphics, context) { - var worldAlpha = graphics.worldAlpha; + var worldAlpha = graphics.worldAlpha; - var len = graphics.graphicsData.length; - if(len > 1) - { - len = 1; - console.log("Pixi.js warning: masks in canvas can only mask using the first path in the graphics object") - } + var len = graphics.graphicsData.length; + if(len > 1) + { + len = 1; + console.log("Pixi.js warning: masks in canvas can only mask using the first path in the graphics object") + } - for (var i=0; i < 1; i++) - { - var data = graphics.graphicsData[i]; - var points = data.points; + for (var i=0; i < 1; i++) + { + var data = graphics.graphicsData[i]; + var points = data.points; - if(data.type == PIXI.Graphics.POLY) - { - context.beginPath(); - context.moveTo(points[0], points[1]); + if(data.type == PIXI.Graphics.POLY) + { + 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]); - } + 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(); - } + // 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(); + } - } - else if(data.type == PIXI.Graphics.RECT) - { - context.beginPath(); - context.rect(points[0], points[1], points[2], points[3]); - context.closePath(); - } - 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(); - } - else if(data.type == PIXI.Graphics.ELIP) - { + } + else if(data.type == PIXI.Graphics.RECT) + { + context.beginPath(); + context.rect(points[0], points[1], points[2], points[3]); + context.closePath(); + } + 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(); + } + else if(data.type == PIXI.Graphics.ELIP) + { - // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - var elipseData = data.points; + // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + var elipseData = data.points; - var w = elipseData[2] * 2; - var h = elipseData[3] * 2; + var w = elipseData[2] * 2; + var h = elipseData[3] * 2; - var x = elipseData[0] - w/2; - var y = elipseData[1] - h/2; + var x = elipseData[0] - w/2; + var y = elipseData[1] - h/2; - context.beginPath(); + context.beginPath(); - var kappa = .5522848, - ox = (w / 2) * kappa, // control point offset horizontal - oy = (h / 2) * kappa, // control point offset vertical - xe = x + w, // x-end - ye = y + h, // y-end - xm = x + w / 2, // x-middle - ym = y + h / 2; // y-middle + var kappa = 0.5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle - context.moveTo(x, ym); - context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - context.closePath(); - } + context.moveTo(x, ym); + context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + context.closePath(); + } - - }; + } } diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index ee127bb..a584e2a 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -16,48 +16,48 @@ */ PIXI.CanvasRenderer = function(width, height, view, transparent) { - this.transparent = transparent; + this.transparent = transparent; - /** - * The width of the canvas view - * - * @property width - * @type Number - * @default 800 - */ - this.width = width || 800; + /** + * The width of the canvas view + * + * @property width + * @type Number + * @default 800 + */ + this.width = width || 800; - /** - * The height of the canvas view - * - * @property height - * @type Number - * @default 600 - */ - this.height = height || 600; + /** + * The height of the canvas view + * + * @property height + * @type Number + * @default 600 + */ + this.height = height || 600; - /** - * The canvas element that the everything is drawn to - * - * @property view - * @type Canvas - */ - this.view = view || document.createElement( 'canvas' ); + /** + * The canvas element that the everything is drawn to + * + * @property view + * @type Canvas + */ + this.view = view || document.createElement( 'canvas' ); - /** - * The canvas context that the everything is drawn to - * @property context - * @type Canvas 2d Context - */ - this.context = this.view.getContext("2d"); + /** + * The canvas context that the everything is drawn to + * @property context + * @type Canvas 2d Context + */ + this.context = this.view.getContext("2d"); - this.refresh = true; - // hack to enable some hardware acceleration! - //this.view.style["transform"] = "translatez(0)"; + this.refresh = true; + // hack to enable some hardware acceleration! + //this.view.style["transform"] = "translatez(0)"; this.view.width = this.width; - this.view.height = this.height; - this.count = 0; + this.view.height = this.height; + this.count = 0; } // constructor @@ -72,40 +72,40 @@ PIXI.CanvasRenderer.prototype.constructor = PIXI.CanvasRenderer; PIXI.CanvasRenderer.prototype.render = function(stage) { - //stage.__childrenAdded = []; - //stage.__childrenRemoved = []; + //stage.__childrenAdded = []; + //stage.__childrenRemoved = []; - // update textures if need be - PIXI.texturesToUpdate = []; - PIXI.texturesToDestroy = []; + // update textures if need be + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; - PIXI.visibleCount++; - stage.updateTransform(); + PIXI.visibleCount++; + stage.updateTransform(); - // update the background color - if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + // update the background color + if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; - this.context.setTransform(1,0,0,1,0,0); - this.context.clearRect(0, 0, this.width, this.height) + this.context.setTransform(1,0,0,1,0,0); + this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as // run interaction! - if(stage.interactive) - { - //need to add some events! - if(!stage._interactiveEventsAdded) - { - stage._interactiveEventsAdded = true; - stage.interactionManager.setTarget(this); - } - } + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } - // remove frame updates.. - if(PIXI.Texture.frameUpdates.length > 0) - { - PIXI.Texture.frameUpdates = []; - } + // remove frame updates.. + if(PIXI.Texture.frameUpdates.length > 0) + { + PIXI.Texture.frameUpdates = []; + } } @@ -119,11 +119,11 @@ PIXI.CanvasRenderer.prototype.render = function(stage) */ PIXI.CanvasRenderer.prototype.resize = function(width, height) { - this.width = width; - this.height = height; + this.width = width; + this.height = height; - this.view.width = width; - this.view.height = height; + this.view.width = width; + this.view.height = height; } /** @@ -135,104 +135,104 @@ PIXI.CanvasRenderer.prototype.resize = function(width, height) */ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) { - // no loger recurrsive! - var transform; - var context = this.context; + // no loger recurrsive! + var transform; + var context = this.context; - context.globalCompositeOperation = 'source-over'; + context.globalCompositeOperation = 'source-over'; - // one the display object hits this. we can break the loop - var testObject = displayObject.last._iNext; - displayObject = displayObject.first; + // one the display object hits this. we can break the loop + var testObject = displayObject.last._iNext; + displayObject = displayObject.first; - do - { - transform = displayObject.worldTransform; + do + { + transform = displayObject.worldTransform; - if(!displayObject.visible) - { - displayObject = displayObject.last._iNext; - continue; - } + if(!displayObject.visible) + { + displayObject = displayObject.last._iNext; + continue; + } - if(!displayObject.renderable) - { - displayObject = displayObject._iNext; - continue; - } + if(!displayObject.renderable) + { + displayObject = displayObject._iNext; + continue; + } - if(displayObject instanceof PIXI.Sprite) - { + if(displayObject instanceof PIXI.Sprite) + { - var frame = displayObject.texture.frame; + var frame = displayObject.texture.frame; - if(frame && frame.width && frame.height) - { - context.globalAlpha = displayObject.worldAlpha; + if(frame && frame.width && frame.height) + { + context.globalAlpha = displayObject.worldAlpha; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); - context.drawImage(displayObject.texture.baseTexture.source, - frame.x, - frame.y, - frame.width, - frame.height, - (displayObject.anchor.x) * -frame.width, - (displayObject.anchor.y) * -frame.height, - frame.width, - frame.height); - } - } - else if(displayObject instanceof PIXI.Strip) - { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) - this.renderStrip(displayObject); - } - else if(displayObject instanceof PIXI.TilingSprite) - { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) - this.renderTilingSprite(displayObject); - } - else if(displayObject instanceof PIXI.CustomRenderable) - { - displayObject.renderCanvas(this); - } - else if(displayObject instanceof PIXI.Graphics) - { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) - PIXI.CanvasGraphics.renderGraphics(displayObject, context); - } - else if(displayObject instanceof PIXI.FilterBlock) - { - if(displayObject.open) - { - context.save(); + context.drawImage(displayObject.texture.baseTexture.source, + frame.x, + frame.y, + frame.width, + frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + frame.width, + frame.height); + } + } + else if(displayObject instanceof PIXI.Strip) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + this.renderStrip(displayObject); + } + else if(displayObject instanceof PIXI.TilingSprite) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + this.renderTilingSprite(displayObject); + } + else if(displayObject instanceof PIXI.CustomRenderable) + { + displayObject.renderCanvas(this); + } + else if(displayObject instanceof PIXI.Graphics) + { + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + PIXI.CanvasGraphics.renderGraphics(displayObject, context); + } + else if(displayObject instanceof PIXI.FilterBlock) + { + if(displayObject.open) + { + context.save(); - var cacheAlpha = displayObject.mask.alpha; - var maskTransform = displayObject.mask.worldTransform; + var cacheAlpha = displayObject.mask.alpha; + var maskTransform = displayObject.mask.worldTransform; - context.setTransform(maskTransform[0], maskTransform[3], maskTransform[1], maskTransform[4], maskTransform[2], maskTransform[5]) + context.setTransform(maskTransform[0], maskTransform[3], maskTransform[1], maskTransform[4], maskTransform[2], maskTransform[5]) - displayObject.mask.worldAlpha = 0.5; + displayObject.mask.worldAlpha = 0.5; - context.worldAlpha = 0; + context.worldAlpha = 0; - PIXI.CanvasGraphics.renderGraphicsMask(displayObject.mask, context); - context.clip(); + PIXI.CanvasGraphics.renderGraphicsMask(displayObject.mask, context); + context.clip(); - displayObject.mask.worldAlpha = cacheAlpha; - } - else - { - context.restore(); - } - } - // count++ - displayObject = displayObject._iNext; + displayObject.mask.worldAlpha = cacheAlpha; + } + else + { + context.restore(); + } + } + // count++ + displayObject = displayObject._iNext; - } - while(displayObject != testObject) + } + while(displayObject != testObject) } @@ -246,32 +246,32 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) */ PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) { - var context = this.context; - var verticies = strip.verticies; - var uvs = strip.uvs; + var context = this.context; + var verticies = strip.verticies; + var uvs = strip.uvs; - var length = verticies.length/2; - this.count++; + var length = verticies.length/2; + this.count++; - context.beginPath(); - for (var i=1; i < length-2; i++) - { + context.beginPath(); + for (var i=1; i < length-2; i++) + { - // draw some triangles! - var index = i*2; + // draw some triangles! + var index = i*2; - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); - }; + } - context.fillStyle = "#FF0000"; - context.fill(); - context.closePath(); + context.fillStyle = "#FF0000"; + context.fill(); + context.closePath(); } /** @@ -283,25 +283,25 @@ PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) */ PIXI.CanvasRenderer.prototype.renderTilingSprite = function(sprite) { - var context = this.context; + var context = this.context; - context.globalAlpha = sprite.worldAlpha; + context.globalAlpha = sprite.worldAlpha; - if(!sprite.__tilePattern) sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, "repeat"); + if(!sprite.__tilePattern) sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, "repeat"); - context.beginPath(); + context.beginPath(); - var tilePosition = sprite.tilePosition; - var tileScale = sprite.tileScale; + var tilePosition = sprite.tilePosition; + var tileScale = sprite.tileScale; // offset context.scale(tileScale.x,tileScale.y); context.translate(tilePosition.x, tilePosition.y); - context.fillStyle = sprite.__tilePattern; - context.fillRect(-tilePosition.x,-tilePosition.y,sprite.width / tileScale.x, sprite.height / tileScale.y); + context.fillStyle = sprite.__tilePattern; + context.fillRect(-tilePosition.x,-tilePosition.y,sprite.width / tileScale.x, sprite.height / tileScale.y); - context.scale(1/tileScale.x, 1/tileScale.y); + context.scale(1/tileScale.x, 1/tileScale.y); context.translate(-tilePosition.x, -tilePosition.y); context.closePath(); @@ -316,35 +316,35 @@ PIXI.CanvasRenderer.prototype.renderTilingSprite = function(sprite) */ PIXI.CanvasRenderer.prototype.renderStrip = function(strip) { - var context = this.context; + var context = this.context; - // draw triangles!! - var verticies = strip.verticies; - var uvs = strip.uvs; + // draw triangles!! + var verticies = strip.verticies; + var uvs = strip.uvs; - var length = verticies.length/2; - this.count++; - for (var i=1; i < length-2; i++) - { + var length = verticies.length/2; + this.count++; + for (var i=1; i < length-2; i++) + { - // draw some triangles! - var index = i*2; + // draw some triangles! + var index = i*2; - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; - var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; + var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; + var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; - context.save(); - context.beginPath(); - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - context.closePath(); + context.save(); + context.beginPath(); + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.closePath(); - context.clip(); + context.clip(); // Compute matrix transform @@ -363,8 +363,8 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip) delta_b/delta, delta_e/delta, delta_c/delta, delta_f/delta); - context.drawImage(strip.texture.baseTexture.source, 0, 0); - context.restore(); - }; + context.drawImage(strip.texture.baseTexture.source, 0, 0); + context.restore(); + } } diff --git a/src/pixi/renderers/webgl/WebGLBatch.js b/src/pixi/renderers/webgl/WebGLBatch.js index 8b6305b..a5a48a0 100644 --- a/src/pixi/renderers/webgl/WebGLBatch.js +++ b/src/pixi/renderers/webgl/WebGLBatch.js @@ -9,14 +9,7 @@ PIXI._batchs = []; */ PIXI._getBatch = function(gl) { - if(PIXI._batchs.length == 0) - { - return new PIXI.WebGLBatch(gl); - } - else - { - return PIXI._batchs.pop(); - } + return PIXI._batchs.length ? new PIXI.WebGLBatch(gl) : PIXI._batchs.pop(); } /** @@ -24,8 +17,8 @@ PIXI._getBatch = function(gl) */ PIXI._returnBatch = function(batch) { - batch.clean(); - PIXI._batchs.push(batch); + batch.clean(); + PIXI._batchs.push(batch); } /** @@ -33,10 +26,10 @@ PIXI._returnBatch = function(batch) */ PIXI._restoreBatchs = function(gl) { - for (var i=0; i < PIXI._batchs.length; i++) - { - PIXI._batchs[i].restoreLostContext(gl); - }; + for (var i = 0, l = PIXI._batchs.length; i < l; i++) + { + PIXI._batchs[i].restoreLostContext(gl); + } } /** @@ -53,16 +46,16 @@ PIXI._restoreBatchs = function(gl) */ PIXI.WebGLBatch = function(gl) { - this.gl = gl; + this.gl = gl; - this.size = 0; + this.size = 0; - this.vertexBuffer = gl.createBuffer(); - this.indexBuffer = gl.createBuffer(); - this.uvBuffer = gl.createBuffer(); - this.colorBuffer = gl.createBuffer(); - this.blendMode = PIXI.blendModes.NORMAL; - this.dynamicSize = 1; + this.vertexBuffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.uvBuffer = gl.createBuffer(); + this.colorBuffer = gl.createBuffer(); + this.blendMode = PIXI.blendModes.NORMAL; + this.dynamicSize = 1; } // constructor @@ -75,16 +68,15 @@ PIXI.WebGLBatch.prototype.constructor = PIXI.WebGLBatch; */ PIXI.WebGLBatch.prototype.clean = function() { - this.verticies = []; - this.uvs = []; - this.indices = []; - this.colors = []; - this.dynamicSize = 1; - this.texture = null; - this.last = null; - this.size = 0; - this.head; - this.tail; + this.verticies = []; + this.uvs = []; + this.indices = []; + this.colors = []; + this.dynamicSize = 1; + this.texture = null; + this.size = 0; + this.head = null; + this.tail = null; } /** @@ -95,11 +87,11 @@ PIXI.WebGLBatch.prototype.clean = function() */ PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) { - this.gl = gl; - this.vertexBuffer = gl.createBuffer(); - this.indexBuffer = gl.createBuffer(); - this.uvBuffer = gl.createBuffer(); - this.colorBuffer = gl.createBuffer(); + this.gl = gl; + this.vertexBuffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.uvBuffer = gl.createBuffer(); + this.colorBuffer = gl.createBuffer(); } /** @@ -107,19 +99,19 @@ PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) * * @method init * @param sprite {Sprite} the first sprite to be added to the batch. Only sprites with - * the same base texture and blend mode will be allowed to be added to this batch + * the same base texture and blend mode will be allowed to be added to this batch */ PIXI.WebGLBatch.prototype.init = function(sprite) { - sprite.batch = this; - this.dirty = true; - this.blendMode = sprite.blendMode; - this.texture = sprite.texture.baseTexture; - this.head = sprite; - this.tail = sprite; - this.size = 1; + sprite.batch = this; + this.dirty = true; + this.blendMode = sprite.blendMode; + this.texture = sprite.texture.baseTexture; + this.head = sprite; + this.tail = sprite; + this.size = 1; - this.growBatch(); + this.growBatch(); } /** @@ -131,23 +123,23 @@ PIXI.WebGLBatch.prototype.init = function(sprite) */ PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) { - this.size++; + this.size++; - sprite.batch = this; - this.dirty = true; - var tempPrev = nextSprite.__prev; - nextSprite.__prev = sprite; - sprite.__next = nextSprite; + sprite.batch = this; + this.dirty = true; + var tempPrev = nextSprite.__prev; + nextSprite.__prev = sprite; + sprite.__next = nextSprite; - if(tempPrev) - { - sprite.__prev = tempPrev; - tempPrev.__next = sprite; - } - else - { - this.head = sprite; - } + if(tempPrev) + { + sprite.__prev = tempPrev; + tempPrev.__next = sprite; + } + else + { + this.head = sprite; + } } /** @@ -159,24 +151,24 @@ PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) */ PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) { - this.size++; + this.size++; - sprite.batch = this; - this.dirty = true; + sprite.batch = this; + this.dirty = true; - var tempNext = previousSprite.__next; - previousSprite.__next = sprite; - sprite.__prev = previousSprite; + var tempNext = previousSprite.__next; + previousSprite.__next = sprite; + sprite.__prev = previousSprite; - if(tempNext) - { - sprite.__next = tempNext; - tempNext.__prev = sprite; - } - else - { - this.tail = sprite - } + if(tempNext) + { + sprite.__next = tempNext; + tempNext.__prev = sprite; + } + else + { + this.tail = sprite + } } /** @@ -187,40 +179,40 @@ PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) */ PIXI.WebGLBatch.prototype.remove = function(sprite) { - this.size--; + this.size--; - if(this.size == 0) - { - sprite.batch = null; - sprite.__prev = null; - sprite.__next = null; - return; - } + if (!this.size) + { + sprite.batch = null; + sprite.__prev = null; + sprite.__next = null; + return; + } - if(sprite.__prev) - { - sprite.__prev.__next = sprite.__next; - } - else - { - this.head = sprite.__next; - this.head.__prev = null; - } + if(sprite.__prev) + { + sprite.__prev.__next = sprite.__next; + } + else + { + this.head = sprite.__next; + this.head.__prev = null; + } - if(sprite.__next) - { - sprite.__next.__prev = sprite.__prev; - } - else - { - this.tail = sprite.__prev; - this.tail.__next = null - } + if(sprite.__next) + { + sprite.__next.__prev = sprite.__prev; + } + else + { + this.tail = sprite.__prev; + this.tail.__next = null + } - sprite.batch = null; - sprite.__next = null; - sprite.__prev = null; - this.dirty = true; + sprite.batch = null; + sprite.__next = null; + sprite.__prev = null; + this.dirty = true; } /** @@ -232,36 +224,36 @@ PIXI.WebGLBatch.prototype.remove = function(sprite) */ PIXI.WebGLBatch.prototype.split = function(sprite) { - this.dirty = true; + this.dirty = true; - var batch = new PIXI.WebGLBatch(this.gl); - batch.init(sprite); - batch.texture = this.texture; - batch.tail = this.tail; + var batch = new PIXI.WebGLBatch(this.gl); + batch.init(sprite); + batch.texture = this.texture; + batch.tail = this.tail; - this.tail = sprite.__prev; - this.tail.__next = null; + this.tail = sprite.__prev; + this.tail.__next = null; - sprite.__prev = null; - // return a splite batch! + sprite.__prev = null; + // return a splite batch! - // TODO this size is wrong! - // need to recalculate :/ problem with a linked list! - // unless it gets calculated in the "clean"? + // TODO this size is wrong! + // need to recalculate :/ problem with a linked list! + // unless it gets calculated in the "clean"? - // need to loop through items as there is no way to know the length on a linked list :/ - var tempSize = 0; - while(sprite) - { - tempSize++; - sprite.batch = batch; - sprite = sprite.__next; - } + // need to loop through items as there is no way to know the length on a linked list :/ + var tempSize = 0; + while(sprite) + { + tempSize++; + sprite.batch = batch; + sprite = sprite.__next; + } - batch.size = tempSize; - this.size -= tempSize; + batch.size = tempSize; + this.size -= tempSize; - return batch; + return batch; } /** @@ -272,21 +264,21 @@ PIXI.WebGLBatch.prototype.split = function(sprite) */ PIXI.WebGLBatch.prototype.merge = function(batch) { - this.dirty = true; + this.dirty = true; - this.tail.__next = batch.head; - batch.head.__prev = this.tail; + this.tail.__next = batch.head; + batch.head.__prev = this.tail; - this.size += batch.size; + this.size += batch.size; - this.tail = batch.tail; + this.tail = batch.tail; - var sprite = batch.head; - while(sprite) - { - sprite.batch = this; - sprite = sprite.__next; - } + var sprite = batch.head; + while(sprite) + { + sprite.batch = this; + sprite = sprite.__next; + } } /** @@ -298,49 +290,48 @@ PIXI.WebGLBatch.prototype.merge = function(batch) */ PIXI.WebGLBatch.prototype.growBatch = function() { - var gl = this.gl; - if( this.size == 1) - { - this.dynamicSize = 1; - } - else - { - this.dynamicSize = this.size * 1.5 - } - // grow verts - this.verticies = new Float32Array(this.dynamicSize * 8); + var gl = this.gl; + if( this.size == 1) + { + this.dynamicSize = 1; + } + else + { + this.dynamicSize = this.size * 1.5 + } + // grow verts + this.verticies = new Float32Array(this.dynamicSize * 8); - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER,this.verticies , gl.DYNAMIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER,this.verticies , gl.DYNAMIC_DRAW); - this.uvs = new Float32Array( this.dynamicSize * 8 ); - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, this.uvs , gl.DYNAMIC_DRAW); + this.uvs = new Float32Array( this.dynamicSize * 8 ); + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.uvs , gl.DYNAMIC_DRAW); - this.dirtyUVS = true; + this.dirtyUVS = true; - this.colors = new Float32Array( this.dynamicSize * 4 ); - gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, this.colors , gl.DYNAMIC_DRAW); + this.colors = new Float32Array( this.dynamicSize * 4 ); + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.colors , gl.DYNAMIC_DRAW); - this.dirtyColors = true; + this.dirtyColors = true; - this.indices = new Uint16Array(this.dynamicSize * 6); - var length = this.indices.length/6; + this.indices = new Uint16Array(this.dynamicSize * 6); - for (var i=0; i < length; i++) - { - var index2 = i * 6; - var index3 = i * 4; - this.indices[index2 + 0] = index3 + 0; - this.indices[index2 + 1] = index3 + 1; - this.indices[index2 + 2] = index3 + 2; - this.indices[index2 + 3] = index3 + 0; - this.indices[index2 + 4] = index3 + 2; - this.indices[index2 + 5] = index3 + 3; - }; + for (var i = 0, l = this.indices.length/6; i < l; i++) + { + var index2 = i * 6; + var index3 = i * 4; + this.indices[index2 + 0] = index3 + 0; + this.indices[index2 + 1] = index3 + 1; + this.indices[index2 + 2] = index3 + 2; + this.indices[index2 + 3] = index3 + 0; + this.indices[index2 + 4] = index3 + 2; + this.indices[index2 + 5] = index3 + 3; + } - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); } @@ -351,53 +342,53 @@ PIXI.WebGLBatch.prototype.growBatch = function() */ PIXI.WebGLBatch.prototype.refresh = function() { - var gl = this.gl; + var gl = this.gl; - if (this.dynamicSize < this.size) - { - this.growBatch(); - } + if (this.dynamicSize < this.size) + { + this.growBatch(); + } - var indexRun = 0; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index; - var a, b, c, d, tx, ty; + var indexRun = 0; + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index; + var a, b, c, d, tx, ty; - var displayObject = this.head; + var displayObject = this.head; - while(displayObject) - { - index = indexRun * 8; + while(displayObject) + { + index = indexRun * 8; - var texture = displayObject.texture; + var texture = displayObject.texture; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; - displayObject.updateFrame = false; + displayObject.updateFrame = false; - colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - displayObject = displayObject.__next; + displayObject = displayObject.__next; - indexRun ++; - } + indexRun ++; + } - this.dirtyUVS = true; - this.dirtyColors = true; + this.dirtyUVS = true; + this.dirtyColors = true; } /** @@ -407,108 +398,108 @@ PIXI.WebGLBatch.prototype.refresh = function() */ PIXI.WebGLBatch.prototype.update = function() { - var gl = this.gl; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, index2, index3 + var gl = this.gl; + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, index2, index3 - var a, b, c, d, tx, ty; + var a, b, c, d, tx, ty; - var indexRun = 0; + var indexRun = 0; - var displayObject = this.head; + var displayObject = this.head; - while(displayObject) - { - if(displayObject.vcount === PIXI.visibleCount) - { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; + while(displayObject) + { + if(displayObject.vcount === PIXI.visibleCount) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; - // TODO trim?? - aX = displayObject.anchor.x;// - displayObject.texture.trim.x - aY = displayObject.anchor.y; //- displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; - h0 = height * (1-aY); - h1 = height * -aY; + h0 = height * (1-aY); + h1 = height * -aY; - index = indexRun * 8; + index = indexRun * 8; - worldTransform = displayObject.worldTransform; + worldTransform = displayObject.worldTransform; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; - var texture = displayObject.texture; + var texture = displayObject.texture; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; - displayObject.updateFrame = false; - } + displayObject.updateFrame = false; + } - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) - { - displayObject.cacheAlpha = displayObject.worldAlpha; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; - } - } - else - { - index = indexRun * 8; + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } + } + else + { + index = indexRun * 8; - this.verticies[index + 0 ] = 0; - this.verticies[index + 1 ] = 0; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; - this.verticies[index + 2 ] = 0; - this.verticies[index + 3 ] = 0; + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; - this.verticies[index + 4 ] = 0; - this.verticies[index + 5 ] = 0; + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; - this.verticies[index + 6] = 0; - this.verticies[index + 7] = 0; - } + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; + } - indexRun++; - displayObject = displayObject.__next; + indexRun++; + displayObject = displayObject.__next; } } @@ -519,38 +510,38 @@ PIXI.WebGLBatch.prototype.update = function() */ PIXI.WebGLBatch.prototype.render = function(start, end) { - start = start || 0; + start = start || 0; - if(end == undefined)end = this.size; + if (arguments.length < 2) end = this.size; - if(this.dirty) - { - this.refresh(); - this.dirty = false; - } + if(this.dirty) + { + this.refresh(); + this.dirty = false; + } - if (this.size == 0)return; + if (!this.size) return; - this.update(); - var gl = this.gl; + this.update(); + var gl = this.gl; - //TODO optimize this! + //TODO optimize this! - var shaderProgram = PIXI.shaderProgram; - gl.useProgram(shaderProgram); + var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); - // update the verts.. - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - // ok.. - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies) + // update the verts.. + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + // ok.. + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies) gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); if(this.dirtyUVS) { - this.dirtyUVS = false; - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvs); + this.dirtyUVS = false; + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvs); } gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); @@ -558,21 +549,21 @@ PIXI.WebGLBatch.prototype.render = function(start, end) gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, this.texture._glTexture); - // update color! - gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); + // update color! + gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); - if(this.dirtyColors) + if(this.dirtyColors) { - this.dirtyColors = false; - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.colors); - } + this.dirtyColors = false; + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.colors); + } gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - // dont need to upload! + // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - var len = end - start; + var len = end - start; // DRAW THAT this! gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); diff --git a/src/pixi/renderers/webgl/WebGLGraphics.js b/src/pixi/renderers/webgl/WebGLGraphics.js index 87d98be..70d1c85 100644 --- a/src/pixi/renderers/webgl/WebGLGraphics.js +++ b/src/pixi/renderers/webgl/WebGLGraphics.js @@ -23,63 +23,63 @@ PIXI.WebGLGraphics = function() */ PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { - var gl = PIXI.gl; + var gl = PIXI.gl; - if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, - buffer:gl.createBuffer(), - indexBuffer:gl.createBuffer()}; + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + buffer:gl.createBuffer(), + indexBuffer:gl.createBuffer()}; - if(graphics.dirty) - { - graphics.dirty = false; + if(graphics.dirty) + { + graphics.dirty = false; - if(graphics.clearDirty) - { - graphics.clearDirty = false; + if(graphics.clearDirty) + { + graphics.clearDirty = false; - graphics._webGL.lastIndex = 0; - graphics._webGL.points = []; - graphics._webGL.indices = []; + graphics._webGL.lastIndex = 0; + graphics._webGL.points = []; + graphics._webGL.indices = []; - } + } - PIXI.WebGLGraphics.updateGraphics(graphics); - } + PIXI.WebGLGraphics.updateGraphics(graphics); + } - PIXI.activatePrimitiveShader(); + PIXI.activatePrimitiveShader(); - // This could be speeded up fo sure! - var m = PIXI.mat3.clone(graphics.worldTransform); + // This could be speeded up fo sure! + var m = PIXI.mat3.clone(graphics.worldTransform); - PIXI.mat3.transpose(m); + PIXI.mat3.transpose(m); - // set the matrix transform for the - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the matrix transform for the + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); + gl.uniformMatrix3fv(PIXI.primitiveProgram.translationMatrix, false, m); - gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); + gl.uniform2f(PIXI.primitiveProgram.projectionVector, projection.x, projection.y); - gl.uniform1f(PIXI.primitiveProgram.alpha, graphics.worldAlpha); + gl.uniform1f(PIXI.primitiveProgram.alpha, graphics.worldAlpha); - gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - // WHY DOES THIS LINE NEED TO BE THERE??? - gl.vertexAttribPointer(PIXI.shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - // its not even used.. but need to be set or it breaks? - // only on pc though.. + // WHY DOES THIS LINE NEED TO BE THERE??? + gl.vertexAttribPointer(PIXI.shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + // its not even used.. but need to be set or it breaks? + // only on pc though.. - gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); + gl.vertexAttribPointer(PIXI.primitiveProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 4 * 6, 0); + gl.vertexAttribPointer(PIXI.primitiveProgram.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - // set the index buffer! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + // set the index buffer! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); - // return to default shader... - PIXI.activateDefaultShader(); + // return to default shader... + PIXI.activateDefaultShader(); } /** @@ -92,45 +92,45 @@ PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) */ PIXI.WebGLGraphics.updateGraphics = function(graphics) { - for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) - { - var data = graphics.graphicsData[i]; + for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + { + var data = graphics.graphicsData[i]; - if(data.type == PIXI.Graphics.POLY) - { - if(data.fill) - { - if(data.points.length>3) - PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); - } + if(data.type == PIXI.Graphics.POLY) + { + if(data.fill) + { + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + } - if(data.lineWidth > 0) - { - PIXI.WebGLGraphics.buildLine(data, graphics._webGL); - } - } - else if(data.type == PIXI.Graphics.RECT) - { - PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); - } - else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) - { - PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); - } - }; + if(data.lineWidth > 0) + { + PIXI.WebGLGraphics.buildLine(data, graphics._webGL); + } + } + else if(data.type == PIXI.Graphics.RECT) + { + PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); + } + else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + { + PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); + } + } - graphics._webGL.lastIndex = graphics.graphicsData.length; + graphics._webGL.lastIndex = graphics.graphicsData.length; - var gl = PIXI.gl; + var gl = PIXI.gl; - graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); + graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); + gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); - graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); } @@ -145,57 +145,57 @@ PIXI.WebGLGraphics.updateGraphics = function(graphics) */ 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]; + // --- // + // 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; + if(graphicsData.fill) + { + var color = hex2rgb(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; - var r = color[0] * alpha; - var g = color[1] * alpha; - var b = color[2] * alpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; - var verts = webGLData.points; - var indices = webGLData.indices; + var verts = webGLData.points; + var indices = webGLData.indices; - var vertPos = verts.length/6; + var vertPos = verts.length/6; - // start - verts.push(x, y); - verts.push(r, g, b, alpha); + // 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 + width, y); + verts.push(r, g, b, alpha); - verts.push(x , y + height); - 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); + verts.push(x + width, y + height); + verts.push(r, g, b, alpha); - // insert 2 dead triangles.. - indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) - } + // insert 2 dead triangles.. + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) + } - if(graphicsData.lineWidth) - { - graphicsData.points = [x, y, - x + width, y, - x + width, y + height, - x, y + height, - x, y]; + 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.buildLine(graphicsData, webGLData); + } } @@ -210,60 +210,61 @@ PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) */ PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) { - // --- // - // need to convert points to a nice regular data - // - var rectData = graphicsData.points; - var x = rectData[0]; - var y = rectData[1]; - var width = rectData[2]; - var height = rectData[3]; + // --- // + // need to convert points to a nice regular data + // + var rectData = graphicsData.points; + var x = rectData[0]; + var y = rectData[1]; + var width = rectData[2]; + var height = rectData[3]; - var totalSegs = 40; - var seg = (Math.PI * 2) / totalSegs ; + var totalSegs = 40; + var seg = (Math.PI * 2) / totalSegs ; + var i; - if(graphicsData.fill) - { - var color = HEXtoRGB(graphicsData.fillColor); - var alpha = graphicsData.fillAlpha; + if (graphicsData.fill) + { + var color = hex2rgb(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; - var r = color[0] * alpha; - var g = color[1] * alpha; - var b = color[2] * alpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; - var verts = webGLData.points; - var indices = webGLData.indices; + var verts = webGLData.points; + var indices = webGLData.indices; - var vecPos = verts.length/6; + var vecPos = verts.length/6; - indices.push(vecPos); + indices.push(vecPos); - for (var i=0; i < totalSegs + 1 ; i++) - { - verts.push(x,y, r, g, b, alpha); + for (i = 0; i < totalSegs + 1 ; i++) + { + verts.push(x,y, r, g, b, alpha); - verts.push(x + Math.sin(seg * i) * width, - y + Math.cos(seg * i) * height, - r, g, b, alpha); + verts.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height, + r, g, b, alpha); - indices.push(vecPos++, vecPos++); - }; + indices.push(vecPos++, vecPos++); + } - indices.push(vecPos-1); - } + indices.push(vecPos-1); + } - if(graphicsData.lineWidth) - { - graphicsData.points = []; + if (graphicsData.lineWidth) + { + graphicsData.points = []; - for (var i=0; i < totalSegs + 1; i++) - { - graphicsData.points.push(x + Math.sin(seg * i) * width, - y + Math.cos(seg * i) * height) - }; + for (i = 0; i < totalSegs + 1; i++) + { + graphicsData.points.push(x + Math.sin(seg * i) * width, + y + Math.cos(seg * i) * height) + } - PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); - } + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); + } } @@ -278,184 +279,184 @@ PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) */ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { - // TODO OPTIMISE! + // TODO OPTIMISE! - var wrap = true; - var points = graphicsData.points; - if(points.length == 0)return; + 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] ); + // 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(); + // 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] ); + 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; + 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) - } + points.unshift(midPointX, midPointY); + points.push(midPointX, midPointY) + } - var verts = webGLData.points; - var indices = webGLData.indices; - var length = points.length / 2; - var indexCount = points.length; - var indexStart = verts.length/6; + var verts = webGLData.points; + var indices = webGLData.indices; + var length = points.length / 2; + var indexCount = points.length; + var indexStart = verts.length/6; - // DRAW the Line - var width = graphicsData.lineWidth / 2; + // DRAW the Line + var width = graphicsData.lineWidth / 2; - // sort color - var color = HEXtoRGB(graphicsData.lineColor); - var alpha = graphicsData.lineAlpha; - var r = color[0] * alpha; - var g = color[1] * alpha; - var b = color[2] * alpha; + // sort color + var color = hex2rgb(graphicsData.lineColor); + var alpha = graphicsData.lineAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; - var p1x, p1y, p2x, p2y, p3x, p3y; - var perpx, perpy, perp2x, perp2y, perp3x, perp3y; - var ipx, ipy; - var a1, b1, c1, a2, b2, c2; - var denom, pdist, dist; + var p1x, p1y, p2x, p2y, p3x, p3y; + var perpx, perpy, perp2x, perp2y, perp3x, perp3y; + var ipx, ipy; + var a1, b1, c1, a2, b2, c2; + var denom, pdist, dist; - p1x = points[0]; - p1y = points[1]; + p1x = points[0]; + p1y = points[1]; - p2x = points[2]; - p2y = points[3]; + p2x = points[2]; + p2y = points[3]; - perpx = -(p1y - p2y); - perpy = p1x - p2x; + perpx = -(p1y - p2y); + perpy = p1x - p2x; - dist = Math.sqrt(perpx*perpx + perpy*perpy); + dist = Math.sqrt(perpx*perpx + perpy*perpy); - perpx /= dist; - perpy /= dist; - perpx *= width; - perpy *= width; + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; - // start - verts.push(p1x - perpx , p1y - perpy, - r, g, b, alpha); + // start + verts.push(p1x - perpx , p1y - perpy, + r, g, b, alpha); - verts.push(p1x + perpx , p1y + perpy, - r, g, b, alpha); + verts.push(p1x + perpx , p1y + perpy, + r, g, b, alpha); - for (var i = 1; i < length-1; i++) - { - p1x = points[(i-1)*2]; - p1y = points[(i-1)*2 + 1]; + for (var i = 1; i < length-1; i++) + { + p1x = points[(i-1)*2]; + p1y = points[(i-1)*2 + 1]; - p2x = points[(i)*2] - p2y = points[(i)*2 + 1] + p2x = points[(i)*2] + p2y = points[(i)*2 + 1] - p3x = points[(i+1)*2]; - p3y = points[(i+1)*2 + 1]; + p3x = points[(i+1)*2]; + p3y = points[(i+1)*2 + 1]; - perpx = -(p1y - p2y); - perpy = p1x - p2x; + perpx = -(p1y - p2y); + perpy = p1x - p2x; - dist = Math.sqrt(perpx*perpx + perpy*perpy); - perpx /= dist; - perpy /= dist; - perpx *= width; - perpy *= width; + dist = Math.sqrt(perpx*perpx + perpy*perpy); + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; - perp2x = -(p2y - p3y); - perp2y = p2x - p3x; + perp2x = -(p2y - p3y); + perp2y = p2x - p3x; - dist = Math.sqrt(perp2x*perp2x + perp2y*perp2y); - perp2x /= dist; - perp2y /= dist; - perp2x *= width; - perp2y *= width; + dist = Math.sqrt(perp2x*perp2x + perp2y*perp2y); + perp2x /= dist; + perp2y /= dist; + perp2x *= width; + perp2y *= width; - a1 = (-perpy + p1y) - (-perpy + p2y); - b1 = (-perpx + p2x) - (-perpx + p1x); - c1 = (-perpx + p1x) * (-perpy + p2y) - (-perpx + p2x) * (-perpy + p1y); - a2 = (-perp2y + p3y) - (-perp2y + p2y); - b2 = (-perp2x + p2x) - (-perp2x + p3x); - c2 = (-perp2x + p3x) * (-perp2y + p2y) - (-perp2x + p2x) * (-perp2y + p3y); + a1 = (-perpy + p1y) - (-perpy + p2y); + b1 = (-perpx + p2x) - (-perpx + p1x); + c1 = (-perpx + p1x) * (-perpy + p2y) - (-perpx + p2x) * (-perpy + p1y); + a2 = (-perp2y + p3y) - (-perp2y + p2y); + b2 = (-perp2x + p2x) - (-perp2x + p3x); + c2 = (-perp2x + p3x) * (-perp2y + p2y) - (-perp2x + p2x) * (-perp2y + p3y); - denom = a1*b2 - a2*b1; + denom = a1*b2 - a2*b1; - if (denom == 0) { - denom+=1; - } + if (denom === 0) { + denom+=1; + } - px = (b1*c2 - b2*c1)/denom; - py = (a2*c1 - a1*c2)/denom; + px = (b1*c2 - b2*c1)/denom; + py = (a2*c1 - a1*c2)/denom; - pdist = (px -p2x) * (px -p2x) + (py -p2y) + (py -p2y); + pdist = (px -p2x) * (px -p2x) + (py -p2y) + (py -p2y); - if(pdist > 140 * 140) - { - perp3x = perpx - perp2x; - perp3y = perpy - perp2y; + if(pdist > 140 * 140) + { + perp3x = perpx - perp2x; + perp3y = perpy - perp2y; - dist = Math.sqrt(perp3x*perp3x + perp3y*perp3y); - perp3x /= dist; - perp3y /= dist; - perp3x *= width; - perp3y *= width; + dist = Math.sqrt(perp3x*perp3x + perp3y*perp3y); + perp3x /= dist; + perp3y /= dist; + perp3x *= width; + perp3y *= width; - verts.push(p2x - perp3x, p2y -perp3y); - verts.push(r, g, b, alpha); + verts.push(p2x - perp3x, p2y -perp3y); + verts.push(r, g, b, alpha); - verts.push(p2x + perp3x, p2y +perp3y); - verts.push(r, g, b, alpha); + verts.push(p2x + perp3x, p2y +perp3y); + verts.push(r, g, b, alpha); - verts.push(p2x - perp3x, p2y -perp3y); - verts.push(r, g, b, alpha); + verts.push(p2x - perp3x, p2y -perp3y); + verts.push(r, g, b, alpha); - indexCount++; - } - else - { - verts.push(px , py); - verts.push(r, g, b, alpha); + indexCount++; + } + else + { + verts.push(px , py); + verts.push(r, g, b, alpha); - verts.push(p2x - (px-p2x), p2y - (py - p2y)); - verts.push(r, g, b, alpha); - } - } + verts.push(p2x - (px-p2x), p2y - (py - p2y)); + verts.push(r, g, b, alpha); + } + } - p1x = points[(length-2)*2] - p1y = points[(length-2)*2 + 1] + p1x = points[(length-2)*2] + p1y = points[(length-2)*2 + 1] - p2x = points[(length-1)*2] - p2y = points[(length-1)*2 + 1] + p2x = points[(length-1)*2] + p2y = points[(length-1)*2 + 1] - perpx = -(p1y - p2y) - perpy = p1x - p2x; + perpx = -(p1y - p2y) + perpy = p1x - p2x; - dist = Math.sqrt(perpx*perpx + perpy*perpy); - perpx /= dist; - perpy /= dist; - perpx *= width; - perpy *= width; + dist = Math.sqrt(perpx*perpx + perpy*perpy); + perpx /= dist; + perpy /= dist; + perpx *= width; + perpy *= width; - verts.push(p2x - perpx , p2y - perpy) - verts.push(r, g, b, alpha); + verts.push(p2x - perpx , p2y - perpy) + verts.push(r, g, b, alpha); - verts.push(p2x + perpx , p2y + perpy) - verts.push(r, g, b, alpha); + verts.push(p2x + perpx , p2y + perpy) + verts.push(r, g, b, alpha); - indices.push(indexStart); + indices.push(indexStart); - for (var i=0; i < indexCount; i++) - { - indices.push(indexStart++); - }; + for (i = 0; i < indexCount; i++) + { + indices.push(indexStart++); + } - indices.push(indexStart-1); + indices.push(indexStart-1); } /** @@ -469,46 +470,37 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) */ PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) { - var points = graphicsData.points; - if(points.length < 6)return; + var points = graphicsData.points; + if (points.length < 6) return; - // get first and last point.. figure out the middle! - var verts = webGLData.points; - var indices = webGLData.indices; + // get first and last point.. figure out the middle! + var verts = webGLData.points; + var indices = webGLData.indices; - var length = points.length / 2; + var triangles = PIXI.PolyK.Triangulate(points); + var vertPos = verts.length / 6; - // sort color - var color = HEXtoRGB(graphicsData.fillColor); - var alpha = graphicsData.fillAlpha; - var r = color[0] * alpha; - var g = color[1] * alpha; - var b = color[2] * alpha; + for (var i = 0, l = triangles.length; i < l; i+=3) + { + indices.push(triangles[i] + vertPos); + indices.push(triangles[i] + vertPos); + indices.push(triangles[i+1] + vertPos); + indices.push(triangles[i+2] +vertPos); + indices.push(triangles[i+2] + vertPos); + } - var triangles = PIXI.PolyK.Triangulate(points); + // sort color + var color = hex2rgb(graphicsData.fillColor); + var alpha = graphicsData.fillAlpha; + var r = color[0] * alpha; + var g = color[1] * alpha; + var b = color[2] * alpha; - var vertPos = verts.length / 6; - - for (var i=0; i < triangles.length; i+=3) - { - indices.push(triangles[i] + vertPos); - indices.push(triangles[i] + vertPos); - indices.push(triangles[i+1] + vertPos); - indices.push(triangles[i+2] +vertPos); - indices.push(triangles[i+2] + vertPos); - }; - - for (var i = 0; i < length; i++) - { - verts.push(points[i * 2], points[i * 2 + 1], - r, g, b, alpha); - }; -} - -function HEXtoRGB(hex) { - return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; + for (i = 0, l = points.length / 2; i < l; i++) + { + verts.push(points[i * 2], points[i * 2 + 1], + r, g, b, alpha); + } } - - diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index a6507cf..fcbf052 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -17,12 +17,11 @@ */ PIXI.WebGLRenderGroup = function(gl) { - this.gl = gl; - this.root; - - this.backgroundColor; - this.batchs = []; - this.toRemove = []; + this.gl = gl; + this.root = null; + // this.backgroundColor = null; + this.batchs = []; + this.toRemove = []; } // constructor @@ -37,17 +36,17 @@ PIXI.WebGLRenderGroup.prototype.constructor = PIXI.WebGLRenderGroup; */ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) { - // has this changed?? - if(this.root)this.removeDisplayObjectAndChildren(this.root); + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); - displayObject.worldVisible = displayObject.visible; + displayObject.worldVisible = displayObject.visible; - // soooooo // - // to check if any batchs exist already?? + // soooooo // + // to check if any batchs exist already?? - // TODO what if its already has an object? should remove it - this.root = displayObject; - this.addDisplayObjectAndChildren(displayObject); + // TODO what if its already has an object? should remove it + this.root = displayObject; + this.addDisplayObjectAndChildren(displayObject); } /** @@ -58,67 +57,67 @@ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) */ PIXI.WebGLRenderGroup.prototype.render = function(projection) { - PIXI.WebGLRenderer.updateTextures(); + PIXI.WebGLRenderer.updateTextures(); - var gl = this.gl; + var gl = this.gl; - gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - // will render all the elements in the group - var renderable; + // will render all the elements in the group + var renderable; - for (var i=0; i < this.batchs.length; i++) - { + for (var i=0; i < this.batchs.length; i++) + { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - continue; - } + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + continue; + } - // non sprite batch.. - var worldVisible = renderable.vcount === PIXI.visibleCount; + // non sprite batch.. + var worldVisible = renderable.vcount === PIXI.visibleCount; - if(renderable instanceof PIXI.TilingSprite) - { - if(worldVisible)this.renderTilingSprite(renderable, projection); - } - else if(renderable instanceof PIXI.Strip) - { - if(worldVisible)this.renderStrip(renderable, projection); - } - else if(renderable instanceof PIXI.Graphics) - { - if(worldVisible && renderable.renderable) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); - } - else if(renderable instanceof PIXI.FilterBlock) - { - /* - * for now only masks are supported.. - */ - if(renderable.open) - { - gl.enable(gl.STENCIL_TEST); + if(renderable instanceof PIXI.TilingSprite) + { + if(worldVisible)this.renderTilingSprite(renderable, projection); + } + else if(renderable instanceof PIXI.Strip) + { + if(worldVisible)this.renderStrip(renderable, projection); + } + else if(renderable instanceof PIXI.Graphics) + { + if(worldVisible && renderable.renderable) PIXI.WebGLGraphics.renderGraphics(renderable, projection);//, projectionMatrix); + } + else if(renderable instanceof PIXI.FilterBlock) + { + /* + * for now only masks are supported.. + */ + if(renderable.open) + { + gl.enable(gl.STENCIL_TEST); - gl.colorMask(false, false, false, false); - gl.stencilFunc(gl.ALWAYS,1,0xff); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.REPLACE); + gl.colorMask(false, false, false, false); + gl.stencilFunc(gl.ALWAYS,1,0xff); + gl.stencilOp(gl.KEEP,gl.KEEP,gl.REPLACE); - PIXI.WebGLGraphics.renderGraphics(renderable.mask, projection); + PIXI.WebGLGraphics.renderGraphics(renderable.mask, projection); - gl.colorMask(true, true, true, true); - gl.stencilFunc(gl.NOTEQUAL,0,0xff); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - } - else - { - gl.disable(gl.STENCIL_TEST); - } - } - } + gl.colorMask(true, true, true, true); + gl.stencilFunc(gl.NOTEQUAL,0,0xff); + gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); + } + else + { + gl.disable(gl.STENCIL_TEST); + } + } + } } @@ -144,152 +143,150 @@ PIXI.WebGLRenderGroup.prototype.handleFilter = function(filter, projection) */ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projection) { - PIXI.WebGLRenderer.updateTextures(); + PIXI.WebGLRenderer.updateTextures(); - var gl = this.gl; + var gl = this.gl; - gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); + gl.uniform2f(PIXI.shaderProgram.projectionVector, projection.x, projection.y); - // to do! - // render part of the scene... + // to do! + // render part of the scene... - var startIndex; - var startBatchIndex; + var startIndex, startBatchIndex, + endIndex, endBatchIndex, + head, next; - var endIndex; - var endBatchIndex; + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + */ + var nextRenderable = displayObject.first; + while(nextRenderable._iNext) + { + nextRenderable = nextRenderable._iNext; + if(nextRenderable.renderable && nextRenderable.__renderGroup)break; + } + var startBatch = nextRenderable.batch; - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - */ - var nextRenderable = displayObject.first; - while(nextRenderable._iNext) - { - nextRenderable = nextRenderable._iNext; - if(nextRenderable.renderable && nextRenderable.__renderGroup)break; - } - var startBatch = nextRenderable.batch; + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; - if(nextRenderable instanceof PIXI.Sprite) - { - startBatch = nextRenderable.batch; + head = startBatch.head; + next = head; - var head = startBatch.head; - var next = head; + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; - // ok now we have the batch.. need to find the start index! - if(head == nextRenderable) - { - startIndex = 0; - } - else - { - startIndex = 1; + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } - while(head.__next != nextRenderable) - { - startIndex++; - head = head.__next; - } - } - } - else - { - startBatch = nextRenderable; - } + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } - // Get the LAST renderable object - var lastRenderable = displayObject; - var endBatch; - var lastItem = displayObject; - while(lastItem.children.length > 0) - { - lastItem = lastItem.children[lastItem.children.length-1]; - if(lastItem.renderable)lastRenderable = lastItem; - } + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; - if(lastRenderable instanceof PIXI.Sprite) - { - endBatch = lastRenderable.batch; + head = endBatch.head; - var head = endBatch.head; + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; - if(head == lastRenderable) - { - endIndex = 0; - } - else - { - endIndex = 1; + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } - while(head.__next != lastRenderable) - { - endIndex++; - head = head.__next; - } - } - } - else - { - endBatch = lastRenderable; - } + // TODO - need to fold this up a bit! - // TODO - need to fold this up a bit! + if(startBatch == endBatch) + { + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex, endIndex+1); + } + else + { + this.renderSpecial(startBatch, projection); + } + return; + } - if(startBatch == endBatch) - { - if(startBatch instanceof PIXI.WebGLBatch) - { - startBatch.render(startIndex, endIndex+1); - } - else - { - this.renderSpecial(startBatch, projection); - } - return; - } + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); - // now we have first and last! - startBatchIndex = this.batchs.indexOf(startBatch); - endBatchIndex = this.batchs.indexOf(endBatch); + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else + { + this.renderSpecial(startBatch, projection); + } - // DO the first batch - if(startBatch instanceof PIXI.WebGLBatch) - { - startBatch.render(startIndex); - } - else - { - this.renderSpecial(startBatch, projection); - } + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; - // DO the middle batchs.. - for (var i=startBatchIndex+1; i < endBatchIndex; i++) - { - renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else + { + this.renderSpecial(renderable, projection); + } + } - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else - { - this.renderSpecial(renderable, projection); - } - } - - // DO the last batch.. - if(endBatch instanceof PIXI.WebGLBatch) - { - endBatch.render(0, endIndex+1); - } - else - { - this.renderSpecial(endBatch, projection); - } + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else + { + this.renderSpecial(endBatch, projection); + } } /** @@ -302,52 +299,52 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project */ PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable, projection) { - var worldVisible = renderable.vcount === PIXI.visibleCount + var worldVisible = renderable.vcount === PIXI.visibleCount - if(renderable instanceof PIXI.TilingSprite) - { - if(worldVisible)this.renderTilingSprite(renderable, projection); - } - else if(renderable instanceof PIXI.Strip) - { - if(worldVisible)this.renderStrip(renderable, projection); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(worldVisible) renderable.renderWebGL(this, projection); - } - else if(renderable instanceof PIXI.Graphics) - { - if(worldVisible && renderable.renderable) PIXI.WebGLGraphics.renderGraphics(renderable, projection); - } - else if(renderable instanceof PIXI.FilterBlock) - { - /* - * for now only masks are supported.. - */ + if(renderable instanceof PIXI.TilingSprite) + { + if(worldVisible)this.renderTilingSprite(renderable, projection); + } + else if(renderable instanceof PIXI.Strip) + { + if(worldVisible)this.renderStrip(renderable, projection); + } + else if(renderable instanceof PIXI.CustomRenderable) + { + if(worldVisible) renderable.renderWebGL(this, projection); + } + else if(renderable instanceof PIXI.Graphics) + { + if(worldVisible && renderable.renderable) PIXI.WebGLGraphics.renderGraphics(renderable, projection); + } + else if(renderable instanceof PIXI.FilterBlock) + { + /* + * for now only masks are supported.. + */ - var gl = PIXI.gl; + var gl = PIXI.gl; - if(renderable.open) - { - gl.enable(gl.STENCIL_TEST); + if(renderable.open) + { + gl.enable(gl.STENCIL_TEST); - gl.colorMask(false, false, false, false); - gl.stencilFunc(gl.ALWAYS,1,0xff); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.REPLACE); + gl.colorMask(false, false, false, false); + gl.stencilFunc(gl.ALWAYS,1,0xff); + gl.stencilOp(gl.KEEP,gl.KEEP,gl.REPLACE); - PIXI.WebGLGraphics.renderGraphics(renderable.mask, projection); + PIXI.WebGLGraphics.renderGraphics(renderable.mask, projection); - // we know this is a render texture so enable alpha too.. - gl.colorMask(true, true, true, true); - gl.stencilFunc(gl.NOTEQUAL,0,0xff); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - } - else - { - gl.disable(gl.STENCIL_TEST); - } - } + // we know this is a render texture so enable alpha too.. + gl.colorMask(true, true, true, true); + gl.stencilFunc(gl.NOTEQUAL,0,0xff); + gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); + } + else + { + gl.disable(gl.STENCIL_TEST); + } + } } /** @@ -360,36 +357,36 @@ PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable, projection) PIXI.WebGLRenderGroup.prototype.updateTexture = function(displayObject) { - // TODO definitely can optimse this function.. + // TODO definitely can optimse this function.. - this.removeObject(displayObject); + this.removeObject(displayObject); - /* - * LOOK FOR THE PREVIOUS RENDERABLE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousRenderable = displayObject.first; - while(previousRenderable != this.root) - { - previousRenderable = previousRenderable._iPrev; - if(previousRenderable.renderable && previousRenderable.__renderGroup)break; - } + /* + * LOOK FOR THE PREVIOUS RENDERABLE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousRenderable = displayObject.first; + while(previousRenderable != this.root) + { + previousRenderable = previousRenderable._iPrev; + if(previousRenderable.renderable && previousRenderable.__renderGroup)break; + } - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - */ - var nextRenderable = displayObject.last; - while(nextRenderable._iNext) - { - nextRenderable = nextRenderable._iNext; - if(nextRenderable.renderable && nextRenderable.__renderGroup)break; - } + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + */ + var nextRenderable = displayObject.last; + while(nextRenderable._iNext) + { + nextRenderable = nextRenderable._iNext; + if(nextRenderable.renderable && nextRenderable.__renderGroup)break; + } - this.insertObject(displayObject, previousRenderable, nextRenderable); + this.insertObject(displayObject, previousRenderable, nextRenderable); } /** @@ -402,34 +399,34 @@ PIXI.WebGLRenderGroup.prototype.updateTexture = function(displayObject) */ PIXI.WebGLRenderGroup.prototype.addFilterBlocks = function(start, end) { - start.__renderGroup = this; - end.__renderGroup = this; - /* - * LOOK FOR THE PREVIOUS RENDERABLE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousRenderable = start; - while(previousRenderable != this.root) - { - previousRenderable = previousRenderable._iPrev; - if(previousRenderable.renderable && previousRenderable.__renderGroup)break; - } - this.insertAfter(start, previousRenderable); + start.__renderGroup = this; + end.__renderGroup = this; + /* + * LOOK FOR THE PREVIOUS RENDERABLE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousRenderable = start; + while(previousRenderable != this.root) + { + previousRenderable = previousRenderable._iPrev; + if(previousRenderable.renderable && previousRenderable.__renderGroup)break; + } + this.insertAfter(start, previousRenderable); - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - */ - var previousRenderable2 = end; - while(previousRenderable2 != this.root) - { - previousRenderable2 = previousRenderable2._iPrev; - if(previousRenderable2.renderable && previousRenderable2.__renderGroup)break; - } - this.insertAfter(end, previousRenderable2); + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + */ + var previousRenderable2 = end; + while(previousRenderable2 != this.root) + { + previousRenderable2 = previousRenderable2._iPrev; + if(previousRenderable2.renderable && previousRenderable2.__renderGroup)break; + } + this.insertAfter(end, previousRenderable2); } /** @@ -442,8 +439,8 @@ PIXI.WebGLRenderGroup.prototype.addFilterBlocks = function(start, end) */ PIXI.WebGLRenderGroup.prototype.removeFilterBlocks = function(start, end) { - this.removeObject(start); - this.removeObject(end); + this.removeObject(start); + this.removeObject(end); } /** @@ -455,52 +452,52 @@ PIXI.WebGLRenderGroup.prototype.removeFilterBlocks = function(start, end) */ PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) { - if(displayObject.__renderGroup)displayObject.__renderGroup.removeDisplayObjectAndChildren(displayObject); + if(displayObject.__renderGroup)displayObject.__renderGroup.removeDisplayObjectAndChildren(displayObject); - /* - * LOOK FOR THE PREVIOUS RENDERABLE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ + /* + * LOOK FOR THE PREVIOUS RENDERABLE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ - var previousRenderable = displayObject.first; - while(previousRenderable != this.root.first) - { - previousRenderable = previousRenderable._iPrev; - if(previousRenderable.renderable && previousRenderable.__renderGroup)break; - } + var previousRenderable = displayObject.first; + while(previousRenderable != this.root.first) + { + previousRenderable = previousRenderable._iPrev; + if(previousRenderable.renderable && previousRenderable.__renderGroup)break; + } - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - */ - var nextRenderable = displayObject.last; - while(nextRenderable._iNext) - { - nextRenderable = nextRenderable._iNext; - if(nextRenderable.renderable && nextRenderable.__renderGroup)break; - } + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + */ + var nextRenderable = displayObject.last; + while(nextRenderable._iNext) + { + nextRenderable = nextRenderable._iNext; + if(nextRenderable.renderable && nextRenderable.__renderGroup)break; + } - // one the display object hits this. we can break the loop + // one the display object hits this. we can break the loop - var tempObject = displayObject.first; - var testObject = displayObject.last._iNext; - do - { - tempObject.__renderGroup = this; + var tempObject = displayObject.first; + var testObject = displayObject.last._iNext; + do + { + tempObject.__renderGroup = this; - if(tempObject.renderable) - { + if(tempObject.renderable) + { - this.insertObject(tempObject, previousRenderable, nextRenderable); - previousRenderable = tempObject; - } + this.insertObject(tempObject, previousRenderable, nextRenderable); + previousRenderable = tempObject; + } - tempObject = tempObject._iNext; - } - while(tempObject != testObject) + tempObject = tempObject._iNext; + } + while(tempObject != testObject) } /** @@ -512,17 +509,17 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayOb */ PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) { - if(displayObject.__renderGroup != this)return; + if(displayObject.__renderGroup != this)return; -// var displayObject = displayObject.first; - var lastObject = displayObject.last; - do - { - displayObject.__renderGroup = null; - if(displayObject.renderable)this.removeObject(displayObject); - displayObject = displayObject._iNext; - } - while(displayObject) +// var displayObject = displayObject.first; + var lastObject = displayObject.last; + do + { + displayObject.__renderGroup = null; + if(displayObject.renderable)this.removeObject(displayObject); + displayObject = displayObject._iNext; + } + while(displayObject) } /** @@ -536,130 +533,130 @@ PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displa */ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousObject, nextObject) { - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - var previousSprite = previousObject; - var nextSprite = nextObject; + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + var previousSprite = previousObject, + nextSprite = nextObject, + batch, index; - /* - * so now we have the next renderable and the previous renderable - * - */ - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch + /* + * so now we have the next renderable and the previous renderable + * + */ + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch, nextBatch; - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = PIXI.WebGLRenderer.getBatch(); + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + batch = PIXI.WebGLRenderer.getBatch(); - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); + index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index + 1, 0, batch, splitBatch); - return; - } - } - } - } - else - { - // TODO re-word! + return; + } + } + } + } + else + { + // TODO re-word! - nextBatch = nextSprite; - } - } + nextBatch = nextSprite; + } + } - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ - var batch = PIXI.WebGLRenderer.getBatch(); - batch.init(displayObject); + batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } + if(previousBatch) // if this is invalid it means + { + index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index + 1, 0, batch); + } + else + { + this.batchs.push(batch); + } - return; - } - else if(displayObject instanceof PIXI.TilingSprite) - { + return; + } + else if(displayObject instanceof PIXI.TilingSprite) + { - // add to a batch!! - this.initTilingSprite(displayObject); - // this.batchs.push(displayObject); + // add to a batch!! + this.initTilingSprite(displayObject); + // this.batchs.push(displayObject); - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - // this.batchs.push(displayObject); - } - else if(displayObject)// instanceof PIXI.Graphics) - { - //displayObject.initWebGL(this); + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + // this.batchs.push(displayObject); + } + /*else if(displayObject)// instanceof PIXI.Graphics) + { + //displayObject.initWebGL(this); - // add to a batch!! - //this.initStrip(displayObject); - //this.batchs.push(displayObject); - } + // add to a batch!! + //this.initStrip(displayObject); + //this.batchs.push(displayObject); + }*/ - this.insertAfter(displayObject, previousSprite); + this.insertAfter(displayObject, previousSprite); - // insert and SPLIT! + // insert and SPLIT! } @@ -673,49 +670,51 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO */ PIXI.WebGLRenderGroup.prototype.insertAfter = function(item, displayObject) { - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch = displayObject.batch; + var previousBatch, splitBatch, index; - if(previousBatch) - { - // so this object is in a batch! + if(displayObject instanceof PIXI.Sprite) + { + previousBatch = displayObject.batch; - // is it not? need to split the batch - if(previousBatch.tail == displayObject) - { - // is it tail? insert in to batchs - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, item); - } - else - { - // TODO MODIFY ADD / REMOVE CHILD TO ACCOUNT FOR FILTERS (also get prev and next) // + if(previousBatch) + { + // so this object is in a batch! - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(displayObject.__next); + // is it not? need to split the batch + if(previousBatch.tail == displayObject) + { + // is it tail? insert in to batchs + index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, item); + } + else + { + // TODO MODIFY ADD / REMOVE CHILD TO ACCOUNT FOR FILTERS (also get prev and next) // - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, item, splitBatch); - } - } - else - { - this.batchs.push(item); - } - } - else - { - var index = this.batchs.indexOf( displayObject ); - this.batchs.splice(index+1, 0, item); - } + // THERE IS A SPLIT IN THIS BATCH! // + splitBatch = previousBatch.split(displayObject.__next); + + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index + 1, 0, item, splitBatch); + } + } + else + { + this.batchs.push(item); + } + } + else + { + index = this.batchs.indexOf( displayObject ); + this.batchs.splice(index + 1, 0, item); + } } /** @@ -727,73 +726,73 @@ PIXI.WebGLRenderGroup.prototype.insertAfter = function(item, displayObject) */ PIXI.WebGLRenderGroup.prototype.removeObject = function(displayObject) { - // loop through children.. - // display object // + // loop through children.. + // display object // - // add a child from the render group.. - // remove it and all its children! - //displayObject.cacheVisible = false;//displayObject.visible; + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; + /* + * removing is a lot quicker.. + * + */ + var batchToRemove, index; - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering + if (displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering - batch.remove(displayObject); + batch.remove(displayObject); - if(batch.size==0) - { - batchToRemove = batch; - } - } - else - { - batchToRemove = displayObject; - } + if (!batch.size) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + index = this.batchs.indexOf( batchToRemove ); + if (index === -1) return;// this means it was added then removed before rendered - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if (index === 0 || index === this.batchs.length - 1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - return; - } + return; + } - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); + if(this.batchs[index - 1] instanceof PIXI.WebGLBatch && this.batchs[index + 1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index - 1].texture == this.batchs[index + 1].texture && this.batchs[index - 1].blendMode == this.batchs[index + 1].blendMode) + { + //console.log("MERGE") + this.batchs[index - 1].merge(this.batchs[index + 1]); - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index + 1]); + this.batchs.splice(index, 2); + return; + } + } - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - } + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } } /** @@ -805,54 +804,54 @@ PIXI.WebGLRenderGroup.prototype.removeObject = function(displayObject) */ PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) { - var gl = this.gl; + var gl = this.gl; - // make the texture tilable.. + // make the texture tilable.. - sprite.verticies = new Float32Array([0, 0, - sprite.width, 0, - sprite.width, sprite.height, - 0, sprite.height]); + sprite.verticies = new Float32Array([0, 0, + sprite.width, 0, + sprite.width, sprite.height, + 0, sprite.height]); - sprite.uvs = new Float32Array([0, 0, - 1, 0, - 1, 1, - 0, 1]); + sprite.uvs = new Float32Array([0, 0, + 1, 0, + 1, 1, + 0, 1]); - sprite.colors = new Float32Array([1,1,1,1]); + sprite.colors = new Float32Array([1,1,1,1]); - sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); + sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - sprite._vertexBuffer = gl.createBuffer(); - sprite._indexBuffer = gl.createBuffer(); - sprite._uvBuffer = gl.createBuffer(); - sprite._colorBuffer = gl.createBuffer(); + sprite._vertexBuffer = gl.createBuffer(); + sprite._indexBuffer = gl.createBuffer(); + sprite._uvBuffer = gl.createBuffer(); + sprite._colorBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, sprite.verticies, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, sprite.verticies, gl.STATIC_DRAW); - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferData(gl.ARRAY_BUFFER, sprite.uvs, gl.DYNAMIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, sprite._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, sprite.colors, gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, sprite.colors, gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, sprite._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, sprite.indices, gl.STATIC_DRAW); // return ( (x > 0) && ((x & (x - 1)) == 0) ); - if(sprite.texture.baseTexture._glTexture) - { - gl.bindTexture(gl.TEXTURE_2D, sprite.texture.baseTexture._glTexture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - sprite.texture.baseTexture._powerOf2 = true; - } - else - { - sprite.texture.baseTexture._powerOf2 = true; - } + if(sprite.texture.baseTexture._glTexture) + { + gl.bindTexture(gl.TEXTURE_2D, sprite.texture.baseTexture._glTexture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + sprite.texture.baseTexture._powerOf2 = true; + } + else + { + sprite.texture.baseTexture._powerOf2 = true; + } } /** @@ -865,86 +864,86 @@ PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) */ PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { - var gl = this.gl; - var shaderProgram = PIXI.shaderProgram; -// mat - //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - //PIXI.mat4.transpose(mat4Real); - //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) + var gl = this.gl; + var shaderProgram = PIXI.shaderProgram; +// mat + //var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); + //PIXI.mat4.transpose(mat4Real); + //PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - gl.useProgram(PIXI.stripShaderProgram); + gl.useProgram(PIXI.stripShaderProgram); - var m = PIXI.mat3.clone(strip.worldTransform); + var m = PIXI.mat3.clone(strip.worldTransform); - PIXI.mat3.transpose(m); + PIXI.mat3.transpose(m); - // set the matrix transform for the - gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); - gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); - gl.uniform1f(PIXI.stripShaderProgram.alpha, strip.worldAlpha); + // set the matrix transform for the + gl.uniformMatrix3fv(PIXI.stripShaderProgram.translationMatrix, false, m); + gl.uniform2f(PIXI.stripShaderProgram.projectionVector, projection.x, projection.y); + gl.uniform1f(PIXI.stripShaderProgram.alpha, strip.worldAlpha); /* - if(strip.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } - */ + if(strip.blendMode == PIXI.blendModes.NORMAL) + { + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + } + else + { + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); + } + */ - if(!strip.dirty) - { + if(!strip.dirty) + { - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies) - gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies) + gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); - gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); + gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - // dont need to upload! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - } - else - { - strip.dirty = false; - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); + // dont need to upload! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); + } + else + { + strip.dirty = false; + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); + // update the uvs + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); - gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW) + gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - // dont need to upload! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); + // dont need to upload! + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); - } - //console.log(gl.TRIANGLE_STRIP); + } + //console.log(gl.TRIANGLE_STRIP); - gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - gl.useProgram(PIXI.shaderProgram); + gl.useProgram(PIXI.shaderProgram); } /** @@ -957,34 +956,34 @@ PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) */ PIXI.WebGLRenderGroup.prototype.renderTilingSprite = function(sprite, projectionMatrix) { - var gl = this.gl; - var shaderProgram = PIXI.shaderProgram; + var gl = this.gl; + var shaderProgram = PIXI.shaderProgram; - var tilePosition = sprite.tilePosition; - var tileScale = sprite.tileScale; + var tilePosition = sprite.tilePosition; + var tileScale = sprite.tileScale; - var offsetX = tilePosition.x/sprite.texture.baseTexture.width; - var offsetY = tilePosition.y/sprite.texture.baseTexture.height; + var offsetX = tilePosition.x/sprite.texture.baseTexture.width; + var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; - sprite.uvs[0] = 0 - offsetX; - sprite.uvs[1] = 0 - offsetY; + sprite.uvs[0] = 0 - offsetX; + sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) -offsetX; - sprite.uvs[3] = 0 - offsetY; + sprite.uvs[2] = (1 * scaleX) -offsetX; + sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) - offsetX; - sprite.uvs[5] = (1 *scaleY) - offsetY; + sprite.uvs[4] = (1 *scaleX) - offsetX; + sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 - offsetX; - sprite.uvs[7] = (1 *scaleY) - offsetY; + sprite.uvs[6] = 0 - offsetX; + sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) - this.renderStrip(sprite, projectionMatrix); + this.renderStrip(sprite, projectionMatrix); } /** @@ -996,23 +995,23 @@ PIXI.WebGLRenderGroup.prototype.renderTilingSprite = function(sprite, projection */ PIXI.WebGLRenderGroup.prototype.initStrip = function(strip) { - // build the strip! - var gl = this.gl; - var shaderProgram = this.shaderProgram; + // build the strip! + var gl = this.gl; + var shaderProgram = this.shaderProgram; - strip._vertexBuffer = gl.createBuffer(); - strip._indexBuffer = gl.createBuffer(); - strip._uvBuffer = gl.createBuffer(); - strip._colorBuffer = gl.createBuffer(); + strip._vertexBuffer = gl.createBuffer(); + strip._indexBuffer = gl.createBuffer(); + strip._uvBuffer = gl.createBuffer(); + strip._colorBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.DYNAMIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.DYNAMIC_DRAW); - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); + gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); + gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index ad88e5b..946e4e6 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -6,7 +6,7 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); // an instance of the gl context.. // only one at the moment :/ -PIXI.gl; +PIXI.gl = null; /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer @@ -25,36 +25,36 @@ PIXI.gl; */ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) { - // do a catch.. only 1 webGL renderer.. + // do a catch.. only 1 webGL renderer.. - this.transparent = !!transparent; + this.transparent = !!transparent; - this.width = width || 800; - this.height = height || 600; + this.width = width || 800; + this.height = height || 600; - this.view = view || document.createElement( 'canvas' ); + 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.. + // deal with losing context.. var scope = this; - this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) - this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) - this.batchs = []; + this.batchs = []; - try - { + try + { PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { - alpha: this.transparent, - antialias:!!antialias, // SPEED UP?? - premultipliedAlpha:false, - stencil:true + alpha: this.transparent, + antialias:!!antialias, // SPEED UP?? + premultipliedAlpha:false, + stencil:true }); } catch (e) { - throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); } PIXI.initPrimitiveShader(); @@ -67,8 +67,8 @@ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); - gl.disable(gl.DEPTH_TEST); - gl.disable(gl.CULL_FACE); + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); @@ -94,14 +94,14 @@ PIXI.WebGLRenderer.prototype.constructor = PIXI.WebGLRenderer; */ PIXI.WebGLRenderer.getBatch = function() { - if(PIXI._batchs.length == 0) - { - return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); - } - else - { - return PIXI._batchs.pop(); - } + if(!PIXI._batchs.length) + { + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); + } + else + { + return PIXI._batchs.pop(); + } } /** @@ -114,8 +114,8 @@ PIXI.WebGLRenderer.getBatch = function() */ PIXI.WebGLRenderer.returnBatch = function(batch) { - batch.clean(); - PIXI._batchs.push(batch); + batch.clean(); + PIXI._batchs.push(batch); } /** @@ -126,72 +126,72 @@ PIXI.WebGLRenderer.returnBatch = function(batch) */ PIXI.WebGLRenderer.prototype.render = function(stage) { - if(this.contextLost)return; + if(this.contextLost)return; - // if rendering a new stage clear the batchs.. - if(this.__stage !== stage) - { - // TODO make this work - // dont think this is needed any more? - this.__stage = stage; - this.stageRenderGroup.setRenderable(stage); - } + // if rendering a new stage clear the batchs.. + if(this.__stage !== stage) + { + // TODO make this work + // dont think this is needed any more? + this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); + } - // TODO not needed now... - // update children if need be - // best to remove first! - /*for (var i=0; i < stage.__childrenRemoved.length; i++) - { - var group = stage.__childrenRemoved[i].__renderGroup - if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); - }*/ + // TODO not needed now... + // update children if need be + // best to remove first! + /*for (var i=0; i < stage.__childrenRemoved.length; i++) + { + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); + }*/ - // update any textures - PIXI.WebGLRenderer.updateTextures(); + // update any textures + PIXI.WebGLRenderer.updateTextures(); - // update the scene graph - PIXI.visibleCount++; - stage.updateTransform(); + // update the scene graph + PIXI.visibleCount++; + stage.updateTransform(); - var gl = this.gl; + var gl = this.gl; - // -- Does this need to be set every frame? -- // - gl.colorMask(true, true, true, this.transparent); - gl.viewport(0, 0, this.width, this.height); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); - gl.clear(gl.COLOR_BUFFER_BIT); + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); - // HACK TO TEST + // HACK TO TEST - this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - this.stageRenderGroup.render(PIXI.projection); + // this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(PIXI.projection); - // interaction - // run interaction! - if(stage.interactive) - { - //need to add some events! - if(!stage._interactiveEventsAdded) - { - stage._interactiveEventsAdded = true; - stage.interactionManager.setTarget(this); - } - } + // interaction + // run interaction! + if(stage.interactive) + { + //need to add some events! + if(!stage._interactiveEventsAdded) + { + stage._interactiveEventsAdded = true; + stage.interactionManager.setTarget(this); + } + } - // after rendering lets confirm all frames that have been uodated.. - if(PIXI.Texture.frameUpdates.length > 0) - { - for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) - { - PIXI.Texture.frameUpdates[i].updateFrame = false; - }; + // after rendering lets confirm all frames that have been uodated.. + if(PIXI.Texture.frameUpdates.length > 0) + { + for (var i = 0, l = PIXI.Texture.frameUpdates.length; i < l; i++) + { + PIXI.Texture.frameUpdates[i].updateFrame = false; + } - PIXI.Texture.frameUpdates = []; - } + PIXI.Texture.frameUpdates = []; + } } /** @@ -203,11 +203,13 @@ PIXI.WebGLRenderer.prototype.render = function(stage) */ PIXI.WebGLRenderer.updateTextures = function() { - //TODO break this out into a texture manager... - for (var i=0; i < PIXI.texturesToUpdate.length; i++) PIXI.WebGLRenderer.updateTexture(PIXI.texturesToUpdate[i]); - for (var i=0; i < PIXI.texturesToDestroy.length; i++) PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - PIXI.texturesToUpdate = []; - PIXI.texturesToDestroy = []; + //TODO break this out into a texture manager... + for (var i = 0, l = PIXI.texturesToUpdate.length; i < l; i++) + PIXI.WebGLRenderer.updateTexture(PIXI.texturesToUpdate[i]); + for (i = 0, l = PIXI.texturesToDestroy.length; i < l; i++) + PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; + PIXI.texturesToDestroy = []; } /** @@ -220,38 +222,38 @@ PIXI.WebGLRenderer.updateTextures = function() */ PIXI.WebGLRenderer.updateTexture = function(texture) { - //TODO break this out into a texture manager... - var gl = PIXI.gl; + //TODO break this out into a texture manager... + var gl = PIXI.gl; - if(!texture._glTexture) - { - texture._glTexture = gl.createTexture(); - } + if(!texture._glTexture) + { + texture._glTexture = gl.createTexture(); + } - if(texture.hasLoaded) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + if(texture.hasLoaded) + { + gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - // reguler... + // reguler... - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } + if(!texture._powerOf2) + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } - gl.bindTexture(gl.TEXTURE_2D, null); - } + gl.bindTexture(gl.TEXTURE_2D, null); + } } /** @@ -263,14 +265,14 @@ PIXI.WebGLRenderer.updateTexture = function(texture) */ PIXI.WebGLRenderer.destroyTexture = function(texture) { - //TODO break this out into a texture manager... - var gl = PIXI.gl; + //TODO break this out into a texture manager... + var gl = PIXI.gl; - if(texture._glTexture) - { - texture._glTexture = gl.createTexture(); - gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); - } + if(texture._glTexture) + { + texture._glTexture = gl.createTexture(); + gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); + } } /** @@ -282,23 +284,23 @@ PIXI.WebGLRenderer.destroyTexture = function(texture) */ PIXI.WebGLRenderer.prototype.resize = function(width, height) { - this.width = width; - this.height = height; + this.width = width; + this.height = height; - this.view.width = width; - this.view.height = height; + this.view.width = width; + this.view.height = height; - this.gl.viewport(0, 0, this.width, this.height); + this.gl.viewport(0, 0, this.width, this.height); - //var projectionMatrix = this.projectionMatrix; + //var projectionMatrix = this.projectionMatrix; - PIXI.projection.x = this.width/2; - PIXI.projection.y = this.height/2; + PIXI.projection.x = this.width/2; + PIXI.projection.y = this.height/2; -// projectionMatrix[0] = 2/this.width; -// projectionMatrix[5] = -2/this.height; -// projectionMatrix[12] = -1; -// projectionMatrix[13] = 1; +// projectionMatrix[0] = 2/this.width; +// projectionMatrix[5] = -2/this.height; +// projectionMatrix[12] = -1; +// projectionMatrix[13] = 1; } /** @@ -310,8 +312,8 @@ PIXI.WebGLRenderer.prototype.resize = function(width, height) */ PIXI.WebGLRenderer.prototype.handleContextLost = function(event) { - event.preventDefault(); - this.contextLost = true; + event.preventDefault(); + this.contextLost = true; } /** @@ -323,26 +325,26 @@ PIXI.WebGLRenderer.prototype.handleContextLost = function(event) */ PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) { - this.gl = this.view.getContext("experimental-webgl", { - alpha: true + this.gl = this.view.getContext("experimental-webgl", { + alpha: true }); - this.initShaders(); + this.initShaders(); - for(var key in PIXI.TextureCache) - { - var texture = PIXI.TextureCache[key].baseTexture; - texture._glTexture = null; - PIXI.WebGLRenderer.updateTexture(texture); - }; + for(var key in PIXI.TextureCache) + { + var texture = PIXI.TextureCache[key].baseTexture; + texture._glTexture = null; + PIXI.WebGLRenderer.updateTexture(texture); + } - for (var i=0; i < this.batchs.length; i++) - { - this.batchs[i].restoreLostContext(this.gl)// - this.batchs[i].dirty = true; - }; + for (var i = 0, l = this.batchs.length; i < l; i++) + { + this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].dirty = true; + } - PIXI._restoreBatchs(this.gl); + PIXI._restoreBatchs(this.gl); - this.contextLost = false; + this.contextLost = false; } diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 93cf578..9728623 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -62,7 +62,7 @@ PIXI.stripShaderVertexSrc = [ "varying vec2 vTextureCoord;", "varying float vColor;", "void main(void) {", - "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vTextureCoord = aTextureCoord;", "vColor = aColor;", @@ -90,7 +90,7 @@ PIXI.primitiveShaderVertexSrc = [ "uniform float alpha;", "varying vec4 vColor;", "void main(void) {", - "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", + "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", "vColor = aColor * alpha;", "}" @@ -98,9 +98,9 @@ PIXI.primitiveShaderVertexSrc = [ PIXI.initPrimitiveShader = function() { - var gl = PIXI.gl; + var gl = PIXI.gl; - var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) + var shaderProgram = PIXI.compileProgram(PIXI.primitiveShaderVertexSrc, PIXI.primitiveShaderFragmentSrc) gl.useProgram(shaderProgram); @@ -110,49 +110,49 @@ PIXI.initPrimitiveShader = function() shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); - shaderProgram.alpha = gl.getUniformLocation(shaderProgram, "alpha"); + shaderProgram.alpha = gl.getUniformLocation(shaderProgram, "alpha"); - PIXI.primitiveProgram = shaderProgram; + PIXI.primitiveProgram = shaderProgram; } PIXI.initDefaultShader = function() { - var gl = this.gl; - var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.shaderVertexSrc, PIXI.shaderFragmentSrc) gl.useProgram(shaderProgram); shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); // shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - PIXI.shaderProgram = shaderProgram; + PIXI.shaderProgram = shaderProgram; } PIXI.initDefaultStripShader = function() { - var gl = this.gl; - var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.stripShaderFragmentSrc) + var gl = this.gl; + var shaderProgram = PIXI.compileProgram(PIXI.stripShaderVertexSrc, PIXI.stripShaderFragmentSrc) gl.useProgram(shaderProgram); shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord"); - shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); - shaderProgram.alpha = gl.getUniformLocation(shaderProgram, "alpha"); + shaderProgram.translationMatrix = gl.getUniformLocation(shaderProgram, "translationMatrix"); + shaderProgram.alpha = gl.getUniformLocation(shaderProgram, "alpha"); - shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); + shaderProgram.colorAttribute = gl.getAttribLocation(shaderProgram, "aColor"); shaderProgram.projectionVector = gl.getUniformLocation(shaderProgram, "projectionVector"); shaderProgram.samplerUniform = gl.getUniformLocation(shaderProgram, "uSampler"); - PIXI.stripShaderProgram = shaderProgram; + PIXI.stripShaderProgram = shaderProgram; } PIXI.CompileVertexShader = function(gl, shaderSrc) @@ -183,11 +183,11 @@ PIXI._CompileShader = function(gl, shaderSrc, shaderType) PIXI.compileProgram = function(vertexSrc, fragmentSrc) { - var gl = PIXI.gl; - var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); - var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); + var gl = PIXI.gl; + var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); + var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); - var shaderProgram = gl.createProgram(); + var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); @@ -197,19 +197,19 @@ PIXI.compileProgram = function(vertexSrc, fragmentSrc) alert("Could not initialise shaders"); } - return shaderProgram; + return shaderProgram; } PIXI.activateDefaultShader = function() { - var gl = PIXI.gl; - var shaderProgram = PIXI.shaderProgram; + var gl = PIXI.gl; + var shaderProgram = PIXI.shaderProgram; - gl.useProgram(shaderProgram); + gl.useProgram(shaderProgram); - gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute); gl.enableVertexAttribArray(shaderProgram.colorAttribute); } @@ -218,14 +218,14 @@ PIXI.activateDefaultShader = function() PIXI.activatePrimitiveShader = function() { - var gl = PIXI.gl; + var gl = PIXI.gl; - gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); + gl.disableVertexAttribArray(PIXI.shaderProgram.textureCoordAttribute); gl.disableVertexAttribArray(PIXI.shaderProgram.colorAttribute); - gl.useProgram(PIXI.primitiveProgram); + gl.useProgram(PIXI.primitiveProgram); - gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); - gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.vertexPositionAttribute); + gl.enableVertexAttribArray(PIXI.primitiveProgram.colorAttribute); } diff --git a/src/pixi/text/BitmapText.js b/src/pixi/text/BitmapText.js index db4ec3b..3cf57b9 100644 --- a/src/pixi/text/BitmapText.js +++ b/src/pixi/text/BitmapText.js @@ -147,8 +147,8 @@ PIXI.BitmapText.prototype.updateText = function() */ PIXI.BitmapText.prototype.updateTransform = function() { - if(this.dirty) - { + if(this.dirty) + { while(this.children.length > 0) { this.removeChild(this.getChildAt(0)); @@ -156,9 +156,9 @@ PIXI.BitmapText.prototype.updateTransform = function() this.updateText(); this.dirty = false; - } + } - PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); + PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); }; PIXI.BitmapText.fonts = {}; diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index 5ca6bbe..bd0ed36 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -82,65 +82,65 @@ PIXI.Text.prototype.setText = function(text) */ PIXI.Text.prototype.updateText = function() { - this.context.font = this.style.font; + this.context.font = this.style.font; - var outputText = this.text; + var outputText = this.text; - // word wrap - // preserve original text - if(this.style.wordWrap)outputText = this.wordWrap(this.text); + // word wrap + // preserve original text + if(this.style.wordWrap)outputText = this.wordWrap(this.text); - //split text into lines - var lines = outputText.split(/(?:\r\n|\r|\n)/); + //split text into lines + var lines = outputText.split(/(?:\r\n|\r|\n)/); - //calculate text width - var lineWidths = []; - var maxLineWidth = 0; - for (var i = 0; i < lines.length; i++) - { - var lineWidth = this.context.measureText(lines[i]).width; - lineWidths[i] = lineWidth; - maxLineWidth = Math.max(maxLineWidth, lineWidth); - } - this.canvas.width = maxLineWidth + this.style.strokeThickness; + //calculate text width + var lineWidths = []; + var maxLineWidth = 0; + for (var i = 0; i < lines.length; i++) + { + var lineWidth = this.context.measureText(lines[i]).width; + lineWidths[i] = lineWidth; + maxLineWidth = Math.max(maxLineWidth, lineWidth); + } + this.canvas.width = maxLineWidth + this.style.strokeThickness; - //calculate text height - var lineHeight = this.determineFontHeight("font: " + this.style.font + ";") + this.style.strokeThickness; - this.canvas.height = lineHeight * lines.length; + //calculate text height + var lineHeight = this.determineFontHeight("font: " + this.style.font + ";") + this.style.strokeThickness; + this.canvas.height = lineHeight * lines.length; - //set canvas text styles - this.context.fillStyle = this.style.fill; - this.context.font = this.style.font; + //set canvas text styles + this.context.fillStyle = this.style.fill; + this.context.font = this.style.font; - this.context.strokeStyle = this.style.stroke; - this.context.lineWidth = this.style.strokeThickness; + this.context.strokeStyle = this.style.stroke; + this.context.lineWidth = this.style.strokeThickness; - this.context.textBaseline = "top"; + this.context.textBaseline = "top"; - //draw lines line by line - for (i = 0; i < lines.length; i++) - { - var linePosition = new PIXI.Point(this.style.strokeThickness / 2, this.style.strokeThickness / 2 + i * lineHeight); + //draw lines line by line + for (i = 0; i < lines.length; i++) + { + var linePosition = new PIXI.Point(this.style.strokeThickness / 2, this.style.strokeThickness / 2 + i * lineHeight); - if(this.style.align == "right") - { - linePosition.x += maxLineWidth - lineWidths[i]; - } - else if(this.style.align == "center") - { - linePosition.x += (maxLineWidth - lineWidths[i]) / 2; - } + if(this.style.align == "right") + { + linePosition.x += maxLineWidth - lineWidths[i]; + } + else if(this.style.align == "center") + { + linePosition.x += (maxLineWidth - lineWidths[i]) / 2; + } - if(this.style.stroke && this.style.strokeThickness) - { - this.context.strokeText(lines[i], linePosition.x, linePosition.y); - } + if(this.style.stroke && this.style.strokeThickness) + { + this.context.strokeText(lines[i], linePosition.x, linePosition.y); + } - if(this.style.fill) - { - this.context.fillText(lines[i], linePosition.x, linePosition.y); - } - } + if(this.style.fill) + { + this.context.fillText(lines[i], linePosition.x, linePosition.y); + } + } this.updateTexture(); }; @@ -158,7 +158,7 @@ PIXI.Text.prototype.updateTexture = function() this.texture.frame.width = this.canvas.width; this.texture.frame.height = this.canvas.height; - this._width = this.canvas.width; + this._width = this.canvas.width; this._height = this.canvas.height; PIXI.texturesToUpdate.push(this.texture.baseTexture); @@ -172,13 +172,13 @@ PIXI.Text.prototype.updateTexture = function() */ PIXI.Text.prototype.updateTransform = function() { - if(this.dirty) - { - this.updateText(); - this.dirty = false; - } + if(this.dirty) + { + this.updateText(); + this.dirty = false; + } - PIXI.Sprite.prototype.updateTransform.call(this); + PIXI.Sprite.prototype.updateTransform.call(this); }; /* @@ -191,26 +191,26 @@ PIXI.Text.prototype.updateTransform = function() */ PIXI.Text.prototype.determineFontHeight = function(fontStyle) { - // build a little reference dictionary so if the font style has been used return a - // cached version... - var result = PIXI.Text.heightCache[fontStyle]; + // build a little reference dictionary so if the font style has been used return a + // cached version... + var result = PIXI.Text.heightCache[fontStyle]; - if(!result) - { - var body = document.getElementsByTagName("body")[0]; - var dummy = document.createElement("div"); - var dummyText = document.createTextNode("M"); - dummy.appendChild(dummyText); - dummy.setAttribute("style", fontStyle + ';position:absolute;top:0;left:0'); - body.appendChild(dummy); + if(!result) + { + var body = document.getElementsByTagName("body")[0]; + var dummy = document.createElement("div"); + var dummyText = document.createTextNode("M"); + dummy.appendChild(dummyText); + dummy.setAttribute("style", fontStyle + ';position:absolute;top:0;left:0'); + body.appendChild(dummy); - result = dummy.offsetHeight; - PIXI.Text.heightCache[fontStyle] = result; + result = dummy.offsetHeight; + PIXI.Text.heightCache[fontStyle] = result; - body.removeChild(dummy); - } + body.removeChild(dummy); + } - return result; + return result; }; /** @@ -222,49 +222,49 @@ PIXI.Text.prototype.determineFontHeight = function(fontStyle) */ PIXI.Text.prototype.wordWrap = function(text) { - // search good wrap position - var searchWrapPos = function(ctx, text, start, end, wrapWidth) - { - var p = Math.floor((end-start) / 2) + start; - if(p == start) { - return 1; - } + // search good wrap position + function searchWrapPos(ctx, text, start, end, wrapWidth) + { + var p = Math.floor((end-start) / 2) + start; + if(p == start) { + return 1; + } - if(ctx.measureText(text.substring(0,p)).width <= wrapWidth) - { - if(ctx.measureText(text.substring(0,p+1)).width > wrapWidth) - { - return p; - } - else - { - return arguments.callee(ctx, text, p, end, wrapWidth); - } - } - else - { - return arguments.callee(ctx, text, start, p, wrapWidth); - } - }; + if(ctx.measureText(text.substring(0,p)).width <= wrapWidth) + { + if(ctx.measureText(text.substring(0,p+1)).width > wrapWidth) + { + return p; + } + else + { + return searchWrapPos(ctx, text, p, end, wrapWidth); + } + } + else + { + return searchWrapPos(ctx, text, start, p, wrapWidth); + } + } - var lineWrap = function(ctx, text, wrapWidth) - { - if(ctx.measureText(text).width <= wrapWidth || text.length < 1) - { - return text; - } - var pos = searchWrapPos(ctx, text, 0, text.length, wrapWidth); - return text.substring(0, pos) + "\n" + arguments.callee(ctx, text.substring(pos), wrapWidth); - }; + function lineWrap(ctx, text, wrapWidth) + { + if(ctx.measureText(text).width <= wrapWidth || text.length < 1) + { + return text; + } + var pos = searchWrapPos(ctx, text, 0, text.length, wrapWidth); + return text.substring(0, pos) + "\n" + lineWrap(ctx, text.substring(pos), wrapWidth); + } - var result = ""; - var lines = text.split("\n"); - for (var i = 0; i < lines.length; i++) - { - result += lineWrap(this.context, lines[i], this.style.wordWrapWidth) + "\n"; - } + var result = ""; + var lines = text.split("\n"); + for (var i = 0; i < lines.length; i++) + { + result += lineWrap(this.context, lines[i], this.style.wordWrapWidth) + "\n"; + } - return result; + return result; }; /** @@ -275,10 +275,10 @@ PIXI.Text.prototype.wordWrap = function(text) */ PIXI.Text.prototype.destroy = function(destroyTexture) { - if(destroyTexture) - { - this.texture.destroy(); - } + if(destroyTexture) + { + this.texture.destroy(); + } }; diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 22ac5a0..0b99d9d 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -16,82 +16,82 @@ PIXI.texturesToDestroy = []; */ PIXI.BaseTexture = function(source) { - PIXI.EventTarget.call( this ); + PIXI.EventTarget.call( this ); - /** - * [read-only] The width of the base texture set when the image has loaded - * - * @property width - * @type Number - * @readOnly - */ - this.width = 100; + /** + * [read-only] The width of the base texture set when the image has loaded + * + * @property width + * @type Number + * @readOnly + */ + this.width = 100; - /** - * [read-only] The height of the base texture set when the image has loaded - * - * @property height - * @type Number - * @readOnly - */ - this.height = 100; + /** + * [read-only] The height of the base texture set when the image has loaded + * + * @property height + * @type Number + * @readOnly + */ + this.height = 100; - /** - * [read-only] Describes if the base texture has loaded or not - * - * @property hasLoaded - * @type Boolean - * @readOnly - */ - this.hasLoaded = false; + /** + * [read-only] Describes if the base texture has loaded or not + * + * @property hasLoaded + * @type Boolean + * @readOnly + */ + this.hasLoaded = false; - /** - * The source that is loaded to create the texture - * - * @property source - * @type Image - */ - this.source = source; + /** + * The source that is loaded to create the texture + * + * @property source + * @type Image + */ + this.source = source; - if(!source)return; + if(!source)return; - if(this.source instanceof Image || this.source instanceof HTMLImageElement) - { - if(this.source.complete) - { - this.hasLoaded = true; - this.width = this.source.width; - this.height = this.source.height; + if(this.source instanceof Image || this.source instanceof HTMLImageElement) + { + if(this.source.complete) + { + this.hasLoaded = true; + this.width = this.source.width; + this.height = this.source.height; - PIXI.texturesToUpdate.push(this); - } - else - { + PIXI.texturesToUpdate.push(this); + } + else + { - var scope = this; - this.source.onload = function(){ + var scope = this; + this.source.onload = function(){ - scope.hasLoaded = true; - scope.width = scope.source.width; - scope.height = scope.source.height; + scope.hasLoaded = true; + scope.width = scope.source.width; + scope.height = scope.source.height; - // add it to somewhere... - PIXI.texturesToUpdate.push(scope); - scope.dispatchEvent( { type: 'loaded', content: scope } ); - } - // this.image.src = imageUrl; - } - } - else - { - this.hasLoaded = true; - this.width = this.source.width; - this.height = this.source.height; + // add it to somewhere... + PIXI.texturesToUpdate.push(scope); + scope.dispatchEvent( { type: 'loaded', content: scope } ); + } + // this.image.src = imageUrl; + } + } + else + { + this.hasLoaded = true; + this.width = this.source.width; + this.height = this.source.height; - PIXI.texturesToUpdate.push(this); - } + PIXI.texturesToUpdate.push(this); + } - this._powerOf2 = false; + this._powerOf2 = false; } PIXI.BaseTexture.prototype.constructor = PIXI.BaseTexture; @@ -103,12 +103,12 @@ PIXI.BaseTexture.prototype.constructor = PIXI.BaseTexture; */ PIXI.BaseTexture.prototype.destroy = function() { - if(this.source instanceof Image) - { - this.source.src = null; - } - this.source = null; - PIXI.texturesToDestroy.push(this); + if(this.source instanceof Image) + { + this.source.src = null; + } + this.source = null; + PIXI.texturesToDestroy.push(this); } /** @@ -122,20 +122,20 @@ PIXI.BaseTexture.prototype.destroy = function() */ PIXI.BaseTexture.fromImage = function(imageUrl, crossorigin) { - var baseTexture = PIXI.BaseTextureCache[imageUrl]; - if(!baseTexture) - { - // new Image() breaks tex loading in some versions of Chrome. - // See https://code.google.com/p/chromium/issues/detail?id=238071 - var image = new Image();//document.createElement('img'); - if (crossorigin) - { - image.crossOrigin = ''; - } - image.src = imageUrl; - baseTexture = new PIXI.BaseTexture(image); - PIXI.BaseTextureCache[imageUrl] = baseTexture; - } + var baseTexture = PIXI.BaseTextureCache[imageUrl]; + if(!baseTexture) + { + // new Image() breaks tex loading in some versions of Chrome. + // See https://code.google.com/p/chromium/issues/detail?id=238071 + var image = new Image();//document.createElement('img'); + if (crossorigin) + { + image.crossOrigin = ''; + } + image.src = imageUrl; + baseTexture = new PIXI.BaseTexture(image); + PIXI.BaseTextureCache[imageUrl] = baseTexture; + } - return baseTexture; + return baseTexture; } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index d584420..238fa1a 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -10,19 +10,19 @@ RenderTexture takes snapshot of DisplayObject passed to render method. If DisplayObject is passed to render method, position and rotation of it will be ignored. For example: - var renderTexture = new PIXI.RenderTexture(800, 600); - var sprite = PIXI.Sprite.fromImage("spinObj_01.png"); - sprite.position.x = 800/2; - sprite.position.y = 600/2; - sprite.anchor.x = 0.5; - sprite.anchor.y = 0.5; - renderTexture.render(sprite); + var renderTexture = new PIXI.RenderTexture(800, 600); + var sprite = PIXI.Sprite.fromImage("spinObj_01.png"); + sprite.position.x = 800/2; + sprite.position.y = 600/2; + sprite.anchor.x = 0.5; + sprite.anchor.y = 0.5; + renderTexture.render(sprite); Sprite in this case will be rendered to 0,0 position. To render this sprite at center DisplayObjectContainer should be used: - var doc = new PIXI.DisplayObjectContainer(); - doc.addChild(sprite); - renderTexture.render(doc); // Renders to center of renderTexture + var doc = new PIXI.DisplayObjectContainer(); + doc.addChild(sprite); + renderTexture.render(doc); // Renders to center of renderTexture @class RenderTexture @extends Texture @@ -32,23 +32,23 @@ */ PIXI.RenderTexture = function(width, height) { - PIXI.EventTarget.call( this ); + PIXI.EventTarget.call( this ); - this.width = width || 100; - this.height = height || 100; + this.width = width || 100; + this.height = height || 100; - this.identityMatrix = PIXI.mat3.create(); + this.identityMatrix = PIXI.mat3.create(); - this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); - if(PIXI.gl) - { - this.initWebGL(); - } - else - { - this.initCanvas(); - } + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } } PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); @@ -62,39 +62,39 @@ PIXI.RenderTexture.prototype.constructor = PIXI.RenderTexture; */ PIXI.RenderTexture.prototype.initWebGL = function() { - var gl = PIXI.gl; - this.glFramebuffer = gl.createFramebuffer(); + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); this.glFramebuffer.width = this.width; this.glFramebuffer.height = this.height; - this.baseTexture = new PIXI.BaseTexture(); + this.baseTexture = new PIXI.BaseTexture(); - this.baseTexture.width = this.width; - this.baseTexture.height = this.height; + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; this.baseTexture._glTexture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - this.baseTexture.isRender = true; + this.baseTexture.isRender = true; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); - // create a projection matrix.. - this.projection = new PIXI.Point(this.width/2 , this.height/2); + // create a projection matrix.. + this.projection = new PIXI.Point(this.width/2 , this.height/2); - // set the correct render function.. - this.render = this.renderWebGL; + // set the correct render function.. + this.render = this.renderWebGL; } @@ -103,25 +103,25 @@ PIXI.RenderTexture.prototype.initWebGL = function() PIXI.RenderTexture.prototype.resize = function(width, height) { - this.width = width; - this.height = height; + this.width = width; + this.height = height; - if(PIXI.gl) - { - this.projection.x = this.width/2 - this.projection.y = this.height/2; + if(PIXI.gl) + { + this.projection.x = this.width/2 + this.projection.y = this.height/2; - var gl = PIXI.gl; - gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - else - { + var gl = PIXI.gl; + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } + else + { - this.frame.width = this.width - this.frame.height = this.height; - this.renderer.resize(this.width, this.height); - } + this.frame.width = this.width + this.frame.height = this.height; + this.renderer.resize(this.width, this.height); + } } /** @@ -132,12 +132,12 @@ PIXI.RenderTexture.prototype.resize = function(width, height) */ PIXI.RenderTexture.prototype.initCanvas = function() { - this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); - this.baseTexture = new PIXI.BaseTexture(this.renderer.view); - this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); - this.render = this.renderCanvas; + this.render = this.renderCanvas; } /** @@ -150,67 +150,67 @@ PIXI.RenderTexture.prototype.initCanvas = function() */ PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, position, clear) { - var gl = PIXI.gl; + var gl = PIXI.gl; - // enable the alpha color mask.. - gl.colorMask(true, true, true, true); + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); - gl.viewport(0, 0, this.width, this.height); + gl.viewport(0, 0, this.width, this.height); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); - if(clear) - { - gl.clearColor(0,0,0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); - } + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } - // THIS WILL MESS WITH HIT TESTING! - var children = displayObject.children; + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; - //TODO -? create a new one??? dont think so! - var originalWorldTransform = displayObject.worldTransform; - displayObject.worldTransform = PIXI.mat3.create();//sthis.identityMatrix; - // modify to flip... - displayObject.worldTransform[4] = -1; - displayObject.worldTransform[5] = this.projection.y * 2; + //TODO -? create a new one??? dont think so! + var originalWorldTransform = displayObject.worldTransform; + displayObject.worldTransform = PIXI.mat3.create();//sthis.identityMatrix; + // modify to flip... + displayObject.worldTransform[4] = -1; + displayObject.worldTransform[5] = this.projection.y * 2; - if(position) - { - displayObject.worldTransform[2] = position.x; - displayObject.worldTransform[5] -= position.y; - } + if(position) + { + displayObject.worldTransform[2] = position.x; + displayObject.worldTransform[5] -= position.y; + } - PIXI.visibleCount++; - displayObject.vcount = PIXI.visibleCount; + PIXI.visibleCount++; + displayObject.vcount = PIXI.visibleCount; - for(var i=0,j=children.length; i this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) - { - throw new Error("Texture Error: frame does not fit inside the base Texture dimensions " + this); - } + if(frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) + { + throw new Error("Texture Error: frame does not fit inside the base Texture dimensions " + this); + } - this.updateFrame = true; + this.updateFrame = true; - PIXI.Texture.frameUpdates.push(this); - //this.dispatchEvent( { type: 'update', content: this } ); + PIXI.Texture.frameUpdates.push(this); + //this.dispatchEvent( { type: 'update', content: this } ); } /** @@ -136,15 +136,15 @@ PIXI.Texture.prototype.setFrame = function(frame) */ PIXI.Texture.fromImage = function(imageUrl, crossorigin) { - var texture = PIXI.TextureCache[imageUrl]; + var texture = PIXI.TextureCache[imageUrl]; - if(!texture) - { - texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin)); - PIXI.TextureCache[imageUrl] = texture; - } + if(!texture) + { + texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin)); + PIXI.TextureCache[imageUrl] = texture; + } - return texture; + return texture; } /** @@ -158,9 +158,9 @@ PIXI.Texture.fromImage = function(imageUrl, crossorigin) */ PIXI.Texture.fromFrame = function(frameId) { - var texture = PIXI.TextureCache[frameId]; - if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache " + this); - return texture; + var texture = PIXI.TextureCache[frameId]; + if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache " + this); + return texture; } /** @@ -174,8 +174,8 @@ PIXI.Texture.fromFrame = function(frameId) */ PIXI.Texture.fromCanvas = function(canvas) { - var baseTexture = new PIXI.BaseTexture(canvas); - return new PIXI.Texture(baseTexture); + var baseTexture = new PIXI.BaseTexture(canvas); + return new PIXI.Texture(baseTexture); } @@ -189,7 +189,7 @@ PIXI.Texture.fromCanvas = function(canvas) */ PIXI.Texture.addTextureToCache = function(texture, id) { - PIXI.TextureCache[id] = texture; + PIXI.TextureCache[id] = texture; } /** @@ -202,9 +202,9 @@ PIXI.Texture.addTextureToCache = function(texture, id) */ PIXI.Texture.removeTextureFromCache = function(id) { - var texture = PIXI.TextureCache[id] - PIXI.TextureCache[id] = null; - return texture; + var texture = PIXI.TextureCache[id] + PIXI.TextureCache[id] = null; + return texture; } // this is more for webGL.. it contains updated frames.. diff --git a/src/pixi/utils/Detector.js b/src/pixi/utils/Detector.js index 62c78a1..4cf0931 100644 --- a/src/pixi/utils/Detector.js +++ b/src/pixi/utils/Detector.js @@ -19,19 +19,19 @@ */ PIXI.autoDetectRenderer = function(width, height, view, transparent, antialias) { - if(!width)width = 800; - if(!height)height = 600; + if(!width)width = 800; + if(!height)height = 600; - // BORROWED from Mr Doob (mrdoob.com) - var webgl = ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(); + // BORROWED from Mr Doob (mrdoob.com) + var webgl = ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(); - //console.log(webgl); - if( webgl ) - { - return new PIXI.WebGLRenderer(width, height, view, transparent, antialias); - } + //console.log(webgl); + if( webgl ) + { + return new PIXI.WebGLRenderer(width, height, view, transparent, antialias); + } - return new PIXI.CanvasRenderer(width, height, view, transparent); + return new PIXI.CanvasRenderer(width, height, view, transparent); }; diff --git a/src/pixi/utils/EventTarget.js b/src/pixi/utils/EventTarget.js index 73da516..110607f 100644 --- a/src/pixi/utils/EventTarget.js +++ b/src/pixi/utils/EventTarget.js @@ -8,59 +8,59 @@ * * @class EventTarget * @example - * function MyEmitter() { - * PIXI.EventTarget.call(this); //mixes in event target stuff - * } + * function MyEmitter() { + * PIXI.EventTarget.call(this); //mixes in event target stuff + * } * - * var em = new MyEmitter(); - * em.emit({ type: 'eventName', data: 'some data' }); + * var em = new MyEmitter(); + * em.emit({ type: 'eventName', data: 'some data' }); */ PIXI.EventTarget = function () { - var listeners = {}; + var listeners = {}; - this.addEventListener = this.on = function ( type, listener ) { + this.addEventListener = this.on = function ( type, listener ) { - if ( listeners[ type ] === undefined ) { + if ( listeners[ type ] === undefined ) { - listeners[ type ] = []; + listeners[ type ] = []; - } + } - if ( listeners[ type ].indexOf( listener ) === - 1 ) { + if ( listeners[ type ].indexOf( listener ) === - 1 ) { - listeners[ type ].push( listener ); - } + listeners[ type ].push( listener ); + } - }; + }; - this.dispatchEvent = this.emit = function ( event ) { + this.dispatchEvent = this.emit = function ( event ) { - if ( !listeners[ event.type ] || !listeners[ event.type ].length ) { + if ( !listeners[ event.type ] || !listeners[ event.type ].length ) { - return; + return; - } + } - for(var i = 0, l = listeners[ event.type ].length; i < l; i++) { + for(var i = 0, l = listeners[ event.type ].length; i < l; i++) { - listeners[ event.type ][ i ]( event ); + listeners[ event.type ][ i ]( event ); - } + } - }; + }; - this.removeEventListener = this.off = function ( type, listener ) { + this.removeEventListener = this.off = function ( type, listener ) { - var index = listeners[ type ].indexOf( listener ); + var index = listeners[ type ].indexOf( listener ); - if ( index !== - 1 ) { + if ( index !== - 1 ) { - listeners[ type ].splice( index, 1 ); + listeners[ type ].splice( index, 1 ); - } + } - }; + }; }; diff --git a/src/pixi/utils/Polyk.js b/src/pixi/utils/Polyk.js index e29d77d..0b1a136 100644 --- a/src/pixi/utils/Polyk.js +++ b/src/pixi/utils/Polyk.js @@ -1,34 +1,34 @@ /* - PolyK library - url: http://polyk.ivank.net - Released under MIT licence. + PolyK library + url: http://polyk.ivank.net + Released under MIT licence. - Copyright (c) 2012 Ivan Kuckir + Copyright (c) 2012 Ivan Kuckir - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. - This is an amazing lib! + This is an amazing lib! - slightly modified by mat groves (matgroves.com); + slightly modified by mat groves (matgroves.com); */ PIXI.PolyK = {}; @@ -42,68 +42,68 @@ PIXI.PolyK = {}; */ PIXI.PolyK.Triangulate = function(p) { - var sign = true; + var sign = true; - var n = p.length>>1; - if(n<3) return []; - var tgs = []; - var avl = []; - for(var i=0; i>1; + if(n<3) return []; + var tgs = []; + var avl = []; + for(var i=0; i 3) - { - var i0 = avl[(i+0)%al]; - var i1 = avl[(i+1)%al]; - var i2 = avl[(i+2)%al]; + i = 0; + var al = n; + while(al > 3) + { + var i0 = avl[(i+0)%al]; + var i1 = avl[(i+1)%al]; + var i2 = avl[(i+2)%al]; - var ax = p[2*i0], ay = p[2*i0+1]; - var bx = p[2*i1], by = p[2*i1+1]; - var cx = p[2*i2], cy = p[2*i2+1]; + var ax = p[2*i0], ay = p[2*i0+1]; + var bx = p[2*i1], by = p[2*i1+1]; + var cx = p[2*i2], cy = p[2*i2+1]; - var earFound = false; - if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) - { - earFound = true; - for(var j=0; j 3*al) - { - // need to flip flip reverse it! - // reset! - if(sign) - { - var tgs = []; - avl = []; - for(var i=0; i 3*al) + { + // need to flip flip reverse it! + // reset! + if(sign) + { + tgs = []; + avl = []; + for(i=0; i= 0) && (v >= 0) && (u + v < 1); + // Check if point is in triangle + return (u >= 0) && (v >= 0) && (u + v < 1); } /** @@ -145,5 +145,5 @@ PIXI.PolyK._PointInTriangle = function(px, py, ax, ay, bx, by, cx, cy) */ PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) { - return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; } diff --git a/src/pixi/utils/Utils.js b/src/pixi/utils/Utils.js index 71d7a65..6a64805 100644 --- a/src/pixi/utils/Utils.js +++ b/src/pixi/utils/Utils.js @@ -19,8 +19,8 @@ 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']; + window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || + window[vendors[x]+'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) @@ -43,11 +43,11 @@ window.requestAnimFrame = window.requestAnimationFrame; /** * Converts a hex color number to an [R, G, B] array * - * @method HEXtoRGB + * @method hex2rgb * @param hex {Number} */ -function HEXtoRGB(hex) { - return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; +function hex2rgb(hex) { + return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; } /** @@ -64,14 +64,14 @@ if (typeof Function.prototype.bind != 'function') { if (typeof target != 'function') throw new TypeError(); function bound() { - var args = boundArgs.concat(slice.call(arguments)); - target.apply(this instanceof bound ? this : thisArg, args); + var args = boundArgs.concat(slice.call(arguments)); + target.apply(this instanceof bound ? this : thisArg, args); } bound.prototype = (function F(proto) { - proto && (F.prototype = proto); - if (!(this instanceof F)) return new F; - })(target.prototype); + if (proto) F.prototype = proto; + if (!(this instanceof F)) return new F(); + })(target.prototype); return bound; }; @@ -86,28 +86,28 @@ if (typeof Function.prototype.bind != 'function') { */ var AjaxRequest = PIXI.AjaxRequest = function() { - var activexmodes = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Microsoft.XMLHTTP"] //activeX versions to check for in IE + var activexmodes = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Microsoft.XMLHTTP"] //activeX versions to check for in IE - if (window.ActiveXObject) - { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) - for (var i=0; i>>>>>>>>") - console.log("_") - var safe = 0; - var tmp = item.first; - console.log(tmp); + console.log(">>>>>>>>>") + console.log("_") + var safe = 0; + var tmp = item.first; + console.log(tmp); - while(tmp._iNext) - { - safe++; - tmp = tmp._iNext; - console.log(tmp); - // console.log(tmp); + while(tmp._iNext) + { + safe++; + tmp = tmp._iNext; + console.log(tmp); + // console.log(tmp); - if(safe > 100) - { - console.log("BREAK") - break - } - } + if(safe > 100) + { + console.log("BREAK") + break + } + } } From eb1d191a06bb6c71e3a2397f62e70ab1142207ad Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 08:52:14 -0800 Subject: [PATCH 03/12] more up-to-date jshintrc --- .jshintrc | 168 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 104 insertions(+), 64 deletions(-) diff --git a/.jshintrc b/.jshintrc index 99e1b16..3bb861f 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,72 +1,112 @@ { - "passfail" : false, - "maxerr" : 0, - "browser" : true, + // -------------------------------------------------------------------- + // JSHint Configuration + // -------------------------------------------------------------------- + // + // @author Chad Engler - "node" : false, - "rhino" : false, - "couch" : false, - "wsh" : false, + // == Enforcing Options =============================================== + // + // These options tell JSHint to be more strict towards your code. Use + // them if you want to allow only a safe subset of JavaScript, very + // useful when your codebase is shared with a big number of developers + // with different skill levels. - "jquery" : false, - "prototypejs" : false, - "mootools" : false, - "dojo" : false, - "predef" : [ - "_", - "google", - "jasmine", - "describe", - "xdescribe", - "it", - "xit", - "beforeEach", - "afterEach", - "expect", - "spyOn", - "runs", - "waits", - "waitsFor", - "Benchmark", - "Backbone", - "Modernizr" - ], + "bitwise" : false, // Disallow bitwise operators (&, |, ^, etc.). + "camelcase" : true, // Force all variable names to use either camelCase or UPPER_CASE. + "curly" : false, // Require {} for every new block or scope. + "eqeqeq" : true, // Require triple equals i.e. `===`. + "es3" : false, // Enforce conforming to ECMAScript 3. + "forin" : false, // Disallow `for in` loops without `hasOwnPrototype`. + "immed" : true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );` + "indent" : 4, // Require that 4 spaces are used for indentation. + "latedef" : true, // Prohibit variable use before definition. + "newcap" : true, // Require capitalization of all constructor functions e.g. `new F()`. + "noarg" : true, // Prohibit use of `arguments.caller` and `arguments.callee`. + "noempty" : true, // Prohibit use of empty blocks. + "nonew" : true, // Prohibit use of constructors for side-effects. + "plusplus" : false, // Disallow use of `++` & `--`. + "quotmark" : true, // Force consistency when using quote marks. + "undef" : true, // Require all non-global variables be declared before they are used. + "unused" : true, // Warn when varaibles are created by not used. + "strict" : false, // Require `use strict` pragma in every file. + "trailing" : true, // Prohibit trailing whitespaces. + "maxparams" : 6, // Prohibit having more than X number of params in a function. + "maxdepth" : 6, // Prohibit nested blocks from going more than X levels deep. + "maxstatements" : false, // Restrict the number of statements in a function. + "maxcomplexity" : false, // Restrict the cyclomatic complexity of the code. + "maxlen" : 220, // Require that all lines are 100 characters or less. + "globals" : { // Register globals that are used in the code. + "module": false, + "require": false + }, - "debug" : false, - "devel" : false, + // == Relaxing Options ================================================ + // + // These options allow you to suppress certain types of warnings. Use + // them only if you are absolutely positive that you know what you are + // doing. - "es5" : false, - "strict" : false, - "globalstrict" : false, + "asi" : false, // Tolerate Automatic Semicolon Insertion (no semicolons). + "boss" : true, // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments. + "debug" : false, // Allow debugger statements e.g. browser breakpoints. + "eqnull" : false, // Tolerate use of `== null`. + "esnext" : false, // Allow ES.next specific features such as `const` and `let`. + "evil" : false, // Tolerate use of `eval`. + "expr" : false, // Tolerate `ExpressionStatement` as Programs. + "funcscope" : false, // Tolerate declarations of variables inside of control structures while accessing them later from the outside. + "globalstrict" : false, // Allow global "use strict" (also enables 'strict'). + "iterator" : false, // Allow usage of __iterator__ property. + "lastsemic" : false, // Tolerate missing semicolons when the it is omitted for the last statement in a one-line block. + "laxbreak" : false, // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons. + "laxcomma" : false, // Suppress warnings about comma-first coding style. + "loopfunc" : false, // Allow functions to be defined within loops. + "moz" : false, // Code that uses Mozilla JS extensions will set this to true + "multistr" : false, // Tolerate multi-line strings. + "proto" : false, // Tolerate __proto__ property. This property is deprecated. + "scripturl" : false, // Tolerate script-targeted URLs. + "smarttabs" : false, // Tolerate mixed tabs and spaces when the latter are used for alignmnent only. + "shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`. + "sub" : false, // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`. + "supernew" : false, // Tolerate `new function () { ... };` and `new Object;`. + "validthis" : false, // Tolerate strict violations when the code is running in strict mode and you use this in a non-constructor function. - "smarttabs" : true, - "asi" : true, - "laxbreak" : false, - "bitwise" : false, - "boss" : false, - "curly" : false, - "eqeqeq" : false, - "eqnull" : true, - "evil" : false, - "expr" : false, - "forin" : false, - "immed" : true, - "latedef" : true, - "loopfunc" : false, - "noarg" : true, - "regexp" : true, - "regexdash" : false, - "scripturl" : true, - "shadow" : false, - "supernew" : false, - "undef" : false, + // == Environments ==================================================== + // + // These options pre-define global variables that are exposed by + // popular JavaScript libraries and runtime environments—such as + // browser or node.js. - "newcap" : true, - "noempty" : true, - "nonew" : false, - "nomen" : false, - "onevar" : false, - "plusplus" : false, - "sub" : false, - "trailing" : true + "browser" : true, // Standard browser globals e.g. `window`, `document`. + "couch" : false, // Enable globals exposed by CouchDB. + "devel" : false, // Allow development statements e.g. `console.log();`. + "dojo" : false, // Enable globals exposed by Dojo Toolkit. + "jquery" : false, // Enable globals exposed by jQuery JavaScript library. + "mootools" : false, // Enable globals exposed by MooTools JavaScript framework. + "node" : false, // Enable globals available when code is running inside of the NodeJS runtime environment. (for Gruntfile) + "nonstandard" : false, // Define non-standard but widely adopted globals such as escape and unescape. + "prototypejs" : false, // Enable globals exposed by Prototype JavaScript framework. + "rhino" : false, // Enable globals available when your code is running inside of the Rhino runtime environment. + "worker" : false, // Enable globals available when your code is running as a WebWorker. + "wsh" : false, // Enable globals available when your code is running as a script for the Windows Script Host. + "yui" : false, // Enable globals exposed by YUI library. + + // == JSLint Legacy =================================================== + // + // These options are legacy from JSLint. Aside from bug fixes they will + // not be improved in any way and might be removed at any point. + + "nomen" : false, // Prohibit use of initial or trailing underbars in names. + "onevar" : false, // Allow only one `var` statement per function. + "passfail" : false, // Stop on first error. + "white" : false, // Check against strict whitespace and indentation rules. + + // == Undocumented Options ============================================ + // + // While I've found these options in [example1][2] and [example2][3] + // they are not described in the [JSHint Options documentation][4]. + // + // [4]: http://www.jshint.com/options/ + + "maxerr" : 100 // Maximum errors before stopping. } From a423216a8c9d6cbd95e63209d836fa7284a58688 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 09:11:05 -0800 Subject: [PATCH 04/12] change the way jshint runs a bit --- Gruntfile.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index a300926..a50377c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -125,16 +125,10 @@ module.exports = function(grunt) { } }, jshint: { - beforeconcat: srcFiles, - test: { - src: ['<%= files.testBlob %>'], - options: { - expr: true - } - }, + src: srcFiles.concat('Gruntfile.js'), + test: ['<%= files.testBlob %>'], options: { - asi: true, - smarttabs: true + jshintrc: '.jshintrc' } }, uglify: { @@ -179,7 +173,7 @@ module.exports = function(grunt) { grunt.registerTask('default', ['build', 'test']); - grunt.registerTask('build', ['jshint', 'concat', 'uglify']); + grunt.registerTask('build', ['jshint:src', 'concat', 'uglify']); grunt.registerTask('build-debug', ['concat_sourcemap', 'uglify']); grunt.registerTask('test', ['concat', 'jshint:test', 'karma']); From 12943e6390bbd10263ff885ceac800bfbfb9bbc8 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 09:11:11 -0800 Subject: [PATCH 05/12] update some modules --- package.json | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 70e7a44..9ecc9ba 100644 --- a/package.json +++ b/package.json @@ -24,16 +24,17 @@ "dependencies": {}, "devDependencies": { - "grunt": "~0.4.x", - "grunt-contrib-jshint": "0.6.x", - "grunt-contrib-uglify": "0.2.x", - "grunt-contrib-connect": "0.3.x", - "grunt-contrib-yuidoc": "0.4.x", - "grunt-concat-sourcemap": "0.3.x", - "grunt-contrib-concat": "0.3.x", - "chai": "~1.7.0", - "karma": "0.11.0", - "karma-firefox-launcher": "0.1.0", - "karma-mocha": "0.1.0" + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.6", + "grunt-contrib-uglify": "~0.2", + "grunt-contrib-connect": "~0.5", + "grunt-contrib-yuidoc": "~0.5", + "grunt-concat-sourcemap": "~0.4", + "grunt-contrib-concat": "~0.3", + "mocha": "~1.15", + "chai": "~1.8", + "karma": "~0.11", + "karma-firefox-launcher": "~0.1", + "karma-mocha": "~0.1" } } From 5e08abcc312170188a7e4bfb62137073022c62d0 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 09:39:05 -0800 Subject: [PATCH 06/12] remove some comments --- .jshintrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.jshintrc b/.jshintrc index 3bb861f..26492d8 100644 --- a/.jshintrc +++ b/.jshintrc @@ -103,8 +103,8 @@ // == Undocumented Options ============================================ // - // While I've found these options in [example1][2] and [example2][3] - // they are not described in the [JSHint Options documentation][4]. + // While I've found these options in some projects, they are not + // described in the [JSHint Options documentation][4]. // // [4]: http://www.jshint.com/options/ From 648a9bd33e1edd179cfe6a799f5f6fd3acbf1b40 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 15:42:56 -0800 Subject: [PATCH 07/12] a million and one jshint fixes --- .jshintrc | 9 +- Gruntfile.js | 15 +- src/pixi/InteractionManager.js | 1028 ++++++++--------- src/pixi/core/Circle.js | 6 +- src/pixi/core/Ellipse.js | 8 +- src/pixi/core/Matrix.js | 20 +- src/pixi/core/Point.js | 4 +- src/pixi/core/Polygon.js | 8 +- src/pixi/core/Rectangle.js | 6 +- src/pixi/display/DisplayObject.js | 815 +++++++------ src/pixi/display/DisplayObjectContainer.js | 527 +++++---- src/pixi/display/MovieClip.js | 12 +- src/pixi/display/Sprite.js | 24 +- src/pixi/display/Stage.js | 16 +- src/pixi/extras/CustomRenderable.js | 17 +- src/pixi/extras/Rope.js | 83 +- src/pixi/extras/Spine.js | 1 - src/pixi/extras/Strip.js | 11 +- src/pixi/extras/TilingSprite.js | 11 +- src/pixi/filters/AbstractFilter.js | 38 +- src/pixi/filters/BlurFilter.js | 21 +- src/pixi/filters/BlurXFilter.js | 71 +- src/pixi/filters/BlurYFilter.js | 68 +- src/pixi/filters/ColorMatrixFilter.js | 60 +- src/pixi/filters/ColorStepFilter.js | 50 +- src/pixi/filters/CrossHatchFilter.js | 101 +- src/pixi/filters/DisplacementFilter.js | 134 +-- src/pixi/filters/DotScreenFilter.js | 76 +- src/pixi/filters/FilterBlock.js | 4 +- src/pixi/filters/GrayFilter.js | 50 +- src/pixi/filters/InvertFilter.js | 54 +- src/pixi/filters/PixelateFilter.js | 63 +- src/pixi/filters/RGBSplitFilter.js | 65 +- src/pixi/filters/SepiaFilter.js | 56 +- src/pixi/filters/SmartBlurFilter.js | 91 +- src/pixi/filters/TwistFilter.js | 88 +- src/pixi/loaders/AssetLoader.js | 58 +- src/pixi/loaders/BitmapFontLoader.js | 60 +- src/pixi/loaders/ImageLoader.js | 14 +- src/pixi/loaders/JsonLoader.js | 22 +- src/pixi/loaders/SpineLoader.js | 4 +- src/pixi/loaders/SpriteSheetLoader.js | 18 +- src/pixi/primitives/Graphics.js | 39 +- src/pixi/renderers/canvas/CanvasGraphics.js | 56 +- src/pixi/renderers/canvas/CanvasRenderer.js | 199 ++-- src/pixi/renderers/webgl/PixiShader.js | 113 +- src/pixi/renderers/webgl/PrimitiveShader.js | 83 +- src/pixi/renderers/webgl/StripShader.js | 98 +- src/pixi/renderers/webgl/WebGLBatch.js | 120 +- .../renderers/webgl/WebGLFilterManager.js | 823 +++++++------ src/pixi/renderers/webgl/WebGLGraphics.js | 326 +++--- src/pixi/renderers/webgl/WebGLRenderGroup.js | 412 ++++--- src/pixi/renderers/webgl/WebGLRenderer.js | 134 ++- src/pixi/renderers/webgl/WebGLShaders.js | 56 +- src/pixi/text/BitmapText.js | 27 +- src/pixi/text/Text.js | 66 +- src/pixi/textures/BaseTexture.js | 16 +- src/pixi/textures/RenderTexture.js | 73 +- src/pixi/textures/Texture.js | 31 +- src/pixi/utils/Detector.js | 14 +- src/pixi/utils/Polyk.js | 31 +- src/pixi/utils/Utils.js | 78 +- 62 files changed, 3296 insertions(+), 3386 deletions(-) diff --git a/.jshintrc b/.jshintrc index 26492d8..b913f2b 100644 --- a/.jshintrc +++ b/.jshintrc @@ -31,14 +31,17 @@ "unused" : true, // Warn when varaibles are created by not used. "strict" : false, // Require `use strict` pragma in every file. "trailing" : true, // Prohibit trailing whitespaces. - "maxparams" : 6, // Prohibit having more than X number of params in a function. - "maxdepth" : 6, // Prohibit nested blocks from going more than X levels deep. + "maxparams" : 8, // Prohibit having more than X number of params in a function. + "maxdepth" : 8, // Prohibit nested blocks from going more than X levels deep. "maxstatements" : false, // Restrict the number of statements in a function. "maxcomplexity" : false, // Restrict the cyclomatic complexity of the code. "maxlen" : 220, // Require that all lines are 100 characters or less. "globals" : { // Register globals that are used in the code. "module": false, - "require": false + "require": false, + + "PIXI": false, + "spine": false }, // == Relaxing Options ================================================ diff --git a/Gruntfile.js b/Gruntfile.js index a50377c..1952af7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function(grunt) { grunt.loadNpmTasks('grunt-concat-sourcemap'); grunt.loadNpmTasks('grunt-contrib-concat'); @@ -9,9 +7,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-yuidoc'); grunt.loadTasks('tasks'); - var root = 'src/pixi/', - debug = 'bin/pixi.dev.js', - srcFiles = [ + var srcFiles = [ '<%= dirs.src %>/Intro.js', '<%= dirs.src %>/Pixi.js', '<%= dirs.src %>/core/Point.js', @@ -74,9 +70,9 @@ module.exports = function(grunt) { '<%= dirs.src %>/filters/DotScreenFilter.js', '<%= dirs.src %>/filters/CrossHatchFilter.js', '<%= dirs.src %>/filters/RGBSplitFilter.js', - '<%= dirs.src %>/Outro.js' - ], banner = [ + ], + banner = [ '/**', ' * @license', ' * <%= pkg.name %> - v<%= pkg.version %>', @@ -114,6 +110,7 @@ module.exports = function(grunt) { dest: '<%= files.build %>' } }, + /* jshint -W106 */ concat_sourcemap: { dev: { files: { @@ -125,7 +122,7 @@ module.exports = function(grunt) { } }, jshint: { - src: srcFiles.concat('Gruntfile.js'), + src: srcFiles.filter(function(v) { return v.match(/(Intro|Outro|Spine|Pixi)\.js$/) === null; }).concat('Gruntfile.js'), test: ['<%= files.testBlob %>'], options: { jshintrc: '.jshintrc' @@ -180,4 +177,4 @@ module.exports = function(grunt) { grunt.registerTask('docs', ['yuidoc']); grunt.registerTask('travis', ['test']); -} +}; diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 2f5d349..d1e8055 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -1,7 +1,7 @@ /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ - + /** * The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive * This manager also supports multitouch. @@ -12,55 +12,53 @@ */ PIXI.InteractionManager = function(stage) { - /** - * a refference to the stage - * - * @property stage - * @type Stage - */ - this.stage = stage; + /** + * a refference to the stage + * + * @property stage + * @type Stage + */ + this.stage = stage; - /** - * the mouse data - * - * @property mouse - * @type InteractionData - */ - this.mouse = new PIXI.InteractionData(); + /** + * the mouse data + * + * @property mouse + * @type InteractionData + */ + this.mouse = new PIXI.InteractionData(); - /** - * an object that stores current touches (InteractionData) by id reference - * - * @property touchs - * @type Object - */ - this.touchs = {}; + /** + * an object that stores current touches (InteractionData) by id reference + * + * @property touchs + * @type Object + */ + this.touchs = {}; + // helpers + this.tempPoint = new PIXI.Point(); + //this.tempMatrix = mat3.create(); - - // helpers - this.tempPoint = new PIXI.Point(); - //this.tempMatrix = mat3.create(); + this.mouseoverEnabled = true; - this.mouseoverEnabled = true; + //tiny little interactiveData pool! + this.pool = []; - //tiny little interactiveData pool! - this.pool = []; + this.interactiveItems = []; + this.interactionDOMElement = null; - this.interactiveItems = []; - this.interactionDOMElement = null; + //this will make it so that you dont have to call bind all the time + this.onMouseMove = this.onMouseMove.bind( this ); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseOut = this.onMouseOut.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); - //this will make it so that you dont have to call bind all the time - this.onMouseMove = this.onMouseMove.bind( this ); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseOut = this.onMouseOut.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - - this.onTouchStart = this.onTouchStart.bind(this); - this.onTouchEnd = this.onTouchEnd.bind(this); - this.onTouchMove = this.onTouchMove.bind(this); - this.last = 0; -} + this.onTouchStart = this.onTouchStart.bind(this); + this.onTouchEnd = this.onTouchEnd.bind(this); + this.onTouchMove = this.onTouchMove.bind(this); + this.last = 0; +}; // constructor PIXI.InteractionManager.prototype.constructor = PIXI.InteractionManager; @@ -75,39 +73,39 @@ PIXI.InteractionManager.prototype.constructor = PIXI.InteractionManager; */ PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject, iParent) { - var children = displayObject.children; - var length = children.length; - - /// make an interaction tree... {item.__interactiveParent} - for (var i = length-1; i >= 0; i--) - { - var child = children[i]; - -// if(child.visible) { - // push all interactive bits - if(child.interactive) - { - iParent.interactiveChildren = true; - //child.__iParent = iParent; - this.interactiveItems.push(child); + var children = displayObject.children; + var length = children.length; - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, child); - } - } - else - { - child.__iParent = null; + /// make an interaction tree... {item.__interactiveParent} + for (var i = length-1; i >= 0; i--) + { + var child = children[i]; - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, iParent); - } - } -// } - } -} +// if(child.visible) { + // push all interactive bits + if(child.interactive) + { + iParent.interactiveChildren = true; + //child.__iParent = iParent; + this.interactiveItems.push(child); + + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, child); + } + } + else + { + child.__iParent = null; + + if(child.children.length > 0) + { + this.collectInteractiveSprite(child, iParent); + } + } +// } + } +}; /** * Sets the target for event delegation @@ -118,16 +116,16 @@ PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObj */ PIXI.InteractionManager.prototype.setTarget = function(target) { - this.target = target; + this.target = target; - //check if the dom element has been set. If it has don't do anything - if( this.interactionDOMElement === null ) { + //check if the dom element has been set. If it has don't do anything + if( this.interactionDOMElement === null ) { - this.setTargetDomElement( target.view ); - } + this.setTargetDomElement( target.view ); + } - document.body.addEventListener('mouseup', this.onMouseUp, true); -} + document.body.addEventListener('mouseup', this.onMouseUp, true); +}; /** @@ -141,44 +139,43 @@ PIXI.InteractionManager.prototype.setTarget = function(target) */ PIXI.InteractionManager.prototype.setTargetDomElement = function(domElement) { - //remove previouse listeners - if( this.interactionDOMElement !== null ) - { - this.interactionDOMElement.style['-ms-content-zooming'] = ''; - this.interactionDOMElement.style['-ms-touch-action'] = ''; + //remove previouse listeners + if( this.interactionDOMElement !== null ) + { + this.interactionDOMElement.style['-ms-content-zooming'] = ''; + this.interactionDOMElement.style['-ms-touch-action'] = ''; - this.interactionDOMElement.removeEventListener('mousemove', this.onMouseMove, true); - this.interactionDOMElement.removeEventListener('mousedown', this.onMouseDown, true); - this.interactionDOMElement.removeEventListener('mouseout', this.onMouseOut, true); + this.interactionDOMElement.removeEventListener('mousemove', this.onMouseMove, true); + this.interactionDOMElement.removeEventListener('mousedown', this.onMouseDown, true); + this.interactionDOMElement.removeEventListener('mouseout', this.onMouseOut, true); - // aint no multi touch just yet! - this.interactionDOMElement.removeEventListener('touchstart', this.onTouchStart, true); - this.interactionDOMElement.removeEventListener('touchend', this.onTouchEnd, true); - this.interactionDOMElement.removeEventListener('touchmove', this.onTouchMove, true); - } + // aint no multi touch just yet! + this.interactionDOMElement.removeEventListener('touchstart', this.onTouchStart, true); + this.interactionDOMElement.removeEventListener('touchend', this.onTouchEnd, true); + this.interactionDOMElement.removeEventListener('touchmove', this.onTouchMove, true); + } - if (window.navigator.msPointerEnabled) - { - // time to remove some of that zoom in ja.. - domElement.style['-ms-content-zooming'] = 'none'; - domElement.style['-ms-touch-action'] = 'none'; - - // DO some window specific touch! - } + if (window.navigator.msPointerEnabled) + { + // time to remove some of that zoom in ja.. + domElement.style['-ms-content-zooming'] = 'none'; + domElement.style['-ms-touch-action'] = 'none'; - this.interactionDOMElement = domElement; + // DO some window specific touch! + } - domElement.addEventListener('mousemove', this.onMouseMove, true); - domElement.addEventListener('mousedown', this.onMouseDown, true); - domElement.addEventListener('mouseout', this.onMouseOut, true); + this.interactionDOMElement = domElement; - // aint no multi touch just yet! - domElement.addEventListener('touchstart', this.onTouchStart, true); - domElement.addEventListener('touchend', this.onTouchEnd, true); - domElement.addEventListener('touchmove', this.onTouchMove, true); -} + domElement.addEventListener('mousemove', this.onMouseMove, true); + domElement.addEventListener('mousedown', this.onMouseDown, true); + domElement.addEventListener('mouseout', this.onMouseOut, true); + // aint no multi touch just yet! + domElement.addEventListener('touchstart', this.onTouchStart, true); + domElement.addEventListener('touchend', this.onTouchEnd, true); + domElement.addEventListener('touchmove', this.onTouchMove, true); +}; /** * updates the state of interactive objects @@ -188,85 +185,86 @@ PIXI.InteractionManager.prototype.setTargetDomElement = function(domElement) */ PIXI.InteractionManager.prototype.update = function() { - if(!this.target)return; - - // frequency of 30fps?? - var now = Date.now(); - var diff = now - this.last; - diff = (diff * 30) / 1000; - if(diff < 1)return; - this.last = now; - // - - // ok.. so mouse events?? - // yes for now :) - // OPTIMSE - how often to check?? - if(this.dirty) - { - this.dirty = false; - - var len = this.interactiveItems.length; - - for (var i=0; i < len; i++) { - this.interactiveItems[i].interactiveChildren = false; - } - - this.interactiveItems = []; - - if(this.stage.interactive)this.interactiveItems.push(this.stage); - // go through and collect all the objects that are interactive.. - this.collectInteractiveSprite(this.stage, this.stage); - } - - // loop through interactive objects! - var length = this.interactiveItems.length; - - this.interactionDOMElement.style.cursor = "inherit"; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - - //if(!item.visible)continue; - - // OPTIMISATION - only calculate every time if the mousemove function exists.. - // OK so.. does the object have any other interactive functions? - // hit-test the clip! - - - if(item.mouseover || item.mouseout || item.buttonMode) - { - // ok so there are some functions so lets hit test it.. - item.__hit = this.hitTest(item, this.mouse); - this.mouse.target = item; - // ok so deal with interactions.. - // loks like there was a hit! - if(item.__hit) - { - if(item.buttonMode) this.interactionDOMElement.style.cursor = item.defaultCursor; - - if(!item.__isOver) - { - - if(item.mouseover)item.mouseover(this.mouse); - item.__isOver = true; - } - } - else - { - if(item.__isOver) - { - // roll out! - if(item.mouseout)item.mouseout(this.mouse); - item.__isOver = false; - } - } - } - - // ---> - } -} + if(!this.target)return; + + // frequency of 30fps?? + var now = Date.now(); + var diff = now - this.last; + diff = (diff * 30) / 1000; + if(diff < 1)return; + this.last = now; + // + + var i = 0; + + // ok.. so mouse events?? + // yes for now :) + // OPTIMSE - how often to check?? + if(this.dirty) + { + this.dirty = false; + + var len = this.interactiveItems.length; + + for (i = 0; i < len; i++) { + this.interactiveItems[i].interactiveChildren = false; + } + + this.interactiveItems = []; + + if(this.stage.interactive)this.interactiveItems.push(this.stage); + // go through and collect all the objects that are interactive.. + this.collectInteractiveSprite(this.stage, this.stage); + } + + // loop through interactive objects! + var length = this.interactiveItems.length; + + this.interactionDOMElement.style.cursor = 'inherit'; + + for (i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + + //if(!item.visible)continue; + + // OPTIMISATION - only calculate every time if the mousemove function exists.. + // OK so.. does the object have any other interactive functions? + // hit-test the clip! + + + if(item.mouseover || item.mouseout || item.buttonMode) + { + // ok so there are some functions so lets hit test it.. + item.__hit = this.hitTest(item, this.mouse); + this.mouse.target = item; + // ok so deal with interactions.. + // loks like there was a hit! + if(item.__hit) + { + if(item.buttonMode) this.interactionDOMElement.style.cursor = item.defaultCursor; + + if(!item.__isOver) + { + + if(item.mouseover)item.mouseover(this.mouse); + item.__isOver = true; + } + } + else + { + if(item.__isOver) + { + // roll out! + if(item.mouseout)item.mouseout(this.mouse); + item.__isOver = false; + } + } + } + // ---> + } +}; /** * Is called when the mouse moves accross the renderer element @@ -277,28 +275,26 @@ PIXI.InteractionManager.prototype.update = function() */ PIXI.InteractionManager.prototype.onMouseMove = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event - // TODO optimize by not check EVERY TIME! maybe half as often? // - var rect = this.interactionDOMElement.getBoundingClientRect(); - - this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); - this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); - - var length = this.interactiveItems.length; - var global = this.mouse.global; - - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mousemove) - { - //call the function! - item.mousemove(this.mouse); - } - } -} + this.mouse.originalEvent = event || window.event; //IE uses window.event + // TODO optimize by not check EVERY TIME! maybe half as often? // + var rect = this.interactionDOMElement.getBoundingClientRect(); + + this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); + this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); + + var length = this.interactiveItems.length; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mousemove) + { + //call the function! + item.mousemove(this.mouse); + } + } +}; /** * Is called when the mouse button is pressed down on the renderer element @@ -309,61 +305,57 @@ PIXI.InteractionManager.prototype.onMouseMove = function(event) */ PIXI.InteractionManager.prototype.onMouseDown = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event - - // loop through inteaction tree... - // hit test each item! -> - // get interactive items under point?? - //stage.__i - var length = this.interactiveItems.length; - var global = this.mouse.global; - - var index = 0; - var parent = this.stage; - - // while - // hit test - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mousedown || item.click) - { - item.__mouseIsDown = true; - item.__hit = this.hitTest(item, this.mouse); - - if(item.__hit) - { - //call the function! - if(item.mousedown)item.mousedown(this.mouse); - item.__isDown = true; - - // just the one! - if(!item.interactiveChildren)break; - } - } - } -} + this.mouse.originalEvent = event || window.event; //IE uses window.event + + // loop through inteaction tree... + // hit test each item! -> + // get interactive items under point?? + //stage.__i + var length = this.interactiveItems.length; + + // while + // hit test + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mousedown || item.click) + { + item.__mouseIsDown = true; + item.__hit = this.hitTest(item, this.mouse); + + if(item.__hit) + { + //call the function! + if(item.mousedown)item.mousedown(this.mouse); + item.__isDown = true; + + // just the one! + if(!item.interactiveChildren)break; + } + } + } +}; -PIXI.InteractionManager.prototype.onMouseOut = function(event) +PIXI.InteractionManager.prototype.onMouseOut = function() { - var length = this.interactiveItems.length; - - this.interactionDOMElement.style.cursor = "inherit"; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.__isOver) - { - this.mouse.target = item; - if(item.mouseout)item.mouseout(this.mouse); - item.__isOver = false; - } - } -} + var length = this.interactiveItems.length; + + this.interactionDOMElement.style.cursor = 'inherit'; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.__isOver) + { + this.mouse.target = item; + if(item.mouseout)item.mouseout(this.mouse); + item.__isOver = false; + } + } +}; /** * Is called when the mouse button is released on the renderer element @@ -374,48 +366,45 @@ PIXI.InteractionManager.prototype.onMouseOut = function(event) */ PIXI.InteractionManager.prototype.onMouseUp = function(event) { - this.mouse.originalEvent = event || window.event; //IE uses window.event - - var global = this.mouse.global; - - - var length = this.interactiveItems.length; - var up = false; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mouseup || item.mouseupoutside || item.click) - { - item.__hit = this.hitTest(item, this.mouse); - - if(item.__hit && !up) - { - //call the function! - if(item.mouseup) - { - item.mouseup(this.mouse); - } - if(item.__isDown) - { - if(item.click)item.click(this.mouse); - } - - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.mouseupoutside)item.mouseupoutside(this.mouse); - } - } - - item.__isDown = false; - } - } -} + this.mouse.originalEvent = event || window.event; //IE uses window.event + + var length = this.interactiveItems.length; + var up = false; + + for (var i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + + if(item.mouseup || item.mouseupoutside || item.click) + { + item.__hit = this.hitTest(item, this.mouse); + + if(item.__hit && !up) + { + //call the function! + if(item.mouseup) + { + item.mouseup(this.mouse); + } + if(item.__isDown) + { + if(item.click)item.click(this.mouse); + } + + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.mouseupoutside)item.mouseupoutside(this.mouse); + } + } + + item.__isDown = false; + } + } +}; /** * Tests if the current mouse coords hit a sprite @@ -427,68 +416,68 @@ PIXI.InteractionManager.prototype.onMouseUp = function(event) */ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) { - var global = interactionData.global; - - if(item.vcount !== PIXI.visibleCount)return false; + var global = interactionData.global; - 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; + if(item.vcount !== PIXI.visibleCount)return false; - interactionData.target = item; - - //a sprite or display object with a hit area defined - if(item.hitArea && item.hitArea.contains) { - if(item.hitArea.contains(x, y)) { - //if(isSprite) - interactionData.target = item; + 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; - return true; - } - - return false; - } - // a sprite with no hitarea defined - else if(isSprite) - { - var width = item.texture.frame.width, - height = item.texture.frame.height, - x1 = -width * item.anchor.x, - y1; - - if(x > x1 && x < x1 + width) - { - y1 = -height * item.anchor.y; - - if(y > y1 && y < y1 + height) - { - // set the target property if a hit is true! - interactionData.target = item - return true; - } - } - } + interactionData.target = item; - var length = item.children.length; - - for (var i = 0; i < length; i++) - { - var tempItem = item.children[i]; - var hit = this.hitTest(tempItem, interactionData); - if(hit) - { - // hmm.. TODO SET CORRECT TARGET? - interactionData.target = item - return true; - } - } + //a sprite or display object with a hit area defined + if(item.hitArea && item.hitArea.contains) { + if(item.hitArea.contains(x, y)) { + //if(isSprite) + interactionData.target = item; - return false; -} + return true; + } + + return false; + } + // a sprite with no hitarea defined + else if(isSprite) + { + var width = item.texture.frame.width, + height = item.texture.frame.height, + x1 = -width * item.anchor.x, + y1; + + if(x > x1 && x < x1 + width) + { + y1 = -height * item.anchor.y; + + if(y > y1 && y < y1 + height) + { + // set the target property if a hit is true! + interactionData.target = item; + return true; + } + } + } + + var length = item.children.length; + + for (var i = 0; i < length; i++) + { + var tempItem = item.children[i]; + var hit = this.hitTest(tempItem, interactionData); + if(hit) + { + // hmm.. TODO SET CORRECT TARGET? + interactionData.target = item; + return true; + } + } + + return false; +}; /** * Is called when a touch is moved accross the renderer element @@ -499,27 +488,30 @@ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) */ PIXI.InteractionManager.prototype.onTouchMove = function(event) { - var rect = this.interactionDOMElement.getBoundingClientRect(); - var changedTouches = event.changedTouches; - - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - touchData.originalEvent = event || window.event; - - // update the touch position - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - } - - var length = this.interactiveItems.length; - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - if(item.touchmove)item.touchmove(touchData); - } -} + var rect = this.interactionDOMElement.getBoundingClientRect(); + var changedTouches = event.changedTouches; + var touchData; + var i = 0; + + for (i = 0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + touchData = this.touchs[touchEvent.identifier]; + touchData.originalEvent = event || window.event; + + // update the touch position + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + } + + var length = this.interactiveItems.length; + for (i = 0; i < length; i++) + { + var item = this.interactiveItems[i]; + if(item.touchmove) + item.touchmove(touchData); + } +}; /** * Is called when a touch is started on the renderer element @@ -530,45 +522,45 @@ PIXI.InteractionManager.prototype.onTouchMove = function(event) */ PIXI.InteractionManager.prototype.onTouchStart = function(event) { - var rect = this.interactionDOMElement.getBoundingClientRect(); - - var changedTouches = event.changedTouches; - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - - var touchData = this.pool.pop(); - if(!touchData)touchData = new PIXI.InteractionData(); - - touchData.originalEvent = event || window.event; - - this.touchs[touchEvent.identifier] = touchData; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - - var length = this.interactiveItems.length; - - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; - - if(item.touchstart || item.tap) - { - item.__hit = this.hitTest(item, touchData); - - if(item.__hit) - { - //call the function! - if(item.touchstart)item.touchstart(touchData); - item.__isDown = true; - item.__touchData = touchData; - - if(!item.interactiveChildren)break; - } - } - } - } -} + var rect = this.interactionDOMElement.getBoundingClientRect(); + + var changedTouches = event.changedTouches; + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + + var touchData = this.pool.pop(); + if(!touchData)touchData = new PIXI.InteractionData(); + + touchData.originalEvent = event || window.event; + + this.touchs[touchEvent.identifier] = touchData; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + var length = this.interactiveItems.length; + + for (var j = 0; j < length; j++) + { + var item = this.interactiveItems[j]; + + if(item.touchstart || item.tap) + { + item.__hit = this.hitTest(item, touchData); + + if(item.__hit) + { + //call the function! + if(item.touchstart)item.touchstart(touchData); + item.__isDown = true; + item.__touchData = touchData; + + if(!item.interactiveChildren)break; + } + } + } + } +}; /** * Is called when a touch is ended on the renderer element @@ -579,67 +571,69 @@ PIXI.InteractionManager.prototype.onTouchStart = function(event) */ PIXI.InteractionManager.prototype.onTouchEnd = function(event) { - //this.mouse.originalEvent = event || window.event; //IE uses window.event - var rect = this.interactionDOMElement.getBoundingClientRect(); - var changedTouches = event.changedTouches; - - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - var up = false; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - - var length = this.interactiveItems.length; - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; - var itemTouchData = item.__touchData; // <-- Here! - item.__hit = this.hitTest(item, touchData); - - if(itemTouchData == touchData) - { - // so this one WAS down... - touchData.originalEvent = event || window.event; - // hitTest?? - - if(item.touchend || item.tap) - { - if(item.__hit && !up) - { - if(item.touchend)item.touchend(touchData); - if(item.__isDown) - { - if(item.tap)item.tap(touchData); - } - - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.touchendoutside)item.touchendoutside(touchData); - } - } - - item.__isDown = false; - } - - item.__touchData = null; - - } - else - { - - } - } - // remove the touch.. - this.pool.push(touchData); - this.touchs[touchEvent.identifier] = null; - } -} + //this.mouse.originalEvent = event || window.event; //IE uses window.event + var rect = this.interactionDOMElement.getBoundingClientRect(); + var changedTouches = event.changedTouches; + + for (var i=0; i < changedTouches.length; i++) + { + var touchEvent = changedTouches[i]; + var touchData = this.touchs[touchEvent.identifier]; + var up = false; + touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); + touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); + + var length = this.interactiveItems.length; + for (var j = 0; j < length; j++) + { + var item = this.interactiveItems[j]; + var itemTouchData = item.__touchData; // <-- Here! + item.__hit = this.hitTest(item, touchData); + + if(itemTouchData === touchData) + { + // so this one WAS down... + touchData.originalEvent = event || window.event; + // hitTest?? + + if(item.touchend || item.tap) + { + if(item.__hit && !up) + { + if(item.touchend)item.touchend(touchData); + if(item.__isDown) + { + if(item.tap)item.tap(touchData); + } + + if(!item.interactiveChildren)up = true; + } + else + { + if(item.__isDown) + { + if(item.touchendoutside)item.touchendoutside(touchData); + } + } + + item.__isDown = false; + } + + item.__touchData = null; + + } + /* + else + { + + } + */ + } + // remove the touch.. + this.pool.push(touchData); + this.touchs[touchEvent.identifier] = null; + } +}; /** * Holds all information related to an Interaction event @@ -649,33 +643,33 @@ PIXI.InteractionManager.prototype.onTouchEnd = function(event) */ PIXI.InteractionData = function() { - /** - * This point stores the global coords of where the touch/mouse event happened - * - * @property global - * @type Point - */ - this.global = new PIXI.Point(); - - // this is here for legacy... but will remove - this.local = new PIXI.Point(); + /** + * This point stores the global coords of where the touch/mouse event happened + * + * @property global + * @type Point + */ + this.global = new PIXI.Point(); - /** - * The target Sprite that was interacted with - * - * @property target - * @type Sprite - */ - this.target; + // this is here for legacy... but will remove + this.local = new PIXI.Point(); - /** - * When passed to an event handler, this will be the original DOM Event that was captured - * - * @property originalEvent - * @type Event - */ - this.originalEvent; -} + /** + * The target Sprite that was interacted with + * + * @property target + * @type Sprite + */ + this.target = null; + + /** + * When passed to an event handler, this will be the original DOM Event that was captured + * + * @property originalEvent + * @type Event + */ + this.originalEvent = null; +}; /** * This will return the local coords of the specified displayObject for this InteractionData @@ -686,17 +680,17 @@ PIXI.InteractionData = function() */ PIXI.InteractionData.prototype.getLocalPosition = function(displayObject) { - var worldTransform = displayObject.worldTransform; - var global = this.global; - - // do a cheeky transform to get the mouse coords; - var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], + var worldTransform = displayObject.worldTransform; + var global = this.global; + + // do a cheeky transform to get the mouse coords; + var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], id = 1 / (a00 * a11 + a01 * -a10); - // set the mouse coords... - return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, - a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id) -} + // set the mouse coords... + return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, + a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id); +}; // constructor PIXI.InteractionData.prototype.constructor = PIXI.InteractionData; diff --git a/src/pixi/core/Circle.js b/src/pixi/core/Circle.js index e272833..d172461 100644 --- a/src/pixi/core/Circle.js +++ b/src/pixi/core/Circle.js @@ -33,7 +33,7 @@ PIXI.Circle = function(x, y, radius) * @default 0 */ this.radius = radius || 0; -} +}; /** * Creates a clone of this Circle instance @@ -44,7 +44,7 @@ PIXI.Circle = function(x, y, radius) PIXI.Circle.prototype.clone = function() { return new PIXI.Circle(this.x, this.y, this.radius); -} +}; /** * Checks if the x, and y coords passed to this function are contained within this circle @@ -67,7 +67,7 @@ PIXI.Circle.prototype.contains = function(x, y) dy *= dy; return (dx + dy <= r2); -} +}; // constructor PIXI.Circle.prototype.constructor = PIXI.Circle; diff --git a/src/pixi/core/Ellipse.js b/src/pixi/core/Ellipse.js index eef1059..7a9c2f6 100644 --- a/src/pixi/core/Ellipse.js +++ b/src/pixi/core/Ellipse.js @@ -41,7 +41,7 @@ PIXI.Ellipse = function(x, y, width, height) * @default 0 */ this.height = height || 0; -} +}; /** * Creates a clone of this Ellipse instance @@ -52,7 +52,7 @@ PIXI.Ellipse = function(x, y, width, height) PIXI.Ellipse.prototype.clone = function() { return new PIXI.Ellipse(this.x, this.y, this.width, this.height); -} +}; /** * Checks if the x, and y coords passed to this function are contained within this ellipse @@ -76,12 +76,12 @@ PIXI.Ellipse.prototype.contains = function(x, y) normy *= normy; return (normx + normy < 0.25); -} +}; PIXI.Ellipse.prototype.getBounds = function() { return new PIXI.Rectangle(this.x, this.y, this.width, this.height); -} +}; // constructor PIXI.Ellipse.prototype.constructor = PIXI.Ellipse; diff --git a/src/pixi/core/Matrix.js b/src/pixi/core/Matrix.js index b2760c0..1f5a67a 100644 --- a/src/pixi/core/Matrix.js +++ b/src/pixi/core/Matrix.js @@ -29,7 +29,7 @@ PIXI.mat3.create = function() matrix[8] = 1; return matrix; -} +}; PIXI.mat3.identity = function(matrix) @@ -45,7 +45,7 @@ PIXI.mat3.identity = function(matrix) matrix[8] = 1; return matrix; -} +}; PIXI.mat4 = {}; @@ -72,7 +72,7 @@ PIXI.mat4.create = function() matrix[15] = 1; return matrix; -} +}; PIXI.mat3.multiply = function (mat, mat2, dest) { @@ -100,7 +100,7 @@ PIXI.mat3.multiply = function (mat, mat2, dest) dest[8] = b20 * a02 + b21 * a12 + b22 * a22; return dest; -} +}; PIXI.mat3.clone = function(mat) { @@ -117,7 +117,7 @@ PIXI.mat3.clone = function(mat) matrix[8] = mat[8]; return matrix; -} +}; PIXI.mat3.transpose = function (mat, dest) { @@ -145,7 +145,7 @@ PIXI.mat3.transpose = function (mat, dest) dest[7] = mat[5]; dest[8] = mat[8]; return dest; -} +}; PIXI.mat3.toMat4 = function (mat, dest) { @@ -172,7 +172,7 @@ PIXI.mat3.toMat4 = function (mat, dest) dest[0] = mat[0]; return dest; -} +}; ///// @@ -200,7 +200,7 @@ PIXI.mat4.create = function() matrix[15] = 1; return matrix; -} +}; PIXI.mat4.transpose = function (mat, dest) { @@ -243,7 +243,7 @@ PIXI.mat4.transpose = function (mat, dest) dest[14] = mat[11]; dest[15] = mat[15]; return dest; -} +}; PIXI.mat4.multiply = function (mat, mat2, dest) { @@ -290,4 +290,4 @@ PIXI.mat4.multiply = function (mat, mat2, dest) dest[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; return dest; -} +}; diff --git a/src/pixi/core/Point.js b/src/pixi/core/Point.js index b1f9cd2..c7e2772 100644 --- a/src/pixi/core/Point.js +++ b/src/pixi/core/Point.js @@ -25,7 +25,7 @@ PIXI.Point = function(x, y) * @default 0 */ this.y = y || 0; -} +}; /** * Creates a clone of this point @@ -36,7 +36,7 @@ PIXI.Point = function(x, y) PIXI.Point.prototype.clone = function() { return new PIXI.Point(this.x, this.y); -} +}; // constructor PIXI.Point.prototype.constructor = PIXI.Point; diff --git a/src/pixi/core/Polygon.js b/src/pixi/core/Polygon.js index 445882e..4887f6c 100644 --- a/src/pixi/core/Polygon.js +++ b/src/pixi/core/Polygon.js @@ -30,7 +30,7 @@ PIXI.Polygon = function(points) } this.points = points; -} +}; /** * Creates a clone of this polygon @@ -46,7 +46,7 @@ PIXI.Polygon.prototype.clone = function() } return new PIXI.Polygon(points); -} +}; /** * Checks if the x, and y coords passed to this function are contained within this polygon @@ -65,13 +65,13 @@ PIXI.Polygon.prototype.contains = function(x, y) for(var i = 0, j = this.points.length - 1; i < this.points.length; j = i++) { var xi = this.points[i].x, yi = this.points[i].y, xj = this.points[j].x, yj = this.points[j].y, - intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); + intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if(intersect) inside = !inside; } return inside; -} +}; // constructor PIXI.Polygon.prototype.constructor = PIXI.Polygon; diff --git a/src/pixi/core/Rectangle.js b/src/pixi/core/Rectangle.js index b9c6c4e..70390a1 100644 --- a/src/pixi/core/Rectangle.js +++ b/src/pixi/core/Rectangle.js @@ -41,7 +41,7 @@ PIXI.Rectangle = function(x, y, width, height) * @default 0 */ this.height = height || 0; -} +}; /** * Creates a clone of this Rectangle @@ -52,7 +52,7 @@ PIXI.Rectangle = function(x, y, width, height) PIXI.Rectangle.prototype.clone = function() { return new PIXI.Rectangle(this.x, this.y, this.width, this.height); -} +}; /** * Checks if the x, and y coords passed to this function are contained within this Rectangle @@ -79,7 +79,7 @@ PIXI.Rectangle.prototype.contains = function(x, y) } return false; -} +}; // constructor PIXI.Rectangle.prototype.constructor = PIXI.Rectangle; diff --git a/src/pixi/display/DisplayObject.js b/src/pixi/display/DisplayObject.js index df5e898..53cce04 100644 --- a/src/pixi/display/DisplayObject.js +++ b/src/pixi/display/DisplayObject.js @@ -10,238 +10,238 @@ */ PIXI.DisplayObject = function() { - this.last = this; - this.first = this; - /** - * The coordinate of the object relative to the local coordinates of the parent. - * - * @property position - * @type Point - */ - this.position = new PIXI.Point(); + this.last = this; + this.first = this; + /** + * The coordinate of the object relative to the local coordinates of the parent. + * + * @property position + * @type Point + */ + this.position = new PIXI.Point(); - /** - * The scale factor of the object. - * - * @property scale - * @type Point - */ - this.scale = new PIXI.Point(1,1);//{x:1, y:1}; + /** + * The scale factor of the object. + * + * @property scale + * @type Point + */ + this.scale = new PIXI.Point(1,1);//{x:1, y:1}; - /** - * The pivot point of the displayObject that it rotates around - * - * @property pivot - * @type Point - */ - this.pivot = new PIXI.Point(0,0); + /** + * The pivot point of the displayObject that it rotates around + * + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); - /** - * The rotation of the object in radians. - * - * @property rotation - * @type Number - */ - this.rotation = 0; + /** + * The rotation of the object in radians. + * + * @property rotation + * @type Number + */ + this.rotation = 0; - /** - * The opacity of the object. - * - * @property alpha - * @type Number - */ - this.alpha = 1; + /** + * The opacity of the object. + * + * @property alpha + * @type Number + */ + this.alpha = 1; - /** - * The visibility of the object. - * - * @property visible - * @type Boolean - */ - this.visible = true; + /** + * The visibility of the object. + * + * @property visible + * @type Boolean + */ + this.visible = true; - /** - * This is the defined area that will pick up mouse / touch events. It is null by default. - * Setting 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) - * - * @property hitArea - * @type Rectangle|Circle|Ellipse|Polygon - */ - this.hitArea = null; + /** + * This is the defined area that will pick up mouse / touch events. It is null by default. + * Setting 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) + * + * @property hitArea + * @type Rectangle|Circle|Ellipse|Polygon + */ + this.hitArea = null; - /** - * This is used to indicate if the displayObject should display a mouse hand cursor on rollover - * - * @property buttonMode - * @type Boolean - */ - this.buttonMode = false; + /** + * This is used to indicate if the displayObject should display a mouse hand cursor on rollover + * + * @property buttonMode + * @type Boolean + */ + this.buttonMode = false; - /** - * Can this object be rendered - * - * @property renderable - * @type Boolean - */ - this.renderable = false; + /** + * Can this object be rendered + * + * @property renderable + * @type Boolean + */ + this.renderable = false; - /** - * [read-only] The display object container that contains this display object. - * - * @property parent - * @type DisplayObjectContainer - * @readOnly - */ - this.parent = null; + /** + * [read-only] The display object container that contains this display object. + * + * @property parent + * @type DisplayObjectContainer + * @readOnly + */ + this.parent = null; - /** - * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. - * - * @property stage - * @type Stage - * @readOnly - */ - this.stage = null; + /** + * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. + * + * @property stage + * @type Stage + * @readOnly + */ + this.stage = null; - /** - * [read-only] The multiplied alpha of the displayobject - * - * @property worldAlpha - * @type Number - * @readOnly - */ - this.worldAlpha = 1; + /** + * [read-only] The multiplied alpha of the displayobject + * + * @property worldAlpha + * @type Number + * @readOnly + */ + this.worldAlpha = 1; - /** - * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property - * - * @property _interactive - * @type Boolean - * @readOnly - * @private - */ - this._interactive = false; + /** + * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property + * + * @property _interactive + * @type Boolean + * @readOnly + * @private + */ + this._interactive = false; - this.defaultCursor = "pointer"; - - /** - * [read-only] Current transform of the object based on world (parent) factors - * - * @property worldTransform - * @type Mat3 - * @readOnly - * @private - */ - this.worldTransform = PIXI.mat3.create()//mat3.identity(); + this.defaultCursor = 'pointer'; - /** - * [read-only] Current transform of the object locally - * - * @property localTransform - * @type Mat3 - * @readOnly - * @private - */ - this.localTransform = PIXI.mat3.create()//mat3.identity(); + /** + * [read-only] Current transform of the object based on world (parent) factors + * + * @property worldTransform + * @type Mat3 + * @readOnly + * @private + */ + this.worldTransform = PIXI.mat3.create(); //mat3.identity(); - /** - * [NYI] Unkown - * - * @property color - * @type Array<> - * @private - */ - this.color = []; + /** + * [read-only] Current transform of the object locally + * + * @property localTransform + * @type Mat3 + * @readOnly + * @private + */ + this.localTransform = PIXI.mat3.create(); //mat3.identity(); - /** - * [NYI] Holds whether or not this object is dynamic, for rendering optimization - * - * @property dynamic - * @type Boolean - * @private - */ - this.dynamic = true; + /** + * [NYI] Unkown + * + * @property color + * @type Array<> + * @private + */ + this.color = []; - // chach that puppy! - this._sr = 0; - this._cr = 1; + /** + * [NYI] Holds whether or not this object is dynamic, for rendering optimization + * + * @property dynamic + * @type Boolean + * @private + */ + this.dynamic = true; + + // chach that puppy! + this._sr = 0; + this._cr = 1; - this.filterArea = new PIXI.Rectangle(0,0,1,1); - - /* - * MOUSE Callbacks - */ + this.filterArea = new PIXI.Rectangle(0,0,1,1); - /** - * A callback that is used when the users clicks on the displayObject with their mouse - * @method click - * @param interactionData {InteractionData} - */ + /* + * MOUSE Callbacks + */ - /** - * A callback that is used when the user clicks the mouse down over the sprite - * @method mousedown - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users clicks on the displayObject with their mouse + * @method click + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the mouse that was over the displayObject - * for this callback to be fired the mouse must have been pressed down over the displayObject - * @method mouseup - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user clicks the mouse down over the sprite + * @method mousedown + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject - * for this callback to be fired, The touch must have started over the displayObject - * @method mouseupoutside - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases the mouse that was over the displayObject + * for this callback to be fired the mouse must have been pressed down over the displayObject + * @method mouseup + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the users mouse rolls over the displayObject - * @method mouseover - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject + * for this callback to be fired, The touch must have started over the displayObject + * @method mouseupoutside + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the users mouse leaves the displayObject - * @method mouseout - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users mouse rolls over the displayObject + * @method mouseover + * @param interactionData {InteractionData} + */ + + /** + * A callback that is used when the users mouse leaves the displayObject + * @method mouseout + * @param interactionData {InteractionData} + */ - /* - * TOUCH Callbacks - */ + /* + * TOUCH Callbacks + */ - /** - * A callback that is used when the users taps on the sprite with their finger - * basically a touch version of click - * @method tap - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the users taps on the sprite with their finger + * basically a touch version of click + * @method tap + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user touch's over the displayObject - * @method touchstart - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user touch's over the displayObject + * @method touchstart + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases a touch over the displayObject - * @method touchend - * @param interactionData {InteractionData} - */ + /** + * A callback that is used when the user releases a touch over the displayObject + * @method touchend + * @param interactionData {InteractionData} + */ - /** - * A callback that is used when the user releases the touch that was over the displayObject - * for this callback to be fired, The touch must have started over the sprite - * @method touchendoutside - * @param interactionData {InteractionData} - */ -} + /** + * A callback that is used when the user releases the touch that was over the displayObject + * for this callback to be fired, The touch must have started over the sprite + * @method touchendoutside + * @param interactionData {InteractionData} + */ +}; // constructor PIXI.DisplayObject.prototype.constructor = PIXI.DisplayObject; @@ -256,8 +256,8 @@ PIXI.DisplayObject.prototype.constructor = PIXI.DisplayObject; */ PIXI.DisplayObject.prototype.setInteractive = function(interactive) { - this.interactive = interactive; -} + this.interactive = interactive; +}; /** * Indicates if the sprite will have touch and mouse interactivity. It is false by default @@ -271,11 +271,11 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'interactive', { return this._interactive; }, set: function(value) { - this._interactive = value; - - // TODO more to be done here.. - // need to sort out a re-crawl! - if(this.stage)this.stage.dirty = true; + this._interactive = value; + + // TODO more to be done here.. + // need to sort out a re-crawl! + if(this.stage)this.stage.dirty = true; } }); @@ -292,33 +292,33 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'mask', { return this._mask; }, set: function(value) { - - + + if(value) { - if(this._mask) - { - value.start = this._mask.start; - value.end = this._mask.end; - } - else - { - this.addFilter(value); - value.renderable = false; - } + if(this._mask) + { + value.start = this._mask.start; + value.end = this._mask.end; + } + else + { + this.addFilter(value); + value.renderable = false; + } } else { - this.removeFilter(this._mask); - this._mask.renderable = true; + this.removeFilter(this._mask); + this._mask.renderable = true; } - + this._mask = value; } }); /** - * Sets the filters for the displayObject. + * Sets the filters for the displayObject. * * IMPORTANT: This is a webGL only feature and will be ignored by the canvas renderer. * To remove filters simply set this property to 'null' * @property filters @@ -329,35 +329,33 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'filters', { return this._filters; }, set: function(value) { - + if(value) { - if(this._filters)this.removeFilter(this._filters); - this.addFilter(value); + if(this._filters)this.removeFilter(this._filters); + this.addFilter(value); - // now put all the passes in one place.. - var passes = []; - for (var i = 0; i < value.length; i++) - { - var filterPasses = value[i].passes; - for (var j = 0; j < filterPasses.length; j++) - { - passes.push(filterPasses[j]); - }; - }; + // now put all the passes in one place.. + var passes = []; + for (var i = 0; i < value.length; i++) + { + var filterPasses = value[i].passes; + for (var j = 0; j < filterPasses.length; j++) + { + passes.push(filterPasses[j]); + } + } - value.start.filterPasses = passes; + value.start.filterPasses = passes; } else { - if(this._filters)this.removeFilter(this._filters); + if(this._filters) { + this.removeFilter(this._filters); + } } - + this._filters = value; - - - - } }); @@ -370,101 +368,99 @@ Object.defineProperty(PIXI.DisplayObject.prototype, 'filters', { */ PIXI.DisplayObject.prototype.addFilter = function(data) { - //if(this.filter)return; - //this.filter = true; -// data[0].target = this; - + //if(this.filter)return; + //this.filter = true; +// data[0].target = this; - // insert a filter block.. - // TODO Onject pool thease bad boys.. - var start = new PIXI.FilterBlock(); - var end = new PIXI.FilterBlock(); - - data.start = start; - data.end = end; - - start.data = data; - end.data = data; - - start.first = start.last = this; - end.first = end.last = this; - - start.open = true; - - start.target = this; - - /* - * insert start - */ - - var childFirst = start - var childLast = start - var nextObject; - var previousObject; - - previousObject = this.first._iPrev; - - if(previousObject) - { - nextObject = previousObject._iNext; - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; - } - else - { - nextObject = this; - } - - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } - - - // now insert the end filter block.. - - /* - * insert end filter - */ - var childFirst = end - var childLast = end - var nextObject = null; - var previousObject = null; - - previousObject = this.last; - nextObject = previousObject._iNext; - - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } - - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; - - var updateLast = this; - - var prevLast = this.last; - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = end; - } - updateLast = updateLast.parent; - } - - this.first = start; - - // if webGL... - if(this.__renderGroup) - { - this.__renderGroup.addFilterBlocks(start, end); - } - -} + + // insert a filter block.. + // TODO Onject pool thease bad boys.. + var start = new PIXI.FilterBlock(); + var end = new PIXI.FilterBlock(); + + data.start = start; + data.end = end; + + start.data = data; + end.data = data; + + start.first = start.last = this; + end.first = end.last = this; + + start.open = true; + + start.target = this; + + /* + * insert start + */ + + var childFirst = start; + var childLast = start; + var nextObject; + var previousObject; + + previousObject = this.first._iPrev; + + if(previousObject) + { + nextObject = previousObject._iNext; + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; + } + else + { + nextObject = this; + } + + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } + + // now insert the end filter block.. + + /* + * insert end filter + */ + childFirst = end; + childLast = end; + nextObject = null; + previousObject = null; + + previousObject = this.last; + nextObject = previousObject._iNext; + + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } + + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; + + var updateLast = this; + + var prevLast = this.last; + while(updateLast) + { + if(updateLast.last === prevLast) + { + updateLast.last = end; + } + updateLast = updateLast.parent; + } + + this.first = start; + + // if webGL... + if(this.__renderGroup) + { + this.__renderGroup.addFilterBlocks(start, end); + } +}; /* * Removes the filter to this displayObject @@ -474,47 +470,47 @@ PIXI.DisplayObject.prototype.addFilter = function(data) */ PIXI.DisplayObject.prototype.removeFilter = function(data) { - //if(!this.filter)return; - //this.filter = false; - // console.log("YUOIO") - // modify the list.. - var startBlock = data.start; - - - var nextObject = startBlock._iNext; - var previousObject = startBlock._iPrev; - - if(nextObject)nextObject._iPrev = previousObject; - if(previousObject)previousObject._iNext = nextObject; - - this.first = startBlock._iNext; - - // remove the end filter - var lastBlock = data.end; - - var nextObject = lastBlock._iNext; - var previousObject = lastBlock._iPrev; - - if(nextObject)nextObject._iPrev = previousObject; - previousObject._iNext = nextObject; - - // this is always true too! - var tempLast = lastBlock._iPrev; - // need to make sure the parents last is updated too - var updateLast = this; - while(updateLast.last == lastBlock) - { - updateLast.last = tempLast; - updateLast = updateLast.parent; - if(!updateLast)break; - } - - // if webGL... - if(this.__renderGroup) - { - this.__renderGroup.removeFilterBlocks(startBlock, lastBlock); - } -} + //if(!this.filter)return; + //this.filter = false; + // console.log('YUOIO') + // modify the list.. + var startBlock = data.start; + + + var nextObject = startBlock._iNext; + var previousObject = startBlock._iPrev; + + if(nextObject)nextObject._iPrev = previousObject; + if(previousObject)previousObject._iNext = nextObject; + + this.first = startBlock._iNext; + + // remove the end filter + var lastBlock = data.end; + + nextObject = lastBlock._iNext; + previousObject = lastBlock._iPrev; + + if(nextObject)nextObject._iPrev = previousObject; + previousObject._iNext = nextObject; + + // this is always true too! + var tempLast = lastBlock._iPrev; + // need to make sure the parents last is updated too + var updateLast = this; + while(updateLast.last === lastBlock) + { + updateLast.last = tempLast; + updateLast = updateLast.parent; + if(!updateLast)break; + } + + // if webGL... + if(this.__renderGroup) + { + this.__renderGroup.removeFilterBlocks(startBlock, lastBlock); + } +}; /* * Updates the object transform for rendering @@ -524,28 +520,28 @@ PIXI.DisplayObject.prototype.removeFilter = function(data) */ PIXI.DisplayObject.prototype.updateTransform = function() { - // TODO OPTIMIZE THIS!! with dirty - if(this.rotation !== this.rotationCache) - { - this.rotationCache = this.rotation; - this._sr = Math.sin(this.rotation); - this._cr = Math.cos(this.rotation); - } - - var localTransform = this.localTransform; - var parentTransform = this.parent.worldTransform; - var worldTransform = this.worldTransform; - //console.log(localTransform) - localTransform[0] = this._cr * this.scale.x; - localTransform[1] = -this._sr * this.scale.y - localTransform[3] = this._sr * this.scale.x; - localTransform[4] = this._cr * this.scale.y; - - // TODO --> do we even need a local matrix??? - - var px = this.pivot.x; - var py = this.pivot.y; - + // TODO OPTIMIZE THIS!! with dirty + if(this.rotation !== this.rotationCache) + { + this.rotationCache = this.rotation; + this._sr = Math.sin(this.rotation); + this._cr = Math.cos(this.rotation); + } + + var localTransform = this.localTransform; + var parentTransform = this.parent.worldTransform; + var worldTransform = this.worldTransform; + //console.log(localTransform) + localTransform[0] = this._cr * this.scale.x; + localTransform[1] = -this._sr * this.scale.y; + localTransform[3] = this._sr * this.scale.x; + localTransform[4] = this._cr * this.scale.y; + + // TODO --> do we even need a local matrix??? + + var px = this.pivot.x; + var py = this.pivot.y; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = this.position.x - localTransform[0] * px - py * localTransform[1], a10 = localTransform[3], a11 = localTransform[4], a12 = this.position.y - localTransform[4] * py - px * localTransform[3], @@ -553,9 +549,9 @@ PIXI.DisplayObject.prototype.updateTransform = function() b00 = parentTransform[0], b01 = parentTransform[1], b02 = parentTransform[2], b10 = parentTransform[3], b11 = parentTransform[4], b12 = parentTransform[5]; - localTransform[2] = a02 - localTransform[5] = a12 - + localTransform[2] = a02; + localTransform[5] = a12; + worldTransform[0] = b00 * a00 + b01 * a10; worldTransform[1] = b00 * a01 + b01 * a11; worldTransform[2] = b00 * a02 + b01 * a12 + b02; @@ -564,12 +560,11 @@ PIXI.DisplayObject.prototype.updateTransform = function() worldTransform[4] = b10 * a01 + b11 * a11; worldTransform[5] = b10 * a02 + b11 * a12 + b12; - // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! - // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; - - this.vcount = PIXI.visibleCount; + // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! + // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); + this.worldAlpha = this.alpha * this.parent.worldAlpha; -} + this.vcount = PIXI.visibleCount; +}; PIXI.visibleCount = 0; \ No newline at end of file diff --git a/src/pixi/display/DisplayObjectContainer.js b/src/pixi/display/DisplayObjectContainer.js index eb95624..9f32a51 100644 --- a/src/pixi/display/DisplayObjectContainer.js +++ b/src/pixi/display/DisplayObjectContainer.js @@ -7,23 +7,23 @@ * A DisplayObjectContainer represents a collection of display objects. * It is the base class of all display objects that act as a container for other objects. * - * @class DisplayObjectContainer + * @class DisplayObjectContainer * @extends DisplayObject * @constructor */ PIXI.DisplayObjectContainer = function() { - PIXI.DisplayObject.call( this ); - - /** - * [read-only] The of children of this container. - * - * @property children - * @type Array - * @readOnly - */ - this.children = []; -} + PIXI.DisplayObject.call( this ); + + /** + * [read-only] The of children of this container. + * + * @property children + * @type Array + * @readOnly + */ + this.children = []; +}; // constructor PIXI.DisplayObjectContainer.prototype = Object.create( PIXI.DisplayObject.prototype ); @@ -37,85 +37,84 @@ PIXI.DisplayObjectContainer.prototype.constructor = PIXI.DisplayObjectContainer; */ PIXI.DisplayObjectContainer.prototype.addChild = function(child) { - if(child.parent != undefined) - { - - //// COULD BE THIS??? - child.parent.removeChild(child); - // return; - } + if(child.parent !== undefined) + { - child.parent = this; - - this.children.push(child); - - // update the stage refference.. - - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = this.stage; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } - - // LINKED LIST // - - // modify the list.. - var childFirst = child.first - var childLast = child.last; - var nextObject; - var previousObject; - - // this could be wrong if there is a filter?? - if(this._filters || this._mask) - { - previousObject = this.last._iPrev; - } - else - { - previousObject = this.last; - } + //// COULD BE THIS??? + child.parent.removeChild(child); + // return; + } - nextObject = previousObject._iNext; - - // always true in this case - // need to make sure the parents last is updated too - var updateLast = this; - var prevLast = previousObject; - - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = child.last; - } - updateLast = updateLast.parent; - } - - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } - - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; + child.parent = this; - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } - -} + this.children.push(child); + + // update the stage refference.. + + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = this.stage; + tmpChild = tmpChild._iNext; + } + while(tmpChild); + } + + // LINKED LIST // + + // modify the list.. + var childFirst = child.first; + var childLast = child.last; + var nextObject; + var previousObject; + + // this could be wrong if there is a filter?? + if(this._filters || this._mask) + { + previousObject = this.last._iPrev; + } + else + { + previousObject = this.last; + } + + nextObject = previousObject._iNext; + + // always true in this case + // need to make sure the parents last is updated too + var updateLast = this; + var prevLast = previousObject; + + while(updateLast) + { + if(updateLast.last === prevLast) + { + updateLast.last = child.last; + } + updateLast = updateLast.parent; + } + + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } + + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } +}; /** * Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown @@ -126,83 +125,84 @@ PIXI.DisplayObjectContainer.prototype.addChild = function(child) */ PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) { - if(index >= 0 && index <= this.children.length) - { - if(child.parent != undefined) - { - child.parent.removeChild(child); - } - child.parent = this; - - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = this.stage; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } - - // modify the list.. - var childFirst = child.first; - var childLast = child.last; - var nextObject; - var previousObject; - - if(index == this.children.length) - { - previousObject = this.last; - var updateLast = this; - var prevLast = this.last; - while(updateLast) - { - if(updateLast.last == prevLast) - { - updateLast.last = child.last; - } - updateLast = updateLast.parent; - } - } - else if(index == 0) - { - previousObject = this; - } - else - { - previousObject = this.children[index-1].last; - } - - nextObject = previousObject._iNext; - - // always true in this case - if(nextObject) - { - nextObject._iPrev = childLast; - childLast._iNext = nextObject; - } - - childFirst._iPrev = previousObject; - previousObject._iNext = childFirst; + if(index >= 0 && index <= this.children.length) + { + if(child.parent !== undefined) + { + child.parent.removeChild(child); + } - this.children.splice(index, 0, child); - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } - - } - else - { - throw new Error(child + " The index "+ index +" supplied is out of bounds " + this.children.length); - } -} + child.parent = this; + + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = this.stage; + tmpChild = tmpChild._iNext; + } + while(tmpChild); + } + + // modify the list.. + var childFirst = child.first; + var childLast = child.last; + var nextObject; + var previousObject; + + if(index === this.children.length) + { + previousObject = this.last; + var updateLast = this; + var prevLast = this.last; + while(updateLast) + { + if(updateLast.last === prevLast) + { + updateLast.last = child.last; + } + updateLast = updateLast.parent; + } + } + else if(index === 0) + { + previousObject = this; + } + else + { + previousObject = this.children[index-1].last; + } + + nextObject = previousObject._iNext; + + // always true in this case + if(nextObject) + { + nextObject._iPrev = childLast; + childLast._iNext = nextObject; + } + + childFirst._iPrev = previousObject; + previousObject._iNext = childFirst; + + this.children.splice(index, 0, child); + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } + + } + else + { + throw new Error(child + ' The index '+ index +' supplied is out of bounds ' + this.children.length); + } +}; /** * [NYI] Swaps the depth of 2 displayObjects @@ -214,31 +214,31 @@ PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) */ PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) { - if(child === child2) { - return; - } + if(child === child2) { + return; + } - var index1 = this.children.indexOf(child); - var index2 = this.children.indexOf(child2); - - if(index1 < 0 || index2 < 0) { - throw new Error("swapChildren: Both the supplied DisplayObjects must be a child of the caller."); - } + var index1 = this.children.indexOf(child); + var index2 = this.children.indexOf(child2); - this.removeChild(child); - this.removeChild(child2); - - if(index1 < index2) - { - this.addChildAt(child2, index1); - this.addChildAt(child, index2); - } - else - { - this.addChildAt(child, index2); - this.addChildAt(child2, index1); - } -} + if(index1 < 0 || index2 < 0) { + throw new Error('swapChildren: Both the supplied DisplayObjects must be a child of the caller.'); + } + + this.removeChild(child); + this.removeChild(child2); + + if(index1 < index2) + { + this.addChildAt(child2, index1); + this.addChildAt(child, index2); + } + else + { + this.addChildAt(child, index2); + this.addChildAt(child2, index1); + } +}; /** * Returns the Child at the specified index @@ -248,15 +248,15 @@ PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) */ PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) { - if(index >= 0 && index < this.children.length) - { - return this.children[index]; - } - else - { - throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); - } -} + if(index >= 0 && index < this.children.length) + { + return this.children[index]; + } + else + { + throw new Error('Both the supplied DisplayObjects must be a child of the caller ' + this); + } +}; /** * Removes a child from the container. @@ -266,66 +266,65 @@ PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) */ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { - var index = this.children.indexOf( child ); - if ( index !== -1 ) - { - // unlink // - // modify the list.. - var childFirst = child.first; - var childLast = child.last; - - var nextObject = childLast._iNext; - var previousObject = childFirst._iPrev; - - if(nextObject)nextObject._iPrev = previousObject; - previousObject._iNext = nextObject; - - if(this.last == childLast) - { + var index = this.children.indexOf( child ); + if ( index !== -1 ) + { + // unlink // + // modify the list.. + var childFirst = child.first; + var childLast = child.last; - var tempLast = childFirst._iPrev; - // need to make sure the parents last is updated too - var updateLast = this; - - while(updateLast.last == childLast) - { - updateLast.last = tempLast; - updateLast = updateLast.parent; - if(!updateLast)break; - - } - } - - childLast._iNext = null; - childFirst._iPrev = null; - - // update the stage reference.. - if(this.stage) - { - var tmpChild = child; - do - { - if(tmpChild.interactive)this.stage.dirty = true; - tmpChild.stage = null; - tmpChild = tmpChild._iNext; - } - while(tmpChild) - } - - // webGL trim - if(child.__renderGroup) - { - child.__renderGroup.removeDisplayObjectAndChildren(child); - } - - child.parent = undefined; - this.children.splice( index, 1 ); - } - else - { - throw new Error(child + " The supplied DisplayObject must be a child of the caller " + this); - } -} + var nextObject = childLast._iNext; + var previousObject = childFirst._iPrev; + + if(nextObject)nextObject._iPrev = previousObject; + previousObject._iNext = nextObject; + + if(this.last === childLast) + { + var tempLast = childFirst._iPrev; + // need to make sure the parents last is updated too + var updateLast = this; + + while(updateLast.last === childLast) + { + updateLast.last = tempLast; + updateLast = updateLast.parent; + if(!updateLast)break; + + } + } + + childLast._iNext = null; + childFirst._iPrev = null; + + // update the stage reference.. + if(this.stage) + { + var tmpChild = child; + do + { + if(tmpChild.interactive)this.stage.dirty = true; + tmpChild.stage = null; + tmpChild = tmpChild._iNext; + } + while(tmpChild); + } + + // webGL trim + if(child.__renderGroup) + { + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + child.parent = undefined; + this.children.splice( index, 1 ); + } + else + { + throw new Error(child + ' The supplied DisplayObject must be a child of the caller ' + this); + } +}; /* * Updates the container's children's transform for rendering @@ -335,12 +334,12 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) */ PIXI.DisplayObjectContainer.prototype.updateTransform = function() { - if(!this.visible)return; - - PIXI.DisplayObject.prototype.updateTransform.call( this ); - - for(var i=0,j=this.children.length; i 1)ratio = 1; + + if(ratio > 1) ratio = 1; perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); - num = this.texture.height/2//(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; + num = this.texture.height / 2; //(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; perp.x /= perpLength; perp.y /= perpLength; perp.x *= num; perp.y *= num; - verticies[index] = point.x + perp.x - verticies[index+1] = point.y + perp.y - verticies[index+2] = point.x - perp.x - verticies[index+3] = point.y - perp.y + verticies[index] = point.x + perp.x; + verticies[index+1] = point.y + perp.y; + verticies[index+2] = point.x - perp.x; + verticies[index+3] = point.y - perp.y; lastPoint = point; } PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); -} +}; PIXI.Rope.prototype.setTexture = function(texture) { // stop current texture this.texture = texture; this.updateFrame = true; -} - - - - +}; diff --git a/src/pixi/extras/Spine.js b/src/pixi/extras/Spine.js index 61a00c7..50db87d 100644 --- a/src/pixi/extras/Spine.js +++ b/src/pixi/extras/Spine.js @@ -1466,4 +1466,3 @@ PIXI.Spine.prototype.createSprite = function (slot, descriptor) { slot.sprites[descriptor.name] = sprite; return sprite; }; - diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index 68c9ea9..e7e18c5 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -45,7 +45,7 @@ PIXI.Strip = function(texture, width, height) this.verticies = new Float32Array() this.colors = new Float32Array() this.indices = new Uint16Array() -*/ + */ this.width = width; this.height = height; @@ -63,7 +63,7 @@ PIXI.Strip = function(texture, width, height) } this.renderable = true; -} +}; // constructor PIXI.Strip.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); @@ -79,11 +79,10 @@ PIXI.Strip.prototype.setTexture = function(texture) this.width = texture.frame.width; this.height = texture.frame.height; this.updateFrame = true; -} +}; -PIXI.Strip.prototype.onTextureUpdate = function(event) +PIXI.Strip.prototype.onTextureUpdate = function() { this.updateFrame = true; -} +}; // some helper functions.. - diff --git a/src/pixi/extras/TilingSprite.js b/src/pixi/extras/TilingSprite.js index d12fa24..821d7ca 100644 --- a/src/pixi/extras/TilingSprite.js +++ b/src/pixi/extras/TilingSprite.js @@ -58,8 +58,8 @@ PIXI.TilingSprite = function(texture, width, height) this.renderable = true; - this.blendMode = PIXI.blendModes.NORMAL -} + this.blendMode = PIXI.blendModes.NORMAL; +}; // constructor PIXI.TilingSprite.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); @@ -79,7 +79,7 @@ PIXI.TilingSprite.prototype.setTexture = function(texture) // stop current texture this.texture = texture; this.updateFrame = true; -} +}; /** * When the texture is updated, this event will fire to update the frame @@ -88,8 +88,7 @@ PIXI.TilingSprite.prototype.setTexture = function(texture) * @param event * @private */ -PIXI.TilingSprite.prototype.onTextureUpdate = function(event) +PIXI.TilingSprite.prototype.onTextureUpdate = function() { this.updateFrame = true; -} - +}; diff --git a/src/pixi/filters/AbstractFilter.js b/src/pixi/filters/AbstractFilter.js index 4e40c65..43665de 100644 --- a/src/pixi/filters/AbstractFilter.js +++ b/src/pixi/filters/AbstractFilter.js @@ -2,36 +2,34 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** * This is the base class for creating a pixi.js filter. Currently only webGL supports filters. * If you want to make a custom filter this should be your base class. * @class AbstractFilter * @constructor * @param fragmentSrc - * @param uniforms + * @param uniforms */ PIXI.AbstractFilter = function(fragmentSrc, uniforms) { - /** - * An array of passes - some filters contain a few steps this array simply stores the steps in a liniear fashion. - * For example the blur filter has two passes blurX and blurY. - * @property passes - * @type Array an array of filter objects - * @private - */ - this.passes = [this]; + /** + * An array of passes - some filters contain a few steps this array simply stores the steps in a liniear fashion. + * For example the blur filter has two passes blurX and blurY. + * @property passes + * @type Array an array of filter objects + * @private + */ + this.passes = [this]; - this.dirty = true; - this.padding = 0; + this.dirty = true; + this.padding = 0; - /** - @property uniforms - @private - */ - this.uniforms = uniforms || {}; - - this.fragmentSrc = fragmentSrc || []; -} + /** + @property uniforms + @private + */ + this.uniforms = uniforms || {}; + this.fragmentSrc = fragmentSrc || []; +}; diff --git a/src/pixi/filters/BlurFilter.js b/src/pixi/filters/BlurFilter.js index 43caa0c..5f89bff 100644 --- a/src/pixi/filters/BlurFilter.js +++ b/src/pixi/filters/BlurFilter.js @@ -2,10 +2,9 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** - * - * The BlurFilter applies a Gaussian blur to an object. + * + * The BlurFilter applies a Gaussian blur to an object. * The strength of the blur can be set for x- and y-axis separately (always relative to the stage). * * @class BlurFilter @@ -13,13 +12,11 @@ */ PIXI.BlurFilter = function() { - - this.blurXFilter = new PIXI.BlurXFilter(); - this.blurYFilter = new PIXI.BlurYFilter(); + this.blurXFilter = new PIXI.BlurXFilter(); + this.blurYFilter = new PIXI.BlurYFilter(); - this.passes =[this.blurXFilter, this.blurYFilter]; - -} + this.passes =[this.blurXFilter, this.blurYFilter]; +}; /** * Sets the strength of both the blurX and blurY properties simultaneously @@ -33,7 +30,7 @@ Object.defineProperty(PIXI.BlurFilter.prototype, 'blur', { return this.blurXFilter.blur; }, set: function(value) { - this.blurXFilter.blur = this.blurYFilter.blur = value; + this.blurXFilter.blur = this.blurYFilter.blur = value; } }); @@ -49,7 +46,7 @@ Object.defineProperty(PIXI.BlurFilter.prototype, 'blurX', { return this.blurXFilter.blur; }, set: function(value) { - this.blurXFilter.blur = value; + this.blurXFilter.blur = value; } }); @@ -65,6 +62,6 @@ Object.defineProperty(PIXI.BlurFilter.prototype, 'blurY', { return this.blurYFilter.blur; }, set: function(value) { - this.blurYFilter.blur = value; + this.blurYFilter.blur = value; } }); diff --git a/src/pixi/filters/BlurXFilter.js b/src/pixi/filters/BlurXFilter.js index 38a99b4..6e7be33 100644 --- a/src/pixi/filters/BlurXFilter.js +++ b/src/pixi/filters/BlurXFilter.js @@ -2,55 +2,52 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - - PIXI.BlurXFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - blur: {type: '1f', value: 1/512}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float blur;", - "uniform sampler2D uSampler;", - "void main(void) {", - "vec4 sum = vec4(0.0);", + PIXI.AbstractFilter.call( this ); - "sum += texture2D(uSampler, vec2(vTextureCoord.x - 4.0*blur, vTextureCoord.y)) * 0.05;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x - 3.0*blur, vTextureCoord.y)) * 0.09;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x - 2.0*blur, vTextureCoord.y)) * 0.12;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x - blur, vTextureCoord.y)) * 0.15;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x + blur, vTextureCoord.y)) * 0.15;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x + 2.0*blur, vTextureCoord.y)) * 0.12;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x + 3.0*blur, vTextureCoord.y)) * 0.09;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x + 4.0*blur, vTextureCoord.y)) * 0.05;", - - "gl_FragColor = sum;", + this.passes = [this]; - "}" - ]; -} + // set the uniforms + this.uniforms = { + blur: {type: '1f', value: 1/512}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float blur;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' vec4 sum = vec4(0.0);', + + ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 4.0*blur, vTextureCoord.y)) * 0.05;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 3.0*blur, vTextureCoord.y)) * 0.09;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 2.0*blur, vTextureCoord.y)) * 0.12;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x - blur, vTextureCoord.y)) * 0.15;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x + blur, vTextureCoord.y)) * 0.15;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 2.0*blur, vTextureCoord.y)) * 0.12;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 3.0*blur, vTextureCoord.y)) * 0.09;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 4.0*blur, vTextureCoord.y)) * 0.05;', + + ' gl_FragColor = sum;', + '}' + ]; +}; PIXI.BlurXFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.BlurXFilter.prototype.constructor = PIXI.BlurXFilter; - Object.defineProperty(PIXI.BlurXFilter.prototype, 'blur', { get: function() { return this.uniforms.blur.value / (1/7000); }, set: function(value) { - - this.dirty = true; - this.uniforms.blur.value = (1/7000) * value; + + this.dirty = true; + this.uniforms.blur.value = (1/7000) * value; } }); diff --git a/src/pixi/filters/BlurYFilter.js b/src/pixi/filters/BlurYFilter.js index d472f79..99829fb 100644 --- a/src/pixi/filters/BlurYFilter.js +++ b/src/pixi/filters/BlurYFilter.js @@ -2,43 +2,41 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - - PIXI.BlurYFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - blur: {type: '1f', value: 1/512}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float blur;", - "uniform sampler2D uSampler;", - "void main(void) {", - "vec4 sum = vec4(0.0);", + PIXI.AbstractFilter.call( this ); - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 4.0*blur)) * 0.05;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 3.0*blur)) * 0.09;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 2.0*blur)) * 0.12;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - blur)) * 0.15;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + blur)) * 0.15;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 2.0*blur)) * 0.12;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 3.0*blur)) * 0.09;", - "sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 4.0*blur)) * 0.05;", - - "gl_FragColor = sum;", + this.passes = [this]; - "}" - ]; -} + // set the uniforms + this.uniforms = { + blur: {type: '1f', value: 1/512}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float blur;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' vec4 sum = vec4(0.0);', + + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 4.0*blur)) * 0.05;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 3.0*blur)) * 0.09;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 2.0*blur)) * 0.12;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - blur)) * 0.15;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + blur)) * 0.15;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 2.0*blur)) * 0.12;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 3.0*blur)) * 0.09;', + ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 4.0*blur)) * 0.05;', + + ' gl_FragColor = sum;', + '}' + ]; +}; PIXI.BlurYFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.BlurYFilter.prototype.constructor = PIXI.BlurYFilter; @@ -48,7 +46,7 @@ Object.defineProperty(PIXI.BlurYFilter.prototype, 'blur', { return this.uniforms.blur.value / (1/7000); }, set: function(value) { - //this.padding = value; - this.uniforms.blur.value = (1/7000) * value; + //this.padding = value; + this.uniforms.blur.value = (1/7000) * value; } }); diff --git a/src/pixi/filters/ColorMatrixFilter.js b/src/pixi/filters/ColorMatrixFilter.js index 1386f8b..122b6fb 100644 --- a/src/pixi/filters/ColorMatrixFilter.js +++ b/src/pixi/filters/ColorMatrixFilter.js @@ -3,41 +3,41 @@ */ /** - * - * The ColorMatrixFilter class lets you apply a 4x4 matrix transformation on the RGBA - * color and alpha values of every pixel on your displayObject to produce a result + * + * The ColorMatrixFilter class lets you apply a 4x4 matrix transformation on the RGBA + * color and alpha values of every pixel on your displayObject to produce a result * with a new set of RGBA color and alpha values. Its pretty powerful! * @class ColorMatrixFilter * @contructor */ PIXI.ColorMatrixFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - matrix: {type: 'mat4', value: [1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1]}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float invert;", - "uniform mat4 matrix;", - "uniform sampler2D uSampler;", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vTextureCoord) * matrix;", - "gl_FragColor = gl_FragColor * vColor;", - "}" - ]; - -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + matrix: {type: 'mat4', value: [1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1]}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float invert;', + 'uniform mat4 matrix;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vTextureCoord) * matrix;', + ' gl_FragColor = gl_FragColor * vColor;', + '}' + ]; +}; PIXI.ColorMatrixFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.ColorMatrixFilter.prototype.constructor = PIXI.ColorMatrixFilter; @@ -54,6 +54,6 @@ Object.defineProperty(PIXI.ColorMatrixFilter.prototype, 'matrix', { return this.uniforms.matrix.value; }, set: function(value) { - this.uniforms.matrix.value = value; + this.uniforms.matrix.value = value; } }); \ No newline at end of file diff --git a/src/pixi/filters/ColorStepFilter.js b/src/pixi/filters/ColorStepFilter.js index 8039af8..c83c887 100644 --- a/src/pixi/filters/ColorStepFilter.js +++ b/src/pixi/filters/ColorStepFilter.js @@ -2,37 +2,37 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** - * + * * This turns your displayObjects to black and white. * @class ColorStepFilter * @contructor */ PIXI.ColorStepFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - step: {type: '1f', value: 5}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform sampler2D uSampler;", - "uniform float step;", - "void main(void) {", - "vec4 color = texture2D(uSampler, vTextureCoord);", - "color = floor(color * step) / step;", - "gl_FragColor = color * vColor;", - "}" - ]; -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + step: {type: '1f', value: 5}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform sampler2D uSampler;', + 'uniform float step;', + + 'void main(void) {', + ' vec4 color = texture2D(uSampler, vTextureCoord);', + ' color = floor(color * step) / step;', + ' gl_FragColor = color * vColor;', + '}' + ]; +}; PIXI.ColorStepFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.ColorStepFilter.prototype.constructor = PIXI.ColorStepFilter; @@ -46,6 +46,6 @@ Object.defineProperty(PIXI.ColorStepFilter.prototype, 'step', { return this.uniforms.step.value; }, set: function(value) { - this.uniforms.step.value = value; + this.uniforms.step.value = value; } }); diff --git a/src/pixi/filters/CrossHatchFilter.js b/src/pixi/filters/CrossHatchFilter.js index 2d26715..43f3c26 100644 --- a/src/pixi/filters/CrossHatchFilter.js +++ b/src/pixi/filters/CrossHatchFilter.js @@ -2,58 +2,55 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - - PIXI.CrossHatchFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - blur: {type: '1f', value: 1/512}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float blur;", - "uniform sampler2D uSampler;", - "void main(void) {", - - - " float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);", - " ", - " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);", - " ", - " if (lum < 1.00) {", - " if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {", - " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);", - " }", - " }", - " ", - " if (lum < 0.75) {", - " if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {", - " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);", - " }", - " }", - " ", - " if (lum < 0.50) {", - " if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {", - " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);", - " }", - " }", - " ", - " if (lum < 0.3) {", - " if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {", - " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);", - " }", - " }", - "}" - ]; -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + blur: {type: '1f', value: 1 / 512}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float blur;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);', + + ' gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);', + + ' if (lum < 1.00) {', + ' if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {', + ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', + ' }', + ' }', + + ' if (lum < 0.75) {', + ' if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {', + ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', + ' }', + ' }', + + ' if (lum < 0.50) {', + ' if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {', + ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', + ' }', + ' }', + + ' if (lum < 0.3) {', + ' if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {', + ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', + ' }', + ' }', + '}' + ]; +}; PIXI.CrossHatchFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.CrossHatchFilter.prototype.constructor = PIXI.BlurYFilter; @@ -63,7 +60,7 @@ Object.defineProperty(PIXI.CrossHatchFilter.prototype, 'blur', { return this.uniforms.blur.value / (1/7000); }, set: function(value) { - //this.padding = value; - this.uniforms.blur.value = (1/7000) * value; + //this.padding = value; + this.uniforms.blur.value = (1/7000) * value; } }); diff --git a/src/pixi/filters/DisplacementFilter.js b/src/pixi/filters/DisplacementFilter.js index 5662731..40af870 100644 --- a/src/pixi/filters/DisplacementFilter.js +++ b/src/pixi/filters/DisplacementFilter.js @@ -2,10 +2,9 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** - * - * The DisplacementFilter class uses the pixel values from the specified texture (called the displacement map) to perform a displacement of an object. + * + * The DisplacementFilter class uses the pixel values from the specified texture (called the displacement map) to perform a displacement of an object. * You can use this filter to apply all manor of crazy warping effects * Currently the r property of the texture is used offset the x and the g propery of the texture is used to offset the y. * @class DisplacementFilter @@ -14,80 +13,75 @@ */ PIXI.DisplacementFilter = function(texture) { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - texture.baseTexture._powerOf2 = true; + PIXI.AbstractFilter.call( this ); - // set the uniforms - //console.log() - this.uniforms = { - displacementMap: {type: 'sampler2D', value:texture}, - scale: {type: '2f', value:{x:30, y:30}}, - offset: {type: '2f', value:{x:0, y:0}}, - mapDimensions: {type: '2f', value:{x:1, y:5112}}, - dimensions: {type: '4fv', value:[0,0,0,0]} - }; - + this.passes = [this]; + texture.baseTexture._powerOf2 = true; - if(texture.baseTexture.hasLoaded) - { - this.uniforms.mapDimensions.value.x = texture.width; - this.uniforms.mapDimensions.value.y = texture.height; - } - else - { - this.boundLoadedFunction = this.onTextureLoaded.bind(this); + // set the uniforms + //console.log() + this.uniforms = { + displacementMap: {type: 'sampler2D', value:texture}, + scale: {type: '2f', value:{x:30, y:30}}, + offset: {type: '2f', value:{x:0, y:0}}, + mapDimensions: {type: '2f', value:{x:1, y:5112}}, + dimensions: {type: '4fv', value:[0,0,0,0]} + }; - texture.baseTexture.on("loaded", this.boundLoadedFunction); - } + if(texture.baseTexture.hasLoaded) + { + this.uniforms.mapDimensions.value.x = texture.width; + this.uniforms.mapDimensions.value.y = texture.height; + } + else + { + this.boundLoadedFunction = this.onTextureLoaded.bind(this); - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform sampler2D displacementMap;", - "uniform sampler2D uSampler;", - "uniform vec2 scale;", - "uniform vec2 offset;", - "uniform vec4 dimensions;", - "uniform vec2 mapDimensions;",// = vec2(256.0, 256.0);", - // "const vec2 textureDimensions = vec2(750.0, 750.0);", - - "void main(void) {", - "vec2 mapCords = vTextureCoord.xy;", -// "mapCords -= ;", - "mapCords += (dimensions.zw + offset)/ dimensions.xy ;", - "mapCords.y *= -1.0;", - "mapCords.y += 1.0;", - "vec2 matSample = texture2D(displacementMap, mapCords).xy;", - "matSample -= 0.5;", - "matSample *= scale;", - "matSample /= mapDimensions;", - "gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + matSample.x, vTextureCoord.y + matSample.y));", - "gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb, 1.0);", - "vec2 cord = vTextureCoord;", - - //"gl_FragColor = texture2D(displacementMap, cord);", - "gl_FragColor = gl_FragColor * vColor;", - - "}" - ]; - -} + texture.baseTexture.on('loaded', this.boundLoadedFunction); + } + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform sampler2D displacementMap;', + 'uniform sampler2D uSampler;', + 'uniform vec2 scale;', + 'uniform vec2 offset;', + 'uniform vec4 dimensions;', + 'uniform vec2 mapDimensions;',// = vec2(256.0, 256.0);', + // 'const vec2 textureDimensions = vec2(750.0, 750.0);', + + 'void main(void) {', + ' vec2 mapCords = vTextureCoord.xy;', + //' mapCords -= ;', + ' mapCords += (dimensions.zw + offset)/ dimensions.xy ;', + ' mapCords.y *= -1.0;', + ' mapCords.y += 1.0;', + ' vec2 matSample = texture2D(displacementMap, mapCords).xy;', + ' matSample -= 0.5;', + ' matSample *= scale;', + ' matSample /= mapDimensions;', + ' gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + matSample.x, vTextureCoord.y + matSample.y));', + ' gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb, 1.0);', + ' vec2 cord = vTextureCoord;', + + //' gl_FragColor = texture2D(displacementMap, cord);', + ' gl_FragColor = gl_FragColor * vColor;', + '}' + ]; +}; PIXI.DisplacementFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.DisplacementFilter.prototype.constructor = PIXI.DisplacementFilter; PIXI.DisplacementFilter.prototype.onTextureLoaded = function() { - - this.uniforms.mapDimensions.value.x = this.uniforms.displacementMap.value.width; - this.uniforms.mapDimensions.value.y = this.uniforms.displacementMap.value.height; + this.uniforms.mapDimensions.value.x = this.uniforms.displacementMap.value.width; + this.uniforms.mapDimensions.value.y = this.uniforms.displacementMap.value.height; - this.uniforms.displacementMap.value.baseTexture.off("loaded", this.boundLoadedFunction) - -} + this.uniforms.displacementMap.value.baseTexture.off('loaded', this.boundLoadedFunction); +}; /** * The texture used for the displacemtent map * must be power of 2 texture at the moment @@ -100,7 +94,7 @@ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'map', { return this.uniforms.displacementMap.value; }, set: function(value) { - this.uniforms.displacementMap.value = value; + this.uniforms.displacementMap.value = value; } }); @@ -115,7 +109,7 @@ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'scale', { return this.uniforms.scale.value; }, set: function(value) { - this.uniforms.scale.value = value; + this.uniforms.scale.value = value; } }); @@ -130,6 +124,6 @@ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'offset', { return this.uniforms.offset.value; }, set: function(value) { - this.uniforms.offset.value = value; + this.uniforms.offset.value = value; } -}); \ No newline at end of file +}); diff --git a/src/pixi/filters/DotScreenFilter.js b/src/pixi/filters/DotScreenFilter.js index 6c59d4c..de00f77 100644 --- a/src/pixi/filters/DotScreenFilter.js +++ b/src/pixi/filters/DotScreenFilter.js @@ -5,50 +5,50 @@ /** * - * This filter applies a pixlate effect making display objects appear "blocky" + * This filter applies a pixlate effect making display objects appear 'blocky' * @class PixelateFilter * @contructor */ PIXI.DotScreenFilter = function() { - PIXI.AbstractFilter.call( this ); + PIXI.AbstractFilter.call( this ); - this.passes = [this]; - - // set the uniforms - this.uniforms = { - scale: {type: '1f', value:1}, - angle: {type: '1f', value:5}, - dimensions: {type: '4fv', value:[0,0,0,0]} - }; + this.passes = [this]; + + // set the uniforms + this.uniforms = { + scale: {type: '1f', value:1}, + angle: {type: '1f', value:5}, + dimensions: {type: '4fv', value:[0,0,0,0]} + }; - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform vec4 dimensions;", - "uniform sampler2D uSampler;", + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform vec4 dimensions;', + 'uniform sampler2D uSampler;', - "uniform float angle;", - "uniform float scale;", + 'uniform float angle;', + 'uniform float scale;', - "float pattern() {", - "float s = sin(angle), c = cos(angle);", - "vec2 tex = vTextureCoord * dimensions.xy;", - "vec2 point = vec2(", - "c * tex.x - s * tex.y,", - "s * tex.x + c * tex.y", - ") * scale;", - "return (sin(point.x) * sin(point.y)) * 4.0;", - "}", + 'float pattern() {', + ' float s = sin(angle), c = cos(angle);', + ' vec2 tex = vTextureCoord * dimensions.xy;', + ' vec2 point = vec2(', + ' c * tex.x - s * tex.y,', + ' s * tex.x + c * tex.y', + ' ) * scale;', + ' return (sin(point.x) * sin(point.y)) * 4.0;', + '}', - "void main() {", - "vec4 color = texture2D(uSampler, vTextureCoord);", - "float average = (color.r + color.g + color.b) / 3.0;", - "gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);", - "}", - ]; -} + 'void main() {', + ' vec4 color = texture2D(uSampler, vTextureCoord);', + ' float average = (color.r + color.g + color.b) / 3.0;', + ' gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);', + '}' + ]; +}; PIXI.DotScreenFilter.prototype = Object.create( PIXI.DotScreenFilter.prototype ); PIXI.DotScreenFilter.prototype.constructor = PIXI.DotScreenFilter; @@ -64,8 +64,8 @@ Object.defineProperty(PIXI.DotScreenFilter.prototype, 'scale', { return this.uniforms.scale.value; }, set: function(value) { - this.dirty = true; - this.uniforms.scale.value = value; + this.dirty = true; + this.uniforms.scale.value = value; } }); @@ -80,7 +80,7 @@ Object.defineProperty(PIXI.DotScreenFilter.prototype, 'angle', { return this.uniforms.angle.value; }, set: function(value) { - this.dirty = true; - this.uniforms.angle.value = value; + this.dirty = true; + this.uniforms.angle.value = value; } }); \ No newline at end of file diff --git a/src/pixi/filters/FilterBlock.js b/src/pixi/filters/FilterBlock.js index 53e02b9..3b6ab52 100644 --- a/src/pixi/filters/FilterBlock.js +++ b/src/pixi/filters/FilterBlock.js @@ -8,6 +8,4 @@ PIXI.FilterBlock = function() { this.visible = true; this.renderable = true; -} - ->>>>>>> 67d0c577d3163e527043f6973a4b3a31131cab08 +}; diff --git a/src/pixi/filters/GrayFilter.js b/src/pixi/filters/GrayFilter.js index 9b6bb61..5065834 100644 --- a/src/pixi/filters/GrayFilter.js +++ b/src/pixi/filters/GrayFilter.js @@ -2,37 +2,37 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** - * + * * This turns your displayObjects to black and white. * @class GrayFilter * @contructor */ PIXI.GrayFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - gray: {type: '1f', value: 1}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform sampler2D uSampler;", - "uniform float gray;", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vTextureCoord);", - "gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);", - "gl_FragColor = gl_FragColor * vColor;", - "}" - ]; -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + gray: {type: '1f', value: 1}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform sampler2D uSampler;', + 'uniform float gray;', + + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vTextureCoord);', + ' gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor.b), gray);', + ' gl_FragColor = gl_FragColor * vColor;', + '}' + ]; +}; PIXI.GrayFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.GrayFilter.prototype.constructor = PIXI.GrayFilter; @@ -46,6 +46,6 @@ Object.defineProperty(PIXI.GrayFilter.prototype, 'gray', { return this.uniforms.gray.value; }, set: function(value) { - this.uniforms.gray.value = value; + this.uniforms.gray.value = value; } }); diff --git a/src/pixi/filters/InvertFilter.js b/src/pixi/filters/InvertFilter.js index afd196e..ac4393f 100644 --- a/src/pixi/filters/InvertFilter.js +++ b/src/pixi/filters/InvertFilter.js @@ -3,37 +3,37 @@ */ /** - * + * * This inverts your displayObjects colors. * @class InvertFilter * @contructor */ PIXI.InvertFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - invert: {type: '1f', value: 1}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float invert;", - "uniform sampler2D uSampler;", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vTextureCoord);", - "gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert);", - //"gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;", - "gl_FragColor = gl_FragColor * vColor;", - "}" - ]; - -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + invert: {type: '1f', value: 1}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float invert;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vTextureCoord);', + ' gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert);', + //' gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;', + ' gl_FragColor = gl_FragColor * vColor;', + '}' + ]; +}; PIXI.InvertFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.InvertFilter.prototype.constructor = PIXI.InvertFilter; @@ -47,6 +47,6 @@ Object.defineProperty(PIXI.InvertFilter.prototype, 'invert', { return this.uniforms.invert.value; }, set: function(value) { - this.uniforms.invert.value = value; + this.uniforms.invert.value = value; } -}); \ No newline at end of file +}); diff --git a/src/pixi/filters/PixelateFilter.js b/src/pixi/filters/PixelateFilter.js index d268015..e4320eb 100644 --- a/src/pixi/filters/PixelateFilter.js +++ b/src/pixi/filters/PixelateFilter.js @@ -3,50 +3,49 @@ */ /** - * - * This filter applies a pixlate effect making display objects appear "blocky" + * + * This filter applies a pixlate effect making display objects appear 'blocky' * @class PixelateFilter * @contructor */ PIXI.PixelateFilter = function() { - PIXI.AbstractFilter.call( this ); + PIXI.AbstractFilter.call( this ); - this.passes = [this]; - - // set the uniforms - this.uniforms = { - invert: {type: '1f', value: 0}, - dimensions: {type: '4fv', value:new Float32Array([10000, 100, 10, 10])}, - pixelSize: {type: '2f', value:{x:10, y:10}}, - }; + this.passes = [this]; - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform vec2 testDim;", - "uniform vec4 dimensions;", - "uniform vec2 pixelSize;", - "uniform sampler2D uSampler;", - "void main(void) {", - "vec2 coord = vTextureCoord;", + // set the uniforms + this.uniforms = { + invert: {type: '1f', value: 0}, + dimensions: {type: '4fv', value:new Float32Array([10000, 100, 10, 10])}, + pixelSize: {type: '2f', value:{x:10, y:10}}, + }; - "vec2 size = dimensions.xy/pixelSize;", + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform vec2 testDim;', + 'uniform vec4 dimensions;', + 'uniform vec2 pixelSize;', + 'uniform sampler2D uSampler;', - "vec2 color = floor( ( vTextureCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5;", - "gl_FragColor = texture2D(uSampler, color);", - "}" - ]; - + 'void main(void) {', + ' vec2 coord = vTextureCoord;', -} + ' vec2 size = dimensions.xy/pixelSize;', + + ' vec2 color = floor( ( vTextureCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5;', + ' gl_FragColor = texture2D(uSampler, color);', + '}' + ]; +}; PIXI.PixelateFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.PixelateFilter.prototype.constructor = PIXI.PixelateFilter; /** - * + * * This a point that describes the size of the blocs. x is the width of the block and y is the the height * @property size * @type Point @@ -56,7 +55,7 @@ Object.defineProperty(PIXI.PixelateFilter.prototype, 'size', { return this.uniforms.pixelSize.value; }, set: function(value) { - this.dirty = true; - this.uniforms.pixelSize.value = value; + this.dirty = true; + this.uniforms.pixelSize.value = value; } -}); \ No newline at end of file +}); diff --git a/src/pixi/filters/RGBSplitFilter.js b/src/pixi/filters/RGBSplitFilter.js index 35a837e..81439dd 100644 --- a/src/pixi/filters/RGBSplitFilter.js +++ b/src/pixi/filters/RGBSplitFilter.js @@ -2,39 +2,38 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - - PIXI.RGBSplitFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - red: {type: '2f', value: {x:20, y:20}}, - green: {type: '2f', value: {x:-20, y:20}}, - blue: {type: '2f', value: {x:20, y:-20}}, - dimensions: {type: '4fv', value:[0,0,0,0]} - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform vec2 red;", - "uniform vec2 green;", - "uniform vec2 blue;", - "uniform vec4 dimensions;", - "uniform sampler2D uSampler;", - "void main(void) {", - "gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/dimensions.xy).r;", - "gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/dimensions.xy).g;", - "gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/dimensions.xy).b;", - "gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;", - "}" - ]; -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + red: {type: '2f', value: {x:20, y:20}}, + green: {type: '2f', value: {x:-20, y:20}}, + blue: {type: '2f', value: {x:20, y:-20}}, + dimensions: {type: '4fv', value:[0,0,0,0]} + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform vec2 red;', + 'uniform vec2 green;', + 'uniform vec2 blue;', + 'uniform vec4 dimensions;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/dimensions.xy).r;', + ' gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/dimensions.xy).g;', + ' gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/dimensions.xy).b;', + ' gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;', + '}' + ]; +}; PIXI.RGBSplitFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.RGBSplitFilter.prototype.constructor = PIXI.RGBSplitFilter; @@ -44,7 +43,7 @@ Object.defineProperty(PIXI.RGBSplitFilter.prototype, 'angle', { return this.uniforms.blur.value / (1/7000); }, set: function(value) { - //this.padding = value; - this.uniforms.blur.value = (1/7000) * value; + //this.padding = value; + this.uniforms.blur.value = (1/7000) * value; } }); diff --git a/src/pixi/filters/SepiaFilter.js b/src/pixi/filters/SepiaFilter.js index 22f31a4..f114d76 100644 --- a/src/pixi/filters/SepiaFilter.js +++ b/src/pixi/filters/SepiaFilter.js @@ -1,42 +1,40 @@ -/** /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** - * + * * This applies a sepia effect to your displayObjects. * @class SepiaFilter * @contructor */ PIXI.SepiaFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - sepia: {type: '1f', value: 1}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float sepia;", - "uniform sampler2D uSampler;", - - "const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912);", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vTextureCoord);", - "gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia);", - "gl_FragColor = gl_FragColor * vColor;", - "}" - ]; - -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + sepia: {type: '1f', value: 1}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float sepia;', + 'uniform sampler2D uSampler;', + + 'const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912);', + + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vTextureCoord);', + ' gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia);', + ' gl_FragColor = gl_FragColor * vColor;', + '}' + ]; +}; PIXI.SepiaFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.SepiaFilter.prototype.constructor = PIXI.SepiaFilter; @@ -50,6 +48,6 @@ Object.defineProperty(PIXI.SepiaFilter.prototype, 'sepia', { return this.uniforms.sepia.value; }, set: function(value) { - this.uniforms.sepia.value = value; + this.uniforms.sepia.value = value; } }); diff --git a/src/pixi/filters/SmartBlurFilter.js b/src/pixi/filters/SmartBlurFilter.js index 93567e8..1140a56 100644 --- a/src/pixi/filters/SmartBlurFilter.js +++ b/src/pixi/filters/SmartBlurFilter.js @@ -2,54 +2,51 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - - PIXI.SmartBlurFilter = function() { - PIXI.AbstractFilter.call( this ); - - this.passes = [this]; - - // set the uniforms - this.uniforms = { - blur: {type: '1f', value: 1/512}, - }; - - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "uniform sampler2D uSampler;", - // "uniform vec2 delta;", - "const vec2 delta = vec2(1.0/10.0, 0.0);", - // "uniform float darkness;", - - "float random(vec3 scale, float seed) {", - "return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);", - "}", - - - "void main(void) {", - - "vec4 color = vec4(0.0);", - "float total = 0.0;", - - "float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);", - - "for (float t = -30.0; t <= 30.0; t++) {", - "float percent = (t + offset - 0.5) / 30.0;", - "float weight = 1.0 - abs(percent);", - "vec4 sample = texture2D(uSampler, vTextureCoord + delta * percent);", - "sample.rgb *= sample.a;", - "color += sample * weight;", - "total += weight;", - "}", - - "gl_FragColor = color / total;", - "gl_FragColor.rgb /= gl_FragColor.a + 0.00001;", - // "gl_FragColor.rgb *= darkness;", - "}" - ]; -} + PIXI.AbstractFilter.call( this ); + + this.passes = [this]; + + // set the uniforms + this.uniforms = { + blur: {type: '1f', value: 1/512}, + }; + + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'uniform sampler2D uSampler;', + //'uniform vec2 delta;', + 'const vec2 delta = vec2(1.0/10.0, 0.0);', + //'uniform float darkness;', + + 'float random(vec3 scale, float seed) {', + ' return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);', + '}', + + + 'void main(void) {', + ' vec4 color = vec4(0.0);', + ' float total = 0.0;', + + ' float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);', + + ' for (float t = -30.0; t <= 30.0; t++) {', + ' float percent = (t + offset - 0.5) / 30.0;', + ' float weight = 1.0 - abs(percent);', + ' vec4 sample = texture2D(uSampler, vTextureCoord + delta * percent);', + ' sample.rgb *= sample.a;', + ' color += sample * weight;', + ' total += weight;', + ' }', + + ' gl_FragColor = color / total;', + ' gl_FragColor.rgb /= gl_FragColor.a + 0.00001;', + //' gl_FragColor.rgb *= darkness;', + '}' + ]; +}; PIXI.SmartBlurFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.SmartBlurFilter.prototype.constructor = PIXI.SmartBlurFilter; @@ -59,6 +56,6 @@ Object.defineProperty(PIXI.SmartBlurFilter.prototype, 'blur', { return this.uniforms.blur.value; }, set: function(value) { - this.uniforms.blur.value = value; + this.uniforms.blur.value = value; } }); diff --git a/src/pixi/filters/TwistFilter.js b/src/pixi/filters/TwistFilter.js index 0dce008..c529dd7 100644 --- a/src/pixi/filters/TwistFilter.js +++ b/src/pixi/filters/TwistFilter.js @@ -3,59 +3,57 @@ */ /** - * - * This filter applies a pixlate effect making display objects appear "blocky" + * + * This filter applies a pixlate effect making display objects appear 'blocky' * @class PixelateFilter * @contructor */ PIXI.TwistFilter = function() { - PIXI.AbstractFilter.call( this ); + PIXI.AbstractFilter.call( this ); - this.passes = [this]; - - // set the uniforms - this.uniforms = { - radius: {type: '1f', value:0.5}, - angle: {type: '1f', value:5}, - offset: {type: '2f', value:{x:0.5, y:0.5}}, - }; + this.passes = [this]; - this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform vec4 dimensions;", - "uniform sampler2D uSampler;", - - "uniform float radius;", - "uniform float angle;", - "uniform vec2 offset;", + // set the uniforms + this.uniforms = { + radius: {type: '1f', value:0.5}, + angle: {type: '1f', value:5}, + offset: {type: '2f', value:{x:0.5, y:0.5}}, + }; - "void main(void) {", - "vec2 coord = vTextureCoord - offset;", - "float distance = length(coord);", - - "if (distance < radius){", + this.fragmentSrc = [ + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform vec4 dimensions;', + 'uniform sampler2D uSampler;', - "float ratio = (radius - distance) / radius;", - "float angleMod = ratio * ratio * angle;", - "float s = sin(angleMod);", - "float c = cos(angleMod);", - "coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);", + 'uniform float radius;', + 'uniform float angle;', + 'uniform vec2 offset;', - "}", + 'void main(void) {', + ' vec2 coord = vTextureCoord - offset;', + ' float distance = length(coord);', - "gl_FragColor = texture2D(uSampler, coord+offset);", - "}" - ]; -} + ' if (distance < radius) {', + ' float ratio = (radius - distance) / radius;', + ' float angleMod = ratio * ratio * angle;', + ' float s = sin(angleMod);', + ' float c = cos(angleMod);', + ' coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);', + ' }', + + ' gl_FragColor = texture2D(uSampler, coord+offset);', + '}' + ]; +}; PIXI.TwistFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.TwistFilter.prototype.constructor = PIXI.TwistFilter; /** - * + * * This point describes the the offset of the twist * @property size * @type Point @@ -65,13 +63,13 @@ Object.defineProperty(PIXI.TwistFilter.prototype, 'offset', { return this.uniforms.offset.value; }, set: function(value) { - this.dirty = true; - this.uniforms.offset.value = value; + this.dirty = true; + this.uniforms.offset.value = value; } }); /** - * + * * This radius describes size of the twist * @property size * @type Number @@ -81,13 +79,13 @@ Object.defineProperty(PIXI.TwistFilter.prototype, 'radius', { return this.uniforms.radius.value; }, set: function(value) { - this.dirty = true; - this.uniforms.radius.value = value; + this.dirty = true; + this.uniforms.radius.value = value; } }); /** - * + * * This radius describes angle of the twist * @property angle * @type Number @@ -97,7 +95,7 @@ Object.defineProperty(PIXI.TwistFilter.prototype, 'angle', { return this.uniforms.angle.value; }, set: function(value) { - this.dirty = true; - this.uniforms.angle.value = value; + this.dirty = true; + this.uniforms.angle.value = value; } }); \ No newline at end of file diff --git a/src/pixi/loaders/AssetLoader.js b/src/pixi/loaders/AssetLoader.js index 6d65073..419aa5a 100644 --- a/src/pixi/loaders/AssetLoader.js +++ b/src/pixi/loaders/AssetLoader.js @@ -6,16 +6,16 @@ * A Class that loads a bunch of images / sprite sheet / bitmap font files. Once the * assets have been loaded they are added to the PIXI Texture cache and can be accessed * easily through PIXI.Texture.fromImage() and PIXI.Sprite.fromImage() - * When all items have been loaded this class will dispatch a "onLoaded" event - * As each individual item is loaded this class will dispatch a "onProgress" event + * When all items have been loaded this class will dispatch a 'onLoaded' event + * As each individual item is loaded this class will dispatch a 'onProgress' event * * @class AssetLoader * @constructor * @uses EventTarget * @param {Array} assetURLs an array of image/sprite sheet urls that you would like loaded - * supported. Supported image formats include "jpeg", "jpg", "png", "gif". Supported - * sprite sheet data formats only include "JSON" at this time. Supported bitmap font - * data formats include "xml" and "fnt". + * supported. Supported image formats include 'jpeg', 'jpg', 'png', 'gif'. Supported + * sprite sheet data formats only include 'JSON' at this time. Supported bitmap font + * data formats include 'xml' and 'fnt'. * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.AssetLoader = function(assetURLs, crossorigin) @@ -45,17 +45,15 @@ PIXI.AssetLoader = function(assetURLs, crossorigin) * @type Object */ this.loadersByType = { - "jpg": PIXI.ImageLoader, - "jpeg": PIXI.ImageLoader, - "png": PIXI.ImageLoader, - "gif": PIXI.ImageLoader, - "json": PIXI.JsonLoader, - "anim": PIXI.SpineLoader, - "xml": PIXI.BitmapFontLoader, - "fnt": PIXI.BitmapFontLoader + 'jpg': PIXI.ImageLoader, + 'jpeg': PIXI.ImageLoader, + 'png': PIXI.ImageLoader, + 'gif': PIXI.ImageLoader, + 'json': PIXI.JsonLoader, + 'anim': PIXI.SpineLoader, + 'xml': PIXI.BitmapFontLoader, + 'fnt': PIXI.BitmapFontLoader }; - - }; /** @@ -72,31 +70,32 @@ PIXI.AssetLoader = function(assetURLs, crossorigin) PIXI.AssetLoader.prototype.constructor = PIXI.AssetLoader; -PIXI.AssetLoader.prototype._getDataType = function(str) +PIXI.AssetLoader.prototype._getDataType = function(str) { - var test = "data:"; + var test = 'data:'; //starts with 'data:' var start = str.slice(0, test.length).toLowerCase(); - if (start == test) { + if (start === test) { var data = str.slice(test.length); - + var sepIdx = data.indexOf(','); if (sepIdx === -1) //malformed data URI scheme return null; - //e.g. "image/gif;base64" => "image/gif" + //e.g. 'image/gif;base64' => 'image/gif' var info = data.slice(0, sepIdx).split(';')[0]; //We might need to handle some special cases here... - //standardize text/plain to "txt" file extension - if (!info || info.toLowerCase() == "text/plain") - return "txt" + //standardize text/plain to 'txt' file extension + if (!info || info.toLowerCase() === 'text/plain') + return 'txt'; //User specified mime type, try splitting it by '/' return info.split('/').pop().toLowerCase(); } + return null; -} +}; /** * Starts loading the assets sequentially @@ -121,15 +120,15 @@ PIXI.AssetLoader.prototype.load = function() //if not, assume it's a file URI if (!fileType) - fileType = fileName.split("?").shift().split(".").pop().toLowerCase(); + fileType = fileName.split('?').shift().split('.').pop().toLowerCase(); var Constructor = this.loadersByType[fileType]; if(!Constructor) - throw new Error(fileType + " is an unsupported file type"); + throw new Error(fileType + ' is an unsupported file type'); var loader = new Constructor(fileName, this.crossorigin); - loader.addEventListener("loaded", onLoad); + loader.addEventListener('loaded', onLoad); loader.load(); } }; @@ -143,13 +142,12 @@ PIXI.AssetLoader.prototype.load = function() PIXI.AssetLoader.prototype.onAssetLoaded = function() { this.loadCount--; - this.dispatchEvent({type: "onProgress", content: this}); + this.dispatchEvent({type: 'onProgress', content: this}); if (this.onProgress) this.onProgress(); if (!this.loadCount) { - this.dispatchEvent({type: "onComplete", content: this}); + this.dispatchEvent({type: 'onComplete', content: this}); if(this.onComplete) this.onComplete(); } }; - diff --git a/src/pixi/loaders/BitmapFontLoader.js b/src/pixi/loaders/BitmapFontLoader.js index ef05094..19d4486 100644 --- a/src/pixi/loaders/BitmapFontLoader.js +++ b/src/pixi/loaders/BitmapFontLoader.js @@ -3,10 +3,10 @@ */ /** - * The xml loader is used to load in XML bitmap font data ("xml" or "fnt") + * The xml loader is used to load in XML bitmap font data ('xml' or 'fnt') * To generate the data you can use http://www.angelcode.com/products/bmfont/ * This loader will also load the image file as the data. - * When loaded this class will dispatch a "loaded" event + * When loaded this class will dispatch a 'loaded' event * * @class BitmapFontLoader * @uses EventTarget @@ -19,7 +19,7 @@ PIXI.BitmapFontLoader = function(url, crossorigin) /* * i use texture packer to load the assets.. * http://www.codeandweb.com/texturepacker - * make sure to set the format as "JSON" + * make sure to set the format as 'JSON' */ PIXI.EventTarget.call(this); @@ -46,7 +46,7 @@ PIXI.BitmapFontLoader = function(url, crossorigin) * @type String * @readOnly */ - this.baseUrl = url.replace(/[^\/]*$/, ""); + this.baseUrl = url.replace(/[^\/]*$/, ''); /** * [read-only] The texture of the bitmap font @@ -74,9 +74,9 @@ PIXI.BitmapFontLoader.prototype.load = function() scope.onXMLLoaded(); }; - this.ajaxRequest.open("GET", this.url, true); - if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType("application/xml"); - this.ajaxRequest.send(null) + this.ajaxRequest.open('GET', this.url, true); + if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType('application/xml'); + this.ajaxRequest.send(null); }; /** @@ -87,40 +87,40 @@ PIXI.BitmapFontLoader.prototype.load = function() */ PIXI.BitmapFontLoader.prototype.onXMLLoaded = function() { - if (this.ajaxRequest.readyState == 4) + if (this.ajaxRequest.readyState === 4) { - if (this.ajaxRequest.status == 200 || window.location.href.indexOf("http") == -1) + if (this.ajaxRequest.status === 200 || window.location.href.indexOf('http') === -1) { - var textureUrl = this.baseUrl + this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue; + var textureUrl = this.baseUrl + this.ajaxRequest.responseXML.getElementsByTagName('page')[0].attributes.getNamedItem('file').nodeValue; var image = new PIXI.ImageLoader(textureUrl, this.crossorigin); this.texture = image.texture.baseTexture; var data = {}; - var info = this.ajaxRequest.responseXML.getElementsByTagName("info")[0]; - var common = this.ajaxRequest.responseXML.getElementsByTagName("common")[0]; - data.font = info.attributes.getNamedItem("face").nodeValue; - data.size = parseInt(info.attributes.getNamedItem("size").nodeValue, 10); - data.lineHeight = parseInt(common.attributes.getNamedItem("lineHeight").nodeValue, 10); + var info = this.ajaxRequest.responseXML.getElementsByTagName('info')[0]; + var common = this.ajaxRequest.responseXML.getElementsByTagName('common')[0]; + data.font = info.attributes.getNamedItem('face').nodeValue; + data.size = parseInt(info.attributes.getNamedItem('size').nodeValue, 10); + data.lineHeight = parseInt(common.attributes.getNamedItem('lineHeight').nodeValue, 10); data.chars = {}; //parse letters - var letters = this.ajaxRequest.responseXML.getElementsByTagName("char"); + var letters = this.ajaxRequest.responseXML.getElementsByTagName('char'); for (var i = 0; i < letters.length; i++) { - var charCode = parseInt(letters[i].attributes.getNamedItem("id").nodeValue, 10); + var charCode = parseInt(letters[i].attributes.getNamedItem('id').nodeValue, 10); var textureRect = new PIXI.Rectangle( - parseInt(letters[i].attributes.getNamedItem("x").nodeValue, 10), - parseInt(letters[i].attributes.getNamedItem("y").nodeValue, 10), - parseInt(letters[i].attributes.getNamedItem("width").nodeValue, 10), - parseInt(letters[i].attributes.getNamedItem("height").nodeValue, 10) + parseInt(letters[i].attributes.getNamedItem('x').nodeValue, 10), + parseInt(letters[i].attributes.getNamedItem('y').nodeValue, 10), + parseInt(letters[i].attributes.getNamedItem('width').nodeValue, 10), + parseInt(letters[i].attributes.getNamedItem('height').nodeValue, 10) ); data.chars[charCode] = { - xOffset: parseInt(letters[i].attributes.getNamedItem("xoffset").nodeValue, 10), - yOffset: parseInt(letters[i].attributes.getNamedItem("yoffset").nodeValue, 10), - xAdvance: parseInt(letters[i].attributes.getNamedItem("xadvance").nodeValue, 10), + xOffset: parseInt(letters[i].attributes.getNamedItem('xoffset').nodeValue, 10), + yOffset: parseInt(letters[i].attributes.getNamedItem('yoffset').nodeValue, 10), + xAdvance: parseInt(letters[i].attributes.getNamedItem('xadvance').nodeValue, 10), kerning: {}, texture: PIXI.TextureCache[charCode] = new PIXI.Texture(this.texture, textureRect) @@ -128,12 +128,12 @@ PIXI.BitmapFontLoader.prototype.onXMLLoaded = function() } //parse kernings - var kernings = this.ajaxRequest.responseXML.getElementsByTagName("kerning"); + var kernings = this.ajaxRequest.responseXML.getElementsByTagName('kerning'); for (i = 0; i < kernings.length; i++) { - var first = parseInt(kernings[i].attributes.getNamedItem("first").nodeValue, 10); - var second = parseInt(kernings[i].attributes.getNamedItem("second").nodeValue, 10); - var amount = parseInt(kernings[i].attributes.getNamedItem("amount").nodeValue, 10); + var first = parseInt(kernings[i].attributes.getNamedItem('first').nodeValue, 10); + var second = parseInt(kernings[i].attributes.getNamedItem('second').nodeValue, 10); + var amount = parseInt(kernings[i].attributes.getNamedItem('amount').nodeValue, 10); data.chars[second].kerning[first] = amount; @@ -142,7 +142,7 @@ PIXI.BitmapFontLoader.prototype.onXMLLoaded = function() PIXI.BitmapText.fonts[data.font] = data; var scope = this; - image.addEventListener("loaded", function() { + image.addEventListener('loaded', function() { scope.onLoaded(); }); image.load(); @@ -158,5 +158,5 @@ PIXI.BitmapFontLoader.prototype.onXMLLoaded = function() */ PIXI.BitmapFontLoader.prototype.onLoaded = function() { - this.dispatchEvent({type: "loaded", content: this}); + this.dispatchEvent({type: 'loaded', content: this}); }; diff --git a/src/pixi/loaders/ImageLoader.js b/src/pixi/loaders/ImageLoader.js index d8a4137..c73893f 100644 --- a/src/pixi/loaders/ImageLoader.js +++ b/src/pixi/loaders/ImageLoader.js @@ -3,7 +3,7 @@ */ /** - * The image loader class is responsible for loading images file formats ("jpeg", "jpg", "png" and "gif") + * The image loader class is responsible for loading images file formats ('jpeg', 'jpg', 'png' and 'gif') * Once the image has been loaded it is stored in the PIXI texture cache and can be accessed though PIXI.Texture.fromFrameId() and PIXI.Sprite.fromFromeId() * When loaded this class will dispatch a 'loaded' event * @@ -46,7 +46,7 @@ PIXI.ImageLoader.prototype.load = function() if(!this.texture.baseTexture.hasLoaded) { var scope = this; - this.texture.baseTexture.addEventListener("loaded", function() + this.texture.baseTexture.addEventListener('loaded', function() { scope.onLoaded(); }); @@ -65,7 +65,7 @@ PIXI.ImageLoader.prototype.load = function() */ PIXI.ImageLoader.prototype.onLoaded = function() { - this.dispatchEvent({type: "loaded", content: this}); + this.dispatchEvent({type: 'loaded', content: this}); }; /** @@ -75,7 +75,7 @@ PIXI.ImageLoader.prototype.onLoaded = function() * @method loadFramedSpriteSheet * @param frameWidth {Number} with of each frame * @param frameHeight {Number} height of each frame - * @param textureName {String} if given, the frames will be cached in - format + * @param textureName {String} if given, the frames will be cached in - format */ PIXI.ImageLoader.prototype.loadFramedSpriteSheet = function(frameWidth, frameHeight, textureName) { @@ -96,14 +96,14 @@ PIXI.ImageLoader.prototype.loadFramedSpriteSheet = function(frameWidth, frameHei }); this.frames.push(texture); - if (textureName) PIXI.TextureCache[textureName+'-'+i] = texture; + if (textureName) PIXI.TextureCache[textureName + '-' + i] = texture; } } if(!this.texture.baseTexture.hasLoaded) { var scope = this; - this.texture.baseTexture.addEventListener("loaded", function() { + this.texture.baseTexture.addEventListener('loaded', function() { scope.onLoaded(); }); } @@ -111,4 +111,4 @@ PIXI.ImageLoader.prototype.loadFramedSpriteSheet = function(frameWidth, frameHei { this.onLoaded(); } -}; \ No newline at end of file +}; diff --git a/src/pixi/loaders/JsonLoader.js b/src/pixi/loaders/JsonLoader.js index e20794f..08c1d5e 100644 --- a/src/pixi/loaders/JsonLoader.js +++ b/src/pixi/loaders/JsonLoader.js @@ -4,8 +4,8 @@ /** * The json file loader is used to load in JSON data and parsing it - * When loaded this class will dispatch a "loaded" event - * If load failed this class will dispatch a "error" event + * When loaded this class will dispatch a 'loaded' event + * If load failed this class will dispatch a 'error' event * * @class JsonLoader * @uses EventTarget @@ -39,7 +39,7 @@ PIXI.JsonLoader = function (url, crossorigin) { * @type String * @readOnly */ - this.baseUrl = url.replace(/[^\/]*$/, ""); + this.baseUrl = url.replace(/[^\/]*$/, ''); /** * [read-only] Whether the data has loaded yet @@ -61,14 +61,14 @@ PIXI.JsonLoader.prototype.constructor = PIXI.JsonLoader; * @method load */ PIXI.JsonLoader.prototype.load = function () { - this.ajaxRequest = new AjaxRequest(); + this.ajaxRequest = new PIXI.AjaxRequest(); var scope = this; this.ajaxRequest.onreadystatechange = function () { scope.onJSONLoaded(); }; - this.ajaxRequest.open("GET", this.url, true); - if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType("application/json"); + this.ajaxRequest.open('GET', this.url, true); + if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType('application/json'); this.ajaxRequest.send(null); }; @@ -79,8 +79,8 @@ PIXI.JsonLoader.prototype.load = function () { * @private */ PIXI.JsonLoader.prototype.onJSONLoaded = function () { - if (this.ajaxRequest.readyState == 4) { - if (this.ajaxRequest.status == 200 || window.location.href.indexOf("http") == -1) { + if (this.ajaxRequest.readyState === 4) { + if (this.ajaxRequest.status === 200 || window.location.href.indexOf('http') === -1) { this.json = JSON.parse(this.ajaxRequest.responseText); if(this.json.frames) @@ -92,7 +92,7 @@ PIXI.JsonLoader.prototype.onJSONLoaded = function () { var frameData = this.json.frames; this.texture = image.texture.baseTexture; - image.addEventListener("loaded", function (event) { + image.addEventListener('loaded', function () { scope.onLoaded(); }); @@ -146,7 +146,7 @@ PIXI.JsonLoader.prototype.onJSONLoaded = function () { PIXI.JsonLoader.prototype.onLoaded = function () { this.loaded = true; this.dispatchEvent({ - type: "loaded", + type: 'loaded', content: this }); }; @@ -159,7 +159,7 @@ PIXI.JsonLoader.prototype.onLoaded = function () { */ PIXI.JsonLoader.prototype.onError = function () { this.dispatchEvent({ - type: "error", + type: 'error', content: this }); }; \ No newline at end of file diff --git a/src/pixi/loaders/SpineLoader.js b/src/pixi/loaders/SpineLoader.js index f0e4ce1..f0a38ca 100644 --- a/src/pixi/loaders/SpineLoader.js +++ b/src/pixi/loaders/SpineLoader.js @@ -49,7 +49,7 @@ PIXI.SpineLoader = function(url, crossorigin) * @readOnly */ this.loaded = false; -} +}; PIXI.SpineLoader.prototype.constructor = PIXI.SpineLoader; @@ -75,7 +75,7 @@ PIXI.SpineLoader.prototype.load = function () { * @method onJSONLoaded * @private */ -PIXI.SpineLoader.prototype.onJSONLoaded = function (event) { +PIXI.SpineLoader.prototype.onJSONLoaded = function () { var spineJsonParser = new spine.SkeletonJson(); var skeletonData = spineJsonParser.readSkeletonData(this.json); diff --git a/src/pixi/loaders/SpriteSheetLoader.js b/src/pixi/loaders/SpriteSheetLoader.js index d0fe441..e9844ce 100644 --- a/src/pixi/loaders/SpriteSheetLoader.js +++ b/src/pixi/loaders/SpriteSheetLoader.js @@ -4,12 +4,12 @@ /** * The sprite sheet loader is used to load in JSON sprite sheet data - * To generate the data you can use http://www.codeandweb.com/texturepacker and publish the "JSON" format + * To generate the data you can use http://www.codeandweb.com/texturepacker and publish the 'JSON' format * There is a free version so thats nice, although the paid version is great value for money. - * It is highly recommended to use Sprite sheets (also know as texture atlas") as it means sprite"s can be batched and drawn together for highly increased rendering speed. + * It is highly recommended to use Sprite sheets (also know as texture atlas') as it means sprite's can be batched and drawn together for highly increased rendering speed. * Once the data has been loaded the frames are stored in the PIXI texture cache and can be accessed though PIXI.Texture.fromFrameId() and PIXI.Sprite.fromFromeId() * This loader will also load the image file that the Spritesheet points to as well as the data. - * When loaded this class will dispatch a "loaded" event + * When loaded this class will dispatch a 'loaded' event * * @class SpriteSheetLoader * @uses EventTarget @@ -17,12 +17,11 @@ * @param url {String} The url of the sprite sheet JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ - PIXI.SpriteSheetLoader = function (url, crossorigin) { /* * i use texture packer to load the assets.. * http://www.codeandweb.com/texturepacker - * make sure to set the format as "JSON" + * make sure to set the format as 'JSON' */ PIXI.EventTarget.call(this); @@ -49,7 +48,7 @@ PIXI.SpriteSheetLoader = function (url, crossorigin) { * @type String * @readOnly */ - this.baseUrl = url.replace(/[^\/]*$/, ""); + this.baseUrl = url.replace(/[^\/]*$/, ''); /** * The texture being loaded @@ -79,7 +78,7 @@ PIXI.SpriteSheetLoader.prototype.constructor = PIXI.SpriteSheetLoader; PIXI.SpriteSheetLoader.prototype.load = function () { var scope = this; var jsonLoader = new PIXI.JsonLoader(this.url, this.crossorigin); - jsonLoader.addEventListener("loaded", function (event) { + jsonLoader.addEventListener('loaded', function (event) { scope.json = event.content.json; scope.onJSONLoaded(); }); @@ -99,7 +98,7 @@ PIXI.SpriteSheetLoader.prototype.onJSONLoaded = function () { var frameData = this.json.frames; this.texture = image.texture.baseTexture; - image.addEventListener("loaded", function (event) { + image.addEventListener('loaded', function () { scope.onLoaded(); }); @@ -123,6 +122,7 @@ PIXI.SpriteSheetLoader.prototype.onJSONLoaded = function () { image.load(); }; + /** * Invoke when all files are loaded (json and texture) * @@ -131,7 +131,7 @@ PIXI.SpriteSheetLoader.prototype.onJSONLoaded = function () { */ PIXI.SpriteSheetLoader.prototype.onLoaded = function () { this.dispatchEvent({ - type: "loaded", + type: 'loaded', content: this }); }; diff --git a/src/pixi/primitives/Graphics.js b/src/pixi/primitives/Graphics.js index dbe2804..f105bef 100644 --- a/src/pixi/primitives/Graphics.js +++ b/src/pixi/primitives/Graphics.js @@ -59,7 +59,7 @@ PIXI.Graphics = function() * @private */ this.currentPath = {points:[]}; -} +}; // constructor PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); @@ -85,7 +85,7 @@ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) fillColor:this.fillColor, fillAlpha:this.fillAlpha, fill:this.filling, points:[], type:PIXI.Graphics.POLY}; this.graphicsData.push(this.currentPath); -} +}; /** * Moves the current drawing position to (x, y). @@ -104,7 +104,7 @@ PIXI.Graphics.prototype.moveTo = function(x, y) this.currentPath.points.push(x, y); this.graphicsData.push(this.currentPath); -} +}; /** * Draws a line using the current line style from the current drawing position to (x, y); @@ -118,7 +118,7 @@ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.points.push(x, y); this.dirty = true; -} +}; /** * Specifies a simple one-color fill that subsequent calls to other Graphics methods @@ -133,7 +133,7 @@ PIXI.Graphics.prototype.beginFill = function(color, alpha) this.filling = true; this.fillColor = color || 0; this.fillAlpha = (arguments.length < 2) ? 1 : alpha; -} +}; /** * Applies a fill to the lines and shapes that were added since the last call to the beginFill() method. @@ -145,7 +145,7 @@ PIXI.Graphics.prototype.endFill = function() this.filling = false; this.fillColor = null; this.fillAlpha = 1; -} +}; /** * @method drawRect @@ -165,7 +165,7 @@ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) this.graphicsData.push(this.currentPath); this.dirty = true; -} +}; /** * Draws a circle. @@ -185,7 +185,7 @@ PIXI.Graphics.prototype.drawCircle = function( x, y, radius) this.graphicsData.push(this.currentPath); this.dirty = true; -} +}; /** * Draws an elipse. @@ -206,7 +206,7 @@ PIXI.Graphics.prototype.drawElipse = function( x, y, width, height) this.graphicsData.push(this.currentPath); this.dirty = true; -} +}; /** * Clears the graphics that were drawn to this Graphics object, and resets fill and line style settings. @@ -222,8 +222,8 @@ PIXI.Graphics.prototype.clear = function() this.clearDirty = true; this.graphicsData = []; - this.bounds = null//new PIXI.Rectangle(); -} + this.bounds = null; //new PIXI.Rectangle(); +}; PIXI.Graphics.prototype.updateFilterBounds = function() @@ -239,8 +239,6 @@ PIXI.Graphics.prototype.updateFilterBounds = function() var points, x, y; for (var i = 0; i < this.graphicsData.length; i++) { - - var data = this.graphicsData[i]; var type = data.type; var lineWidth = data.lineWidth; @@ -265,7 +263,7 @@ PIXI.Graphics.prototype.updateFilterBounds = function() x = points.x; y = points.y; var radius = points.radius + lineWidth/2; - + minX = x - radius < minX ? x - radius : minX; maxX = x + radius > maxX ? x + radius : maxX; @@ -275,9 +273,9 @@ PIXI.Graphics.prototype.updateFilterBounds = function() else { // POLY - for (var j = 0; j < points.length; j+=2) + for (var j = 0; j < points.length; j+=2) { - + x = points[j]; y = points[j+1]; @@ -286,17 +284,14 @@ PIXI.Graphics.prototype.updateFilterBounds = function() minY = y-lineWidth < minY ? y-lineWidth : minY; maxY = y+lineWidth > maxY ? y+lineWidth : maxY; - }; + } } - - }; + } this.bounds = new PIXI.Rectangle(minX, minY, maxX - minX, maxY - minY); - } - // console.log(this.bounds); -} +}; // SOME TYPES: PIXI.Graphics.POLY = 0; diff --git a/src/pixi/renderers/canvas/CanvasGraphics.js b/src/pixi/renderers/canvas/CanvasGraphics.js index af76ca4..c3398f1 100644 --- a/src/pixi/renderers/canvas/CanvasGraphics.js +++ b/src/pixi/renderers/canvas/CanvasGraphics.js @@ -11,7 +11,7 @@ PIXI.CanvasGraphics = function() { -} +}; /* @@ -27,28 +27,28 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) { var worldAlpha = graphics.worldAlpha; - for (var i=0; i < graphics.graphicsData.length; i++) + 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.strokeStyle = '#' + ('00000' + ( data.lineColor | 0).toString(16)).substr(-6); context.lineWidth = data.lineWidth; - if(data.type == PIXI.Graphics.POLY) + if(data.type === PIXI.Graphics.POLY) { context.beginPath(); context.moveTo(points[0], points[1]); - for (var j=1; j < points.length/2; j++) + 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]) + if(points[0] === points[points.length-2] && points[1] === points[points.length-1]) { context.closePath(); } @@ -56,7 +56,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fillStyle = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) @@ -65,13 +65,13 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) context.stroke(); } } - else if(data.type == PIXI.Graphics.RECT) + else if(data.type === PIXI.Graphics.RECT) { if(data.fillColor || data.fillColor === 0) { context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fillStyle = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fillRect(points[0], points[1], points[2], points[3]); } @@ -82,7 +82,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) } } - else if(data.type == PIXI.Graphics.CIRC) + else if(data.type === PIXI.Graphics.CIRC) { // TODO - need to be Undefined! context.beginPath(); @@ -92,7 +92,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fillStyle = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) @@ -101,7 +101,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) context.stroke(); } } - else if(data.type == PIXI.Graphics.ELIP) + else if(data.type === PIXI.Graphics.ELIP) { // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas @@ -135,7 +135,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; - context.fillStyle = color = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); + context.fillStyle = '#' + ('00000' + ( data.fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) @@ -146,7 +146,7 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) } } -} +}; /* * Renders a graphics mask @@ -159,53 +159,51 @@ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) */ PIXI.CanvasGraphics.renderGraphicsMask = function(graphics, context) { - var worldAlpha = graphics.worldAlpha; - var len = graphics.graphicsData.length; - if(len === 0)return; + if(len === 0) return; if(len > 1) { len = 1; - console.log("Pixi.js warning: masks in canvas can only mask using the first path in the graphics object") + window.console.log('Pixi.js warning: masks in canvas can only mask using the first path in the graphics object'); } - for (var i=0; i < 1; i++) + for (var i = 0; i < 1; i++) { var data = graphics.graphicsData[i]; var points = data.points; - if(data.type == PIXI.Graphics.POLY) + if(data.type === PIXI.Graphics.POLY) { context.beginPath(); context.moveTo(points[0], points[1]); - for (var j=1; j < points.length/2; j++) + 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]) + if(points[0] === points[points.length-2] && points[1] === points[points.length-1]) { context.closePath(); } } - else if(data.type == PIXI.Graphics.RECT) + else if(data.type === PIXI.Graphics.RECT) { context.beginPath(); context.rect(points[0], points[1], points[2], points[3]); context.closePath(); } - else if(data.type == PIXI.Graphics.CIRC) + 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(); } - else if(data.type == PIXI.Graphics.ELIP) + else if(data.type === PIXI.Graphics.ELIP) { // elipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas @@ -219,7 +217,7 @@ PIXI.CanvasGraphics.renderGraphicsMask = function(graphics, context) context.beginPath(); - var kappa = .5522848, + var kappa = 0.5522848, ox = (w / 2) * kappa, // control point offset horizontal oy = (h / 2) * kappa, // control point offset vertical xe = x + w, // x-end @@ -234,7 +232,5 @@ PIXI.CanvasGraphics.renderGraphicsMask = function(graphics, context) context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); context.closePath(); } - - - }; -} + } +}; diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index eea1f93..a2dbb5e 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -2,7 +2,6 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - /** * the CanvasRenderer draws the stage and all its content onto a 2d canvas. This renderer should be used for browsers that do not support webGL. * Dont forget to add the view to your DOM or you will not see anything :) @@ -49,16 +48,16 @@ PIXI.CanvasRenderer = function(width, height, view, transparent) * @property context * @type Canvas 2d Context */ - this.context = this.view.getContext("2d"); + this.context = this.view.getContext('2d'); this.refresh = true; // hack to enable some hardware acceleration! //this.view.style["transform"] = "translatez(0)"; - + this.view.width = this.width; - this.view.height = this.height; + this.view.height = this.height; this.count = 0; -} +}; // constructor PIXI.CanvasRenderer.prototype.constructor = PIXI.CanvasRenderer; @@ -71,25 +70,25 @@ PIXI.CanvasRenderer.prototype.constructor = PIXI.CanvasRenderer; */ PIXI.CanvasRenderer.prototype.render = function(stage) { - //stage.__childrenAdded = []; //stage.__childrenRemoved = []; - + // update textures if need be PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - + PIXI.visibleCount++; stage.updateTransform(); - - // update the background color - if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; - this.context.setTransform(1,0,0,1,0,0); - this.context.clearRect(0, 0, this.width, this.height) + // update the background color + if(this.view.style.backgroundColor !== stage.backgroundColorString && !this.transparent) + this.view.style.backgroundColor = stage.backgroundColorString; + + this.context.setTransform(1,0,0,1,0,0); + this.context.clearRect(0, 0, this.width, this.height); this.renderDisplayObject(stage); //as - + // run interaction! if(stage.interactive) { @@ -100,15 +99,13 @@ PIXI.CanvasRenderer.prototype.render = function(stage) stage.interactionManager.setTarget(this); } } - + // remove frame updates.. if(PIXI.Texture.frameUpdates.length > 0) { PIXI.Texture.frameUpdates = []; } - - -} +}; /** * resizes the canvas view to the specified width and height @@ -121,10 +118,10 @@ PIXI.CanvasRenderer.prototype.resize = function(width, height) { this.width = width; this.height = height; - + this.view.width = width; this.view.height = height; -} +}; /** * Renders a display object @@ -138,60 +135,59 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) // no loger recurrsive! var transform; var context = this.context; - + context.globalCompositeOperation = 'source-over'; - - // one the display object hits this. we can break the loop + + // one the display object hits this. we can break the loop var testObject = displayObject.last._iNext; displayObject = displayObject.first; - - do + + do { transform = displayObject.worldTransform; - + if(!displayObject.visible) { displayObject = displayObject.last._iNext; continue; } - + if(!displayObject.renderable) { displayObject = displayObject._iNext; continue; } - + if(displayObject instanceof PIXI.Sprite) { - - var frame = displayObject.texture.frame; + var frame = displayObject.texture.frame; //ignore null sources if(frame && frame.width && frame.height && displayObject.texture.baseTexture.source) { context.globalAlpha = displayObject.worldAlpha; - + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); - - context.drawImage(displayObject.texture.baseTexture.source, + + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.x) * -frame.width, (displayObject.anchor.y) * -frame.height, frame.width, frame.height); - } + } } else if(displayObject instanceof PIXI.Strip) { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); this.renderStrip(displayObject); } else if(displayObject instanceof PIXI.TilingSprite) { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); this.renderTilingSprite(displayObject); } else if(displayObject instanceof PIXI.CustomRenderable) @@ -201,7 +197,7 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) } else if(displayObject instanceof PIXI.Graphics) { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); PIXI.CanvasGraphics.renderGraphics(displayObject, context); } else if(displayObject instanceof PIXI.FilterBlock) @@ -213,19 +209,19 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) if(displayObject.open) { context.save(); - + var cacheAlpha = mask.alpha; var maskTransform = mask.worldTransform; - - context.setTransform(maskTransform[0], maskTransform[3], maskTransform[1], maskTransform[4], maskTransform[2], maskTransform[5]) - + + context.setTransform(maskTransform[0], maskTransform[3], maskTransform[1], maskTransform[4], maskTransform[2], maskTransform[5]); + mask.worldAlpha = 0.5; - + context.worldAlpha = 0; - + PIXI.CanvasGraphics.renderGraphicsMask(mask, context); context.clip(); - + mask.worldAlpha = cacheAlpha; } else @@ -233,20 +229,19 @@ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) context.restore(); } } + /* else { // only masks supported right now! } + */ } - // count++ - displayObject = displayObject._iNext; - - - } - while(displayObject != testObject) - -} + //count++ + displayObject = displayObject._iNext; + } + while(displayObject !== testObject); +}; /** * Renders a flat strip @@ -259,31 +254,28 @@ PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) { var context = this.context; var verticies = strip.verticies; - var uvs = strip.uvs; - + var length = verticies.length/2; this.count++; - + context.beginPath(); - for (var i=1; i < length-2; i++) + for (var i=1; i < length-2; i++) { - // draw some triangles! var index = i*2; - - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - + + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + context.moveTo(x0, y0); context.lineTo(x1, y1); context.lineTo(x2, y2); - - }; - - context.fillStyle = "#FF0000"; + } + + context.fillStyle = '#FF0000'; context.fill(); context.closePath(); -} +}; /** * Renders a tiling sprite @@ -295,28 +287,29 @@ PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) PIXI.CanvasRenderer.prototype.renderTilingSprite = function(sprite) { var context = this.context; - + context.globalAlpha = sprite.worldAlpha; - - if(!sprite.__tilePattern) sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, "repeat"); - + + if(!sprite.__tilePattern) + sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, 'repeat'); + context.beginPath(); - + var tilePosition = sprite.tilePosition; var tileScale = sprite.tileScale; - + // offset context.scale(tileScale.x,tileScale.y); context.translate(tilePosition.x, tilePosition.y); - + context.fillStyle = sprite.__tilePattern; context.fillRect(-tilePosition.x,-tilePosition.y,sprite.width / tileScale.x, sprite.height / tileScale.y); - + context.scale(1/tileScale.x, 1/tileScale.y); context.translate(-tilePosition.x, -tilePosition.y); - + context.closePath(); -} +}; /** * Renders a strip @@ -332,21 +325,20 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip) // draw triangles!! var verticies = strip.verticies; var uvs = strip.uvs; - + var length = verticies.length/2; this.count++; - for (var i=1; i < length-2; i++) + + for (var i = 1; i < length-2; i++) { - // draw some triangles! var index = i*2; - - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - - var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; - var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; + var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; + var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; + + var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; + var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; context.save(); context.beginPath(); @@ -354,28 +346,23 @@ PIXI.CanvasRenderer.prototype.renderStrip = function(strip) context.lineTo(x1, y1); context.lineTo(x2, y2); context.closePath(); - + context.clip(); - - + // Compute matrix transform var delta = u0*v1 + v0*u2 + u1*v2 - v1*u2 - v0*u1 - u0*v2; - var delta_a = x0*v1 + v0*x2 + x1*v2 - v1*x2 - v0*x1 - x0*v2; - var delta_b = u0*x1 + x0*u2 + u1*x2 - x1*u2 - x0*u1 - u0*x2; - var delta_c = u0*v1*x2 + v0*x1*u2 + x0*u1*v2 - x0*v1*u2 - v0*u1*x2 - u0*x1*v2; - var delta_d = y0*v1 + v0*y2 + y1*v2 - v1*y2 - v0*y1 - y0*v2; - var delta_e = u0*y1 + y0*u2 + u1*y2 - y1*u2 - y0*u1 - u0*y2; - var delta_f = u0*v1*y2 + v0*y1*u2 + y0*u1*v2 - y0*v1*u2 - v0*u1*y2 - u0*y1*v2; - - - - - context.transform(delta_a/delta, delta_d/delta, - delta_b/delta, delta_e/delta, - delta_c/delta, delta_f/delta); - + var deltaA = x0*v1 + v0*x2 + x1*v2 - v1*x2 - v0*x1 - x0*v2; + var deltaB = u0*x1 + x0*u2 + u1*x2 - x1*u2 - x0*u1 - u0*x2; + var deltaC = u0*v1*x2 + v0*x1*u2 + x0*u1*v2 - x0*v1*u2 - v0*u1*x2 - u0*x1*v2; + var deltaD = y0*v1 + v0*y2 + y1*v2 - v1*y2 - v0*y1 - y0*v2; + var deltaE = u0*y1 + y0*u2 + u1*y2 - y1*u2 - y0*u1 - u0*y2; + var deltaF = u0*v1*y2 + v0*y1*u2 + y0*u1*v2 - y0*v1*u2 - v0*u1*y2 - u0*y1*v2; + + context.transform(deltaA / delta, deltaD / delta, + deltaB / delta, deltaE / delta, + deltaC / delta, deltaF / delta); + context.drawImage(strip.texture.baseTexture.source, 0, 0); context.restore(); - }; - -} + } +}; diff --git a/src/pixi/renderers/webgl/PixiShader.js b/src/pixi/renderers/webgl/PixiShader.js index f7fbf85..01721c0 100644 --- a/src/pixi/renderers/webgl/PixiShader.js +++ b/src/pixi/renderers/webgl/PixiShader.js @@ -12,26 +12,25 @@ PIXI.PixiShader = function() /** * @property {any} program - The WebGL program. */ - this.program; - + this.program = null; + /** * @property {array} fragmentSrc - The fragment shader. */ this.fragmentSrc = [ - "precision lowp float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform sampler2D uSampler;", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor;", - "}" + 'precision lowp float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform sampler2D uSampler;', + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor;', + '}' ]; /** * @property {number} textureCount - A local texture counter for multi-texture shaders. */ this.textureCount = 0; - }; /** @@ -39,23 +38,23 @@ PIXI.PixiShader = function() */ PIXI.PixiShader.prototype.init = function() { - var program = PIXI.compileProgram(this.vertexSrc || PIXI.PixiShader.defaultVertexSrc, this.fragmentSrc) - + var program = PIXI.compileProgram(this.vertexSrc || PIXI.PixiShader.defaultVertexSrc, this.fragmentSrc); + var gl = PIXI.gl; gl.useProgram(program); - + // get and store the uniforms for the shader - this.uSampler = gl.getUniformLocation(program, "uSampler"); - this.projectionVector = gl.getUniformLocation(program, "projectionVector"); - this.offsetVector = gl.getUniformLocation(program, "offsetVector"); - this.dimensions = gl.getUniformLocation(program, "dimensions"); - + this.uSampler = gl.getUniformLocation(program, 'uSampler'); + this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); + this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); + this.dimensions = gl.getUniformLocation(program, 'dimensions'); + // get and store the attributes - this.aVertexPosition = gl.getAttribLocation(program, "aVertexPosition"); - this.colorAttribute = gl.getAttribLocation(program, "aColor"); - this.aTextureCoord = gl.getAttribLocation(program, "aTextureCoord"); - + this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); + this.colorAttribute = gl.getAttribLocation(program, 'aColor'); + this.aTextureCoord = gl.getAttribLocation(program, 'aTextureCoord'); + // add those custom shaders! for (var key in this.uniforms) { @@ -64,7 +63,7 @@ PIXI.PixiShader.prototype.init = function() } this.initUniforms(); - + this.program = program; }; @@ -80,13 +79,14 @@ PIXI.PixiShader.prototype.initUniforms = function() this.textureCount = 1; var uniform; - - for (var key in this.uniforms) + + for (var key in this.uniforms) { - var uniform = this.uniforms[key]; + uniform = this.uniforms[key]; + var type = uniform.type; - if (type == 'sampler2D') + if (type === 'sampler2D') { uniform._init = false; @@ -95,21 +95,21 @@ PIXI.PixiShader.prototype.initUniforms = function() this.initSampler2D(uniform); } } - else if (type == 'mat2' || type == 'mat3' || type == 'mat4') + else if (type === 'mat2' || type === 'mat3' || type === 'mat4') { // These require special handling uniform.glMatrix = true; uniform.glValueLength = 1; - if (type == 'mat2') + if (type === 'mat2') { uniform.glFunc = PIXI.gl.uniformMatrix2fv; } - else if (type == 'mat3') + else if (type === 'mat3') { uniform.glFunc = PIXI.gl.uniformMatrix3fv; } - else if (type == 'mat4') + else if (type === 'mat4') { uniform.glFunc = PIXI.gl.uniformMatrix4fv; } @@ -119,15 +119,15 @@ PIXI.PixiShader.prototype.initUniforms = function() // GL function reference uniform.glFunc = PIXI.gl['uniform' + type]; - if (type == '2f' || type == '2i') + if (type === '2f' || type === '2i') { uniform.glValueLength = 2; } - else if (type == '3f' || type == '3i') + else if (type === '3f' || type === '3i') { uniform.glValueLength = 3; } - else if (type == '4f' || type == '4i') + else if (type === '4f' || type === '4i') { uniform.glValueLength = 4; } @@ -137,7 +137,7 @@ PIXI.PixiShader.prototype.initUniforms = function() } } } - + }; /** @@ -224,12 +224,12 @@ PIXI.PixiShader.prototype.syncUniforms = function() var uniform; // This would probably be faster in an array and it would guarantee key order - for (var key in this.uniforms) + for (var key in this.uniforms) { uniform = this.uniforms[key]; - if (uniform.glValueLength == 1) + if (uniform.glValueLength === 1) { if (uniform.glMatrix === true) { @@ -240,19 +240,19 @@ PIXI.PixiShader.prototype.syncUniforms = function() uniform.glFunc.call(PIXI.gl, uniform.uniformLocation, uniform.value); } } - else if (uniform.glValueLength == 2) + else if (uniform.glValueLength === 2) { uniform.glFunc.call(PIXI.gl, uniform.uniformLocation, uniform.value.x, uniform.value.y); } - else if (uniform.glValueLength == 3) + else if (uniform.glValueLength === 3) { uniform.glFunc.call(PIXI.gl, uniform.uniformLocation, uniform.value.x, uniform.value.y, uniform.value.z); } - else if (uniform.glValueLength == 4) + else if (uniform.glValueLength === 4) { uniform.glFunc.call(PIXI.gl, uniform.uniformLocation, uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w); } - else if (uniform.type == 'sampler2D') + else if (uniform.type === 'sampler2D') { if (uniform._init) { @@ -267,26 +267,25 @@ PIXI.PixiShader.prototype.syncUniforms = function() } } } - + }; PIXI.PixiShader.defaultVertexSrc = [ - - "attribute vec2 aVertexPosition;", - "attribute vec2 aTextureCoord;", - "attribute float aColor;", + 'attribute vec2 aVertexPosition;', + 'attribute vec2 aTextureCoord;', + 'attribute float aColor;', - "uniform vec2 projectionVector;", - "uniform vec2 offsetVector;", - "varying vec2 vTextureCoord;", + 'uniform vec2 projectionVector;', + 'uniform vec2 offsetVector;', + 'varying vec2 vTextureCoord;', - "varying float vColor;", + 'varying float vColor;', - "const vec2 center = vec2(-1.0, 1.0);", - - "void main(void) {", - "gl_Position = vec4( ((aVertexPosition + offsetVector) / projectionVector) + center , 0.0, 1.0);", - "vTextureCoord = aTextureCoord;", - "vColor = aColor;", - "}" + 'const vec2 center = vec2(-1.0, 1.0);', + + 'void main(void) {', + ' gl_Position = vec4( ((aVertexPosition + offsetVector) / projectionVector) + center , 0.0, 1.0);', + ' vTextureCoord = aTextureCoord;', + ' vColor = aColor;', + '}' ]; diff --git a/src/pixi/renderers/webgl/PrimitiveShader.js b/src/pixi/renderers/webgl/PrimitiveShader.js index 1089d84..b206e79 100644 --- a/src/pixi/renderers/webgl/PrimitiveShader.js +++ b/src/pixi/renderers/webgl/PrimitiveShader.js @@ -5,53 +5,54 @@ PIXI.PrimitiveShader = function() { - // the webGL program.. - this.program; - + // the webGL program.. + this.program = null; + this.fragmentSrc = [ - "precision mediump float;", - "varying vec4 vColor;", - "void main(void) {", - "gl_FragColor = vColor;", - "}" + 'precision mediump float;', + 'varying vec4 vColor;', + + 'void main(void) {', + ' gl_FragColor = vColor;', + '}' ]; this.vertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec4 aColor;", - "uniform mat3 translationMatrix;", - "uniform vec2 projectionVector;", - "uniform vec2 offsetVector;", - "uniform float alpha;", - "varying vec4 vColor;", - "void main(void) {", - "vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);", - "v -= offsetVector.xyx;", - "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);", - "vColor = aColor * alpha;", - "}" + 'attribute vec2 aVertexPosition;', + 'attribute vec4 aColor;', + 'uniform mat3 translationMatrix;', + 'uniform vec2 projectionVector;', + 'uniform vec2 offsetVector;', + 'uniform float alpha;', + 'varying vec4 vColor;', + + 'void main(void) {', + ' vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);', + ' v -= offsetVector.xyx;', + ' gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);', + ' vColor = aColor * alpha;', + '}' ]; - -} +}; PIXI.PrimitiveShader.prototype.init = function() { - var program = PIXI.compileProgram(this.vertexSrc, this.fragmentSrc); - - var gl = PIXI.gl; - - gl.useProgram(program); - - // get and store the uniforms for the shader - this.projectionVector = gl.getUniformLocation(program, "projectionVector"); - this.offsetVector = gl.getUniformLocation(program, "offsetVector"); - - // get and store the attributes - this.aVertexPosition = gl.getAttribLocation(program, "aVertexPosition"); - this.colorAttribute = gl.getAttribLocation(program, "aColor"); - - this.translationMatrix = gl.getUniformLocation(program, "translationMatrix"); - this.alpha = gl.getUniformLocation(program, "alpha"); + var program = PIXI.compileProgram(this.vertexSrc, this.fragmentSrc); - this.program = program; -} + var gl = PIXI.gl; + + gl.useProgram(program); + + // get and store the uniforms for the shader + this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); + this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); + + // get and store the attributes + this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); + this.colorAttribute = gl.getAttribLocation(program, 'aColor'); + + this.translationMatrix = gl.getUniformLocation(program, 'translationMatrix'); + this.alpha = gl.getUniformLocation(program, 'alpha'); + + this.program = program; +}; diff --git a/src/pixi/renderers/webgl/StripShader.js b/src/pixi/renderers/webgl/StripShader.js index 80d8394..e82f33a 100644 --- a/src/pixi/renderers/webgl/StripShader.js +++ b/src/pixi/renderers/webgl/StripShader.js @@ -5,61 +5,63 @@ PIXI.StripShader = function() { - // the webGL program.. - this.program; - + // the webGL program.. + this.program = null; + this.fragmentSrc = [ - "precision mediump float;", - "varying vec2 vTextureCoord;", - "varying float vColor;", - "uniform float alpha;", - "uniform sampler2D uSampler;", - "void main(void) {", - "gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));", - "gl_FragColor = gl_FragColor * alpha;", - "}" + 'precision mediump float;', + 'varying vec2 vTextureCoord;', + 'varying float vColor;', + 'uniform float alpha;', + 'uniform sampler2D uSampler;', + + 'void main(void) {', + ' gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));', + ' gl_FragColor = gl_FragColor * alpha;', + '}' ]; this.vertexSrc = [ - "attribute vec2 aVertexPosition;", - "attribute vec2 aTextureCoord;", - "attribute float aColor;", - "uniform mat3 translationMatrix;", - "uniform vec2 projectionVector;", - "varying vec2 vTextureCoord;", - "varying vec2 offsetVector;", - "varying float vColor;", - "void main(void) {", - "vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);", - "v -= offsetVector.xyx;", - "gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / projectionVector.y + 1.0 , 0.0, 1.0);", - "vTextureCoord = aTextureCoord;", - "vColor = aColor;", - "}" + 'attribute vec2 aVertexPosition;', + 'attribute vec2 aTextureCoord;', + 'attribute float aColor;', + 'uniform mat3 translationMatrix;', + 'uniform vec2 projectionVector;', + 'varying vec2 vTextureCoord;', + 'varying vec2 offsetVector;', + 'varying float vColor;', + + 'void main(void) {', + ' vec3 v = translationMatrix * vec3(aVertexPosition, 1.0);', + ' v -= offsetVector.xyx;', + ' gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / projectionVector.y + 1.0 , 0.0, 1.0);', + ' vTextureCoord = aTextureCoord;', + ' vColor = aColor;', + '}' ]; -} +}; PIXI.StripShader.prototype.init = function() { - var program = PIXI.compileProgram(this.vertexSrc, this.fragmentSrc) - - var gl = PIXI.gl; - + var program = PIXI.compileProgram(this.vertexSrc, this.fragmentSrc); + + var gl = PIXI.gl; + gl.useProgram(program); - // get and store the uniforms for the shader - this.uSampler = gl.getUniformLocation(program, "uSampler"); - this.projectionVector = gl.getUniformLocation(program, "projectionVector"); - this.offsetVector = gl.getUniformLocation(program, "offsetVector"); - this.colorAttribute = gl.getAttribLocation(program, "aColor"); - //this.dimensions = gl.getUniformLocation(this.program, "dimensions"); - - // get and store the attributes - this.aVertexPosition = gl.getAttribLocation(program, "aVertexPosition"); - this.aTextureCoord = gl.getAttribLocation(program, "aTextureCoord"); - - this.translationMatrix = gl.getUniformLocation(program, "translationMatrix"); - this.alpha = gl.getUniformLocation(program, "alpha"); - - this.program = program; -} + // get and store the uniforms for the shader + this.uSampler = gl.getUniformLocation(program, 'uSampler'); + this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); + this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); + this.colorAttribute = gl.getAttribLocation(program, 'aColor'); + //this.dimensions = gl.getUniformLocation(this.program, 'dimensions'); + + // get and store the attributes + this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); + this.aTextureCoord = gl.getAttribLocation(program, 'aTextureCoord'); + + this.translationMatrix = gl.getUniformLocation(program, 'translationMatrix'); + this.alpha = gl.getUniformLocation(program, 'alpha'); + + this.program = program; +}; diff --git a/src/pixi/renderers/webgl/WebGLBatch.js b/src/pixi/renderers/webgl/WebGLBatch.js index 638150d..ba719b3 100644 --- a/src/pixi/renderers/webgl/WebGLBatch.js +++ b/src/pixi/renderers/webgl/WebGLBatch.js @@ -9,7 +9,7 @@ PIXI._batchs = []; */ PIXI._getBatch = function(gl) { - if(PIXI._batchs.length == 0) + if(PIXI._batchs.length === 0) { return new PIXI.WebGLBatch(gl); } @@ -17,27 +17,27 @@ PIXI._getBatch = function(gl) { return PIXI._batchs.pop(); } -} +}; /** * @private */ PIXI._returnBatch = function(batch) { - batch.clean(); + batch.clean(); PIXI._batchs.push(batch); -} +}; /** * @private */ PIXI._restoreBatchs = function(gl) { - for (var i=0; i < PIXI._batchs.length; i++) + for (var i=0; i < PIXI._batchs.length; i++) { - PIXI._batchs[i].restoreLostContext(gl); - }; -} + PIXI._batchs[i].restoreLostContext(gl); + } +}; /** * A WebGLBatch Enables a group of sprites to be drawn using the same settings. @@ -54,7 +54,7 @@ PIXI._restoreBatchs = function(gl) PIXI.WebGLBatch = function(gl) { this.gl = gl; - + this.size = 0; this.vertexBuffer = gl.createBuffer(); @@ -63,7 +63,7 @@ PIXI.WebGLBatch = function(gl) this.colorBuffer = gl.createBuffer(); this.blendMode = PIXI.blendModes.NORMAL; this.dynamicSize = 1; -} +}; // constructor PIXI.WebGLBatch.prototype.constructor = PIXI.WebGLBatch; @@ -83,9 +83,9 @@ PIXI.WebGLBatch.prototype.clean = function() this.texture = null; this.last = null; this.size = 0; - this.head; - this.tail; -} + this.head = null; + this.tail = null; +}; /** * Recreates the buffers in the event of a context loss @@ -100,7 +100,7 @@ PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) this.indexBuffer = gl.createBuffer(); this.uvBuffer = gl.createBuffer(); this.colorBuffer = gl.createBuffer(); -} +}; /** * inits the batch's texture and blend mode based if the supplied sprite @@ -108,7 +108,7 @@ PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) * @method init * @param sprite {Sprite} the first sprite to be added to the batch. Only sprites with * the same base texture and blend mode will be allowed to be added to this batch - */ + */ PIXI.WebGLBatch.prototype.init = function(sprite) { sprite.batch = this; @@ -120,7 +120,7 @@ PIXI.WebGLBatch.prototype.init = function(sprite) this.size = 1; this.growBatch(); -} +}; /** * inserts a sprite before the specified sprite @@ -128,7 +128,7 @@ PIXI.WebGLBatch.prototype.init = function(sprite) * @method insertBefore * @param sprite {Sprite} the sprite to be added * @param nextSprite {nextSprite} the first sprite will be inserted before this sprite - */ + */ PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) { this.size++; @@ -148,7 +148,7 @@ PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) { this.head = sprite; } -} +}; /** * inserts a sprite after the specified sprite @@ -156,7 +156,7 @@ PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) * @method insertAfter * @param sprite {Sprite} the sprite to be added * @param previousSprite {Sprite} the first sprite will be inserted after this sprite - */ + */ PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) { this.size++; @@ -175,21 +175,21 @@ PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) } else { - this.tail = sprite + this.tail = sprite; } -} +}; /** * removes a sprite from the batch * * @method remove * @param sprite {Sprite} the sprite to be removed - */ + */ PIXI.WebGLBatch.prototype.remove = function(sprite) { this.size--; - if(this.size == 0) + if(this.size === 0) { sprite.batch = null; sprite.__prev = null; @@ -214,14 +214,14 @@ PIXI.WebGLBatch.prototype.remove = function(sprite) else { this.tail = sprite.__prev; - this.tail.__next = null + this.tail.__next = null; } sprite.batch = null; sprite.__next = null; sprite.__prev = null; this.dirty = true; -} +}; /** * Splits the batch into two with the specified sprite being the start of the new batch. @@ -262,13 +262,13 @@ PIXI.WebGLBatch.prototype.split = function(sprite) this.size -= tempSize; return batch; -} +}; /** * Merges two batchs together * * @method merge - * @param batch {WebGLBatch} the batch that will be merged + * @param batch {WebGLBatch} the batch that will be merged */ PIXI.WebGLBatch.prototype.merge = function(batch) { @@ -287,7 +287,7 @@ PIXI.WebGLBatch.prototype.merge = function(batch) sprite.batch = this; sprite = sprite.__next; } -} +}; /** * Grows the size of the batch. As the elements in the batch cannot have a dynamic size this @@ -299,14 +299,15 @@ PIXI.WebGLBatch.prototype.merge = function(batch) PIXI.WebGLBatch.prototype.growBatch = function() { var gl = this.gl; - if( this.size == 1) + if( this.size === 1) { this.dynamicSize = 1; } else { - this.dynamicSize = this.size * 1.5 + this.dynamicSize = this.size * 1.5; } + // grow verts this.verticies = new Float32Array(this.dynamicSize * 8); @@ -325,10 +326,10 @@ PIXI.WebGLBatch.prototype.growBatch = function() this.dirtyColors = true; - this.indices = new Uint16Array(this.dynamicSize * 6); + this.indices = new Uint16Array(this.dynamicSize * 6); var length = this.indices.length/6; - for (var i=0; i < length; i++) + for (var i = 0; i < length; i++) { var index2 = i * 6; var index3 = i * 4; @@ -338,11 +339,11 @@ PIXI.WebGLBatch.prototype.growBatch = function() this.indices[index2 + 3] = index3 + 0; this.indices[index2 + 4] = index3 + 2; this.indices[index2 + 5] = index3 + 3; - }; + } gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); -} +}; /** * Refresh's all the data in the batch and sync's it with the webGL buffers @@ -351,16 +352,13 @@ PIXI.WebGLBatch.prototype.growBatch = function() */ PIXI.WebGLBatch.prototype.refresh = function() { - var gl = this.gl; - if (this.dynamicSize < this.size) { this.growBatch(); } var indexRun = 0; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index; - var a, b, c, d, tx, ty; + var index, colorIndex; var displayObject = this.head; @@ -381,7 +379,7 @@ PIXI.WebGLBatch.prototype.refresh = function() this.uvs[index +3] = frame.y / th; this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; + this.uvs[index +5] = (frame.y + frame.height) / th; this.uvs[index +6] = frame.x / tw; this.uvs[index +7] = (frame.y + frame.height) / th; @@ -393,12 +391,12 @@ PIXI.WebGLBatch.prototype.refresh = function() displayObject = displayObject.__next; - indexRun ++; + indexRun++; } this.dirtyUVS = true; this.dirtyColors = true; -} +}; /** * Updates all the relevant geometry and uploads the data to the GPU @@ -407,8 +405,7 @@ PIXI.WebGLBatch.prototype.refresh = function() */ PIXI.WebGLBatch.prototype.update = function() { - var gl = this.gl; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, index2, index3 + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index; var a, b, c, d, tx, ty; @@ -418,7 +415,7 @@ PIXI.WebGLBatch.prototype.update = function() var verticies = this.verticies; var uvs = this.uvs; var colors = this.colors; - + while(displayObject) { if(displayObject.vcount === PIXI.visibleCount) @@ -446,17 +443,17 @@ PIXI.WebGLBatch.prototype.update = function() tx = worldTransform[2]; ty = worldTransform[5]; - verticies[index + 0 ] = a * w1 + c * h1 + tx; + verticies[index + 0 ] = a * w1 + c * h1 + tx; verticies[index + 1 ] = d * h1 + b * w1 + ty; - verticies[index + 2 ] = a * w0 + c * h1 + tx; - verticies[index + 3 ] = d * h1 + b * w0 + ty; + verticies[index + 2 ] = a * w0 + c * h1 + tx; + verticies[index + 3 ] = d * h1 + b * w0 + ty; - verticies[index + 4 ] = a * w0 + c * h0 + tx; - verticies[index + 5 ] = d * h0 + b * w0 + ty; + verticies[index + 4 ] = a * w0 + c * h0 + tx; + verticies[index + 5 ] = d * h0 + b * w0 + ty; - verticies[index + 6] = a * w1 + c * h0 + tx; - verticies[index + 7] = d * h0 + b * w1 + ty; + verticies[index + 6] = a * w1 + c * h0 + tx; + verticies[index + 7] = d * h0 + b * w1 + ty; if(displayObject.updateFrame || displayObject.texture.updateFrame) { @@ -475,7 +472,7 @@ PIXI.WebGLBatch.prototype.update = function() uvs[index +3] = frame.y / th; uvs[index +4] = (frame.x + frame.width) / tw; - uvs[index +5] = (frame.y + frame.height) / th; + uvs[index +5] = (frame.y + frame.height) / th; uvs[index +6] = frame.x / tw; uvs[index +7] = (frame.y + frame.height) / th; @@ -484,7 +481,7 @@ PIXI.WebGLBatch.prototype.update = function() } // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + if(displayObject.cacheAlpha !== displayObject.worldAlpha) { displayObject.cacheAlpha = displayObject.worldAlpha; @@ -502,8 +499,8 @@ PIXI.WebGLBatch.prototype.update = function() indexRun++; displayObject = displayObject.__next; - } -} + } +}; /** * Draws the batch to the frame buffer @@ -514,15 +511,16 @@ PIXI.WebGLBatch.prototype.render = function(start, end) { start = start || 0; - if(end == undefined)end = this.size; - + if(end === undefined) + end = this.size; + if(this.dirty) { this.refresh(); this.dirty = false; } - if (this.size == 0)return; + if (this.size === 0)return; this.update(); var gl = this.gl; @@ -530,13 +528,13 @@ PIXI.WebGLBatch.prototype.render = function(start, end) //TODO optimize this! var shaderProgram = PIXI.defaultShader; - + //gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); // ok.. - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies) + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies); gl.vertexAttribPointer(shaderProgram.aVertexPosition, 2, gl.FLOAT, false, 0, 0); // update the uvs //var isDefault = (shaderProgram == PIXI.shaderProgram) @@ -571,4 +569,4 @@ PIXI.WebGLBatch.prototype.render = function(start, end) // DRAW THAT this! gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); -} +}; diff --git a/src/pixi/renderers/webgl/WebGLFilterManager.js b/src/pixi/renderers/webgl/WebGLFilterManager.js index a98afb4..2dd4b75 100644 --- a/src/pixi/renderers/webgl/WebGLFilterManager.js +++ b/src/pixi/renderers/webgl/WebGLFilterManager.js @@ -5,524 +5,507 @@ PIXI.WebGLFilterManager = function(transparent) { - this.transparent = transparent; - - this.filterStack = []; - this.texturePool = []; - - this.offsetX = 0; - this.offsetY = 0; - - this.initShaderBuffers(); -} + this.transparent = transparent; + + this.filterStack = []; + this.texturePool = []; + + this.offsetX = 0; + this.offsetY = 0; + + this.initShaderBuffers(); +}; // API PIXI.WebGLFilterManager.prototype.begin = function(projection, buffer) { - this.width = projection.x * 2; - this.height = -projection.y * 2; - this.buffer = buffer; -} + this.width = projection.x * 2; + this.height = -projection.y * 2; + this.buffer = buffer; +}; PIXI.WebGLFilterManager.prototype.pushFilter = function(filterBlock) { - var gl = PIXI.gl; + var gl = PIXI.gl; - // filter program - // OPTIMISATION - the first filter is free if its a simple color change? - this.filterStack.push(filterBlock); + // filter program + // OPTIMISATION - the first filter is free if its a simple color change? + this.filterStack.push(filterBlock); - var filter = filterBlock.filterPasses[0]; + var filter = filterBlock.filterPasses[0]; - + this.offsetX += filterBlock.target.filterArea.x; + this.offsetY += filterBlock.target.filterArea.y; - this.offsetX += filterBlock.target.filterArea.x; - this.offsetY += filterBlock.target.filterArea.y; - - - - - - var texture = this.texturePool.pop(); - if(!texture) - { - texture = new PIXI.FilterTexture(this.width, this.height); - } - else - { - texture.resize(this.width, this.height); - } + var texture = this.texturePool.pop(); + if(!texture) + { + texture = new PIXI.FilterTexture(this.width, this.height); + } + else + { + texture.resize(this.width, this.height); + } - gl.bindTexture(gl.TEXTURE_2D, texture.texture); - - this.getBounds(filterBlock.target); - - // addpadding? - //displayObject.filterArea.x + gl.bindTexture(gl.TEXTURE_2D, texture.texture); - var filterArea = filterBlock.target.filterArea; + this.getBounds(filterBlock.target); - var padidng = filter.padding; - filterArea.x -= padidng; - filterArea.y -= padidng; - filterArea.width += padidng * 2; - filterArea.height += padidng * 2; + // addpadding? + //displayObject.filterArea.x - // cap filter to screen size.. - if(filterArea.x < 0)filterArea.x = 0; - if(filterArea.width > this.width)filterArea.width = this.width; - if(filterArea.y < 0)filterArea.y = 0; - if(filterArea.height > this.height)filterArea.height = this.height; + var filterArea = filterBlock.target.filterArea; + var padidng = filter.padding; + filterArea.x -= padidng; + filterArea.y -= padidng; + filterArea.width += padidng * 2; + filterArea.height += padidng * 2; - //gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, filterArea.width, filterArea.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, texture.frameBuffer); - - // console.log(filterArea) - // set view port - gl.viewport(0, 0, filterArea.width, filterArea.height); - - PIXI.projection.x = filterArea.width/2; - PIXI.projection.y = -filterArea.height/2; - - PIXI.offset.x = -filterArea.x; - PIXI.offset.y = -filterArea.y; + // cap filter to screen size.. + if(filterArea.x < 0)filterArea.x = 0; + if(filterArea.width > this.width)filterArea.width = this.width; + if(filterArea.y < 0)filterArea.y = 0; + if(filterArea.height > this.height)filterArea.height = this.height; - //console.log(PIXI.defaultShader.projectionVector) - // update projection - gl.uniform2f(PIXI.defaultShader.projectionVector, filterArea.width/2, -filterArea.height/2); - gl.uniform2f(PIXI.defaultShader.offsetVector, -filterArea.x, -filterArea.y); - //PIXI.primitiveProgram + //gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, filterArea.width, filterArea.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.bindFramebuffer(gl.FRAMEBUFFER, texture.frameBuffer); - gl.colorMask(true, true, true, true); - gl.clearColor(0,0,0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); - - //filter.texture = texture; - filterBlock._glFilterTexture = texture; + //console.log(filterArea) + // set view port + gl.viewport(0, 0, filterArea.width, filterArea.height); - //console.log("PUSH") -} + PIXI.projection.x = filterArea.width/2; + PIXI.projection.y = -filterArea.height/2; + + PIXI.offset.x = -filterArea.x; + PIXI.offset.y = -filterArea.y; + + //console.log(PIXI.defaultShader.projectionVector) + // update projection + gl.uniform2f(PIXI.defaultShader.projectionVector, filterArea.width/2, -filterArea.height/2); + gl.uniform2f(PIXI.defaultShader.offsetVector, -filterArea.x, -filterArea.y); + //PIXI.primitiveProgram + + gl.colorMask(true, true, true, true); + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + + //filter.texture = texture; + filterBlock._glFilterTexture = texture; + + //console.log("PUSH") +}; PIXI.WebGLFilterManager.prototype.popFilter = function() { - - var gl = PIXI.gl; - - var filterBlock = this.filterStack.pop(); + var gl = PIXI.gl; + var filterBlock = this.filterStack.pop(); + var filterArea = filterBlock.target.filterArea; + var texture = filterBlock._glFilterTexture; + + if(filterBlock.filterPasses.length > 1) + { + gl.viewport(0, 0, filterArea.width, filterArea.height); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + + this.vertexArray[0] = 0; + this.vertexArray[1] = filterArea.height; + + this.vertexArray[2] = filterArea.width; + this.vertexArray[3] = filterArea.height; + + this.vertexArray[4] = 0; + this.vertexArray[5] = 0; + + this.vertexArray[6] = filterArea.width; + this.vertexArray[7] = 0; + + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + // nnow set the uvs.. + this.uvArray[2] = filterArea.width/this.width; + this.uvArray[5] = filterArea.height/this.height; + this.uvArray[6] = filterArea.width/this.width; + this.uvArray[7] = filterArea.height/this.height; + + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); + + var inputTexture = texture; + var outputTexture = this.texturePool.pop(); + if(!outputTexture)outputTexture = new PIXI.FilterTexture(this.width, this.height); + + // need to clear this FBO as it may have some left over elements from a prvious filter. + gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.disable(gl.BLEND); + + for (var i = 0; i < filterBlock.filterPasses.length-1; i++) + { + var filterPass = filterBlock.filterPasses[i]; + + gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); + + // set texture + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, inputTexture.texture); + + // draw texture.. + //filterPass.applyFilterPass(filterArea.width, filterArea.height); + this.applyFilterPass(filterPass, filterArea, filterArea.width, filterArea.height); + + // swap the textures.. + var temp = inputTexture; + inputTexture = outputTexture; + outputTexture = temp; + } + + gl.enable(gl.BLEND); + + texture = inputTexture; + this.texturePool.push(outputTexture); + } + + var filter = filterBlock.filterPasses[filterBlock.filterPasses.length-1]; + + this.offsetX -= filterArea.x; + this.offsetY -= filterArea.y; + + + var sizeX = this.width; + var sizeY = this.height; + + var offsetX = 0; + var offsetY = 0; + + var buffer = this.buffer; + + // time to render the filters texture to the previous scene + if(this.filterStack.length === 0) + { + gl.colorMask(true, true, true, this.transparent); + } + else + { + var currentFilter = this.filterStack[this.filterStack.length-1]; + filterArea = currentFilter.target.filterArea; + + sizeX = filterArea.width; + sizeY = filterArea.height; + + offsetX = filterArea.x; + offsetY = filterArea.y; + + buffer = currentFilter._glFilterTexture.frameBuffer; + } - var filterArea = filterBlock.target.filterArea; + // TODO need toremove thease global elements.. + PIXI.projection.x = sizeX/2; + PIXI.projection.y = -sizeY/2; - var texture = filterBlock._glFilterTexture; + PIXI.offset.x = offsetX; + PIXI.offset.y = offsetY; - if(filterBlock.filterPasses.length > 1) - { - gl.viewport(0, 0, filterArea.width, filterArea.height); + filterArea = filterBlock.target.filterArea; - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - - this.vertexArray[0] = 0; - this.vertexArray[1] = filterArea.height; - - this.vertexArray[2] = filterArea.width; - this.vertexArray[3] = filterArea.height; - - this.vertexArray[4] = 0; - this.vertexArray[5] = 0; - - this.vertexArray[6] = filterArea.width; - this.vertexArray[7] = 0; + var x = filterArea.x-offsetX; + var y = filterArea.y-offsetY; + // update the buffers.. + // make sure to flip the y! + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); + this.vertexArray[0] = x; + this.vertexArray[1] = y + filterArea.height; - - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - // nnow set the uvs.. - this.uvArray[2] = filterArea.width/this.width; - this.uvArray[5] = filterArea.height/this.height; - this.uvArray[6] = filterArea.width/this.width; - this.uvArray[7] = filterArea.height/this.height; - - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); + this.vertexArray[2] = x + filterArea.width; + this.vertexArray[3] = y + filterArea.height; - var inputTexture = texture; - var outputTexture = this.texturePool.pop(); - if(!outputTexture)outputTexture = new PIXI.FilterTexture(this.width, this.height); - - // need to clear this FBO as it may have some left over elements from a prvious filter. - gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); - gl.clear(gl.COLOR_BUFFER_BIT); - - gl.disable(gl.BLEND); - - for (var i = 0; i < filterBlock.filterPasses.length-1; i++) - { - var filterPass = filterBlock.filterPasses[i]; - - gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); - - // set texture - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, inputTexture.texture); - - // draw texture.. - //filterPass.applyFilterPass(filterArea.width, filterArea.height); - this.applyFilterPass(filterPass, filterArea, filterArea.width, filterArea.height); + this.vertexArray[4] = x; + this.vertexArray[5] = y; - // swap the textures.. - var temp = inputTexture; - inputTexture = outputTexture; - outputTexture = temp; - - }; + this.vertexArray[6] = x + filterArea.width; + this.vertexArray[7] = y; - gl.enable(gl.BLEND); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); - texture = inputTexture; - this.texturePool.push(outputTexture); - } + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - var filter = filterBlock.filterPasses[filterBlock.filterPasses.length-1]; - - this.offsetX -= filterArea.x; - this.offsetY -= filterArea.y; + this.uvArray[2] = filterArea.width/this.width; + this.uvArray[5] = filterArea.height/this.height; + this.uvArray[6] = filterArea.width/this.width; + this.uvArray[7] = filterArea.height/this.height; - - var sizeX = this.width; - var sizeY = this.height; - - var offsetX = 0; - var offsetY = 0; - - var buffer = this.buffer; - - // time to render the filters texture to the previous scene - if(this.filterStack.length === 0) - { - gl.colorMask(true, true, true, this.transparent); - } - else - { - var currentFilter = this.filterStack[this.filterStack.length-1]; - var filterArea = currentFilter.target.filterArea; - - sizeX = filterArea.width; - sizeY = filterArea.height; - - offsetX = filterArea.x; - offsetY = filterArea.y; - - buffer = currentFilter._glFilterTexture.frameBuffer; - } - - + gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); - // TODO need toremove thease global elements.. - PIXI.projection.x = sizeX/2; - PIXI.projection.y = -sizeY/2; + gl.viewport(0, 0, sizeX, sizeY); + // bind the buffer + gl.bindFramebuffer(gl.FRAMEBUFFER, buffer ); - PIXI.offset.x = offsetX; - PIXI.offset.y = offsetY; - - - var filterArea = filterBlock.target.filterArea; - var x = filterArea.x-offsetX; - var y = filterArea.y-offsetY; - - // update the buffers.. - // make sure to flip the y! - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - - this.vertexArray[0] = x; - this.vertexArray[1] = y + filterArea.height; - - this.vertexArray[2] = x + filterArea.width; - this.vertexArray[3] = y + filterArea.height; - - this.vertexArray[4] = x; - this.vertexArray[5] = y; - - this.vertexArray[6] = x + filterArea.width; - this.vertexArray[7] = y; - - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - - this.uvArray[2] = filterArea.width/this.width; - this.uvArray[5] = filterArea.height/this.height; - this.uvArray[6] = filterArea.width/this.width; - this.uvArray[7] = filterArea.height/this.height; - - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); - - gl.viewport(0, 0, sizeX, sizeY); - // bind the buffer - gl.bindFramebuffer(gl.FRAMEBUFFER, buffer ); - - // set texture + // set texture gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture.texture); - - // apply! - //filter.applyFilterPass(sizeX, sizeY); - this.applyFilterPass(filter, filterArea, sizeX, sizeY); + gl.bindTexture(gl.TEXTURE_2D, texture.texture); - // now restore the regular shader.. + // apply! + //filter.applyFilterPass(sizeX, sizeY); + this.applyFilterPass(filter, filterArea, sizeX, sizeY); + + // now restore the regular shader.. gl.useProgram(PIXI.defaultShader.program); - gl.uniform2f(PIXI.defaultShader.projectionVector, sizeX/2, -sizeY/2); - gl.uniform2f(PIXI.defaultShader.offsetVector, -offsetX, -offsetY); + gl.uniform2f(PIXI.defaultShader.projectionVector, sizeX/2, -sizeY/2); + gl.uniform2f(PIXI.defaultShader.offsetVector, -offsetX, -offsetY); - // return the texture to the pool - this.texturePool.push(texture); - filterBlock._glFilterTexture = null; -} + // return the texture to the pool + this.texturePool.push(texture); + filterBlock._glFilterTexture = null; +}; PIXI.WebGLFilterManager.prototype.applyFilterPass = function(filter, filterArea, width, height) { - // use program - var gl = PIXI.gl; + // use program + var gl = PIXI.gl; + var shader = filter.shader; - if(!filter.shader) - { - var shader = new PIXI.PixiShader(); - - shader.fragmentSrc = filter.fragmentSrc; - shader.uniforms = filter.uniforms; - shader.init(); - - filter.shader = shader; - } + if(!shader) + { + shader = new PIXI.PixiShader(); - var shader = filter.shader; - - // set the shader - gl.useProgram(shader.program); + shader.fragmentSrc = filter.fragmentSrc; + shader.uniforms = filter.uniforms; + shader.init(); - gl.uniform2f(shader.projectionVector, width/2, -height/2); - gl.uniform2f(shader.offsetVector, 0,0) + filter.shader = shader; + } - if(filter.uniforms.dimensions) - { - //console.log(filter.uniforms.dimensions) - filter.uniforms.dimensions.value[0] = this.width;//width; - filter.uniforms.dimensions.value[1] = this.height;//height; - filter.uniforms.dimensions.value[2] = this.vertexArray[0]; - filter.uniforms.dimensions.value[3] = this.vertexArray[5];//filterArea.height; - // console.log(this.vertexArray[5]) - } + // set the shader + gl.useProgram(shader.program); - shader.syncUniforms(); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.uniform2f(shader.projectionVector, width/2, -height/2); + gl.uniform2f(shader.offsetVector, 0,0); + + if(filter.uniforms.dimensions) + { + //console.log(filter.uniforms.dimensions) + filter.uniforms.dimensions.value[0] = this.width;//width; + filter.uniforms.dimensions.value[1] = this.height;//height; + filter.uniforms.dimensions.value[2] = this.vertexArray[0]; + filter.uniforms.dimensions.value[3] = this.vertexArray[5];//filterArea.height; + // console.log(this.vertexArray[5]) + } + + shader.syncUniforms(); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); - + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - - // draw the filter... + + // draw the filter... gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); -} +}; PIXI.WebGLFilterManager.prototype.initShaderBuffers = function() { - var gl = PIXI.gl; - - // create some buffers - this.vertexBuffer = gl.createBuffer(); - this.uvBuffer = gl.createBuffer(); - this.indexBuffer = gl.createBuffer(); - - // bind and upload the vertexs.. - // keep a refferance to the vertexFloatData.. - this.vertexArray = new Float32Array([0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 1.0, 1.0]); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bufferData( - gl.ARRAY_BUFFER, - this.vertexArray, + var gl = PIXI.gl; + + // create some buffers + this.vertexBuffer = gl.createBuffer(); + this.uvBuffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + + // bind and upload the vertexs.. + // keep a refferance to the vertexFloatData.. + this.vertexArray = new Float32Array([0.0, 0.0, + 1.0, 0.0, + 0.0, 1.0, + 1.0, 1.0]); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + this.vertexArray, gl.STATIC_DRAW); - - + + // bind and upload the uv buffer - this.uvArray = new Float32Array([0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 1.0, 1.0]); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - gl.bufferData( - gl.ARRAY_BUFFER, - this.uvArray, + this.uvArray = new Float32Array([0.0, 0.0, + 1.0, 0.0, + 0.0, 1.0, + 1.0, 1.0]); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + this.uvArray, gl.STATIC_DRAW); - - // bind and upload the index - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - gl.bufferData( - gl.ELEMENT_ARRAY_BUFFER, - new Uint16Array([0, 1, 2, 1, 3, 2]), + + // bind and upload the index + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData( + gl.ELEMENT_ARRAY_BUFFER, + new Uint16Array([0, 1, 2, 1, 3, 2]), gl.STATIC_DRAW); -} +}; PIXI.WebGLFilterManager.prototype.getBounds = function(displayObject) { - // time to get the width and height of the object! - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, doTest; - var a, b, c, d, tx, ty, x1, x2, x3, x4, y1, y2, y3, y4; + // time to get the width and height of the object! + var worldTransform, width, height, aX, aY, w0, w1, h0, h1, doTest; + var a, b, c, d, tx, ty, x1, x2, x3, x4, y1, y2, y3, y4; - var tempObject = displayObject.first; - var testObject = displayObject.last._iNext; - - var maxX = -Infinity; - var maxY = -Infinity; - - var minX = Infinity; - var minY = Infinity; - - do - { - // TODO can be optimized! - what if there is no scale / rotation? - - if(tempObject.visible) - { - if(tempObject instanceof PIXI.Sprite) - { - width = tempObject.texture.frame.width; - height = tempObject.texture.frame.height; + var tempObject = displayObject.first; + var testObject = displayObject.last._iNext; - // TODO trim?? - aX = tempObject.anchor.x; - aY = tempObject.anchor.y; - w0 = width * (1-aX); - w1 = width * -aX; + var maxX = -Infinity; + var maxY = -Infinity; - h0 = height * (1-aY); - h1 = height * -aY; + var minX = Infinity; + var minY = Infinity; - doTest = true; - } - else if(tempObject instanceof PIXI.Graphics) - { - tempObject.updateFilterBounds(); + do + { + // TODO can be optimized! - what if there is no scale / rotation? - var bounds = tempObject.bounds; + if(tempObject.visible) + { + if(tempObject instanceof PIXI.Sprite) + { + width = tempObject.texture.frame.width; + height = tempObject.texture.frame.height; - width = bounds.width; - height = bounds.height; + // TODO trim?? + aX = tempObject.anchor.x; + aY = tempObject.anchor.y; + w0 = width * (1-aX); + w1 = width * -aX; - w0 = bounds.x - w1 = bounds.x + bounds.width; + h0 = height * (1-aY); + h1 = height * -aY; - h0 = bounds.y - h1 = bounds.y + bounds.height; + doTest = true; + } + else if(tempObject instanceof PIXI.Graphics) + { + tempObject.updateFilterBounds(); - doTest = true; - } - } - - if(doTest) - { - worldTransform = tempObject.worldTransform; + var bounds = tempObject.bounds; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + width = bounds.width; + height = bounds.height; - x1 = a * w1 + c * h1 + tx; - y1 = d * h1 + b * w1 + ty; + w0 = bounds.x; + w1 = bounds.x + bounds.width; - x2 = a * w0 + c * h1 + tx; - y2 = d * h1 + b * w0 + ty; + h0 = bounds.y; + h1 = bounds.y + bounds.height; - x3 = a * w0 + c * h0 + tx; - y3 = d * h0 + b * w0 + ty; + doTest = true; + } + } - x4 = a * w1 + c * h0 + tx; - y4 = d * h0 + b * w1 + ty; + if(doTest) + { + worldTransform = tempObject.worldTransform; - minX = x1 < minX ? x1 : minX; - minX = x2 < minX ? x2 : minX; - minX = x3 < minX ? x3 : minX; - minX = x4 < minX ? x4 : minX; - - minY = y1 < minY ? y1 : minY; - minY = y2 < minY ? y2 : minY; - minY = y3 < minY ? y3 : minY; - minY = y4 < minY ? y4 : minY; - - maxX = x1 > maxX ? x1 : maxX; - maxX = x2 > maxX ? x2 : maxX; - maxX = x3 > maxX ? x3 : maxX; - maxX = x4 > maxX ? x4 : maxX; - - maxY = y1 > maxY ? y1 : maxY; - maxY = y2 > maxY ? y2 : maxY; - maxY = y3 > maxY ? y3 : maxY; - maxY = y4 > maxY ? y4 : maxY; - } + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - doTest = false; - tempObject = tempObject._iNext; + x1 = a * w1 + c * h1 + tx; + y1 = d * h1 + b * w1 + ty; - } - while(tempObject != testObject) - - // maximum bounds is the size of the screen.. - //minX = minX > 0 ? minX : 0; - //minY = minY > 0 ? minY : 0; + x2 = a * w0 + c * h1 + tx; + y2 = d * h1 + b * w0 + ty; - displayObject.filterArea.x = minX; - displayObject.filterArea.y = minY; + x3 = a * w0 + c * h0 + tx; + y3 = d * h0 + b * w0 + ty; -// console.log(maxX+ " : " + minX) - displayObject.filterArea.width = maxX - minX; - displayObject.filterArea.height = maxY - minY; -} + x4 = a * w1 + c * h0 + tx; + y4 = d * h0 + b * w1 + ty; + + minX = x1 < minX ? x1 : minX; + minX = x2 < minX ? x2 : minX; + minX = x3 < minX ? x3 : minX; + minX = x4 < minX ? x4 : minX; + + minY = y1 < minY ? y1 : minY; + minY = y2 < minY ? y2 : minY; + minY = y3 < minY ? y3 : minY; + minY = y4 < minY ? y4 : minY; + + maxX = x1 > maxX ? x1 : maxX; + maxX = x2 > maxX ? x2 : maxX; + maxX = x3 > maxX ? x3 : maxX; + maxX = x4 > maxX ? x4 : maxX; + + maxY = y1 > maxY ? y1 : maxY; + maxY = y2 > maxY ? y2 : maxY; + maxY = y3 > maxY ? y3 : maxY; + maxY = y4 > maxY ? y4 : maxY; + } + + doTest = false; + tempObject = tempObject._iNext; + + } + while(tempObject !== testObject); + + // maximum bounds is the size of the screen.. + //minX = minX > 0 ? minX : 0; + //minY = minY > 0 ? minY : 0; + + displayObject.filterArea.x = minX; + displayObject.filterArea.y = minY; + +// console.log(maxX+ " : " + minX) + displayObject.filterArea.width = maxX - minX; + displayObject.filterArea.height = maxY - minY; +}; PIXI.FilterTexture = function(width, height) { - var gl = PIXI.gl; - + var gl = PIXI.gl; + // next time to create a frame buffer and texture - this.frameBuffer = gl.createFramebuffer(); + this.frameBuffer = gl.createFramebuffer(); this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer ); - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer ); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); - - this.resize(width, height); -} + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer ); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); + + this.resize(width, height); +}; PIXI.FilterTexture.prototype.resize = function(width, height) { - if(this.width == width && this.height == height)return; + if(this.width === width && this.height === height) return; - this.width = width; - this.height = height; + this.width = width; + this.height = height; - var gl = PIXI.gl; + var gl = PIXI.gl; - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - -} \ No newline at end of file + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + +}; diff --git a/src/pixi/renderers/webgl/WebGLGraphics.js b/src/pixi/renderers/webgl/WebGLGraphics.js index b2fac2c..50ba448 100644 --- a/src/pixi/renderers/webgl/WebGLGraphics.js +++ b/src/pixi/renderers/webgl/WebGLGraphics.js @@ -9,8 +9,8 @@ */ PIXI.WebGLGraphics = function() { - -} + +}; /** * Renders the graphics object @@ -24,61 +24,60 @@ PIXI.WebGLGraphics = function() PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) { var gl = PIXI.gl; - - if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, + + if(!graphics._webGL)graphics._webGL = {points:[], indices:[], lastIndex:0, buffer:gl.createBuffer(), indexBuffer:gl.createBuffer()}; - + if(graphics.dirty) { graphics.dirty = false; - + if(graphics.clearDirty) { graphics.clearDirty = false; - + graphics._webGL.lastIndex = 0; graphics._webGL.points = []; graphics._webGL.indices = []; - + } - + PIXI.WebGLGraphics.updateGraphics(graphics); } - + PIXI.activatePrimitiveShader(); - + // This could be speeded up fo sure! var m = PIXI.mat3.clone(graphics.worldTransform); - + PIXI.mat3.transpose(m); - - // set the matrix transform for the + + // set the matrix transform for the gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); gl.uniformMatrix3fv(PIXI.primitiveShader.translationMatrix, false, m); - + gl.uniform2f(PIXI.primitiveShader.projectionVector, projection.x, -projection.y); gl.uniform2f(PIXI.primitiveShader.offsetVector, -PIXI.offset.x, -PIXI.offset.y); - + gl.uniform1f(PIXI.primitiveShader.alpha, graphics.worldAlpha); gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); - + gl.vertexAttribPointer(PIXI.primitiveShader.aVertexPosition, 2, gl.FLOAT, false, 4 * 6, 0); gl.vertexAttribPointer(PIXI.primitiveShader.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); - + // set the index buffer! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); - + gl.drawElements(gl.TRIANGLE_STRIP, graphics._webGL.indices.length, gl.UNSIGNED_SHORT, 0 ); - + PIXI.deactivatePrimitiveShader(); - - + // return to default shader... // PIXI.activateShader(PIXI.defaultShader); -} +}; /** * Updates the graphics object @@ -90,47 +89,47 @@ PIXI.WebGLGraphics.renderGraphics = function(graphics, projection) */ PIXI.WebGLGraphics.updateGraphics = function(graphics) { - for (var i=graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) + for (var i = graphics._webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; - - if(data.type == PIXI.Graphics.POLY) + + if(data.type === PIXI.Graphics.POLY) { if(data.fill) { - if(data.points.length>3) - PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); + if(data.points.length>3) + PIXI.WebGLGraphics.buildPoly(data, graphics._webGL); } - + if(data.lineWidth > 0) { PIXI.WebGLGraphics.buildLine(data, graphics._webGL); } } - else if(data.type == PIXI.Graphics.RECT) + else if(data.type === PIXI.Graphics.RECT) { PIXI.WebGLGraphics.buildRectangle(data, graphics._webGL); } - else if(data.type == PIXI.Graphics.CIRC || data.type == PIXI.Graphics.ELIP) + else if(data.type === PIXI.Graphics.CIRC || data.type === PIXI.Graphics.ELIP); { PIXI.WebGLGraphics.buildCircle(data, graphics._webGL); } - }; - + } + graphics._webGL.lastIndex = graphics.graphicsData.length; - + var gl = PIXI.gl; graphics._webGL.glPoints = new Float32Array(graphics._webGL.points); - + gl.bindBuffer(gl.ARRAY_BUFFER, graphics._webGL.buffer); gl.bufferData(gl.ARRAY_BUFFER, graphics._webGL.glPoints, gl.STATIC_DRAW); - + graphics._webGL.glIndicies = new Uint16Array(graphics._webGL.indices); - + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, graphics._webGL.glIndicies, gl.STATIC_DRAW); -} +}; /** * Builds a rectangle to draw @@ -145,45 +144,45 @@ 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 color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; - + var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; - + var verts = webGLData.points; var indices = webGLData.indices; - + var vertPos = verts.length/6; - + // 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); - + // insert 2 dead triangles.. - indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3) + indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3); } - + if(graphicsData.lineWidth) { graphicsData.points = [x, y, @@ -191,11 +190,10 @@ PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) x + width, y + height, x, y + height, x, y]; - + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); } - -} +}; /** * Builds a circle to draw @@ -210,60 +208,61 @@ PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) { // --- // // need to convert points to a nice regular data - // + // var rectData = graphicsData.points; var x = rectData[0]; var y = rectData[1]; var width = rectData[2]; var height = rectData[3]; - + var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; - + + var i = 0; + if(graphicsData.fill) { - var color = HEXtoRGB(graphicsData.fillColor); + var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; - + var verts = webGLData.points; var indices = webGLData.indices; - + var vecPos = verts.length/6; - + indices.push(vecPos); - - for (var i=0; i < totalSegs + 1 ; i++) + + for (i = 0; i < totalSegs + 1 ; i++) { verts.push(x,y, r, g, b, alpha); - + verts.push(x + Math.sin(seg * i) * width, y + Math.cos(seg * i) * height, r, g, b, alpha); - + indices.push(vecPos++, vecPos++); - }; - + } + indices.push(vecPos-1); } - + if(graphicsData.lineWidth) { graphicsData.points = []; - - for (var i=0; i < totalSegs + 1; i++) + + for (i = 0; i < totalSegs + 1; i++) { graphicsData.points.push(x + Math.sin(seg * i) * width, - y + Math.cos(seg * i) * height) - }; - + y + Math.cos(seg * i) * height); + } + PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); } - -} +}; /** * Builds a line to draw @@ -277,97 +276,96 @@ PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { // TODO OPTIMISE! - - var wrap = true; + var i = 0; + var points = graphicsData.points; - if(points.length == 0)return; - + if(points.length === 0)return; + // if the line width is an odd number add 0.5 to align to a whole pixel if(graphicsData.lineWidth%2) { - for (var i = 0; i < points.length; i++) { + for (i = 0; i < points.length; i++) { points[i] += 0.5; - }; + } } // 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) + 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) + points.push(midPointX, midPointY); } - + var verts = webGLData.points; var indices = webGLData.indices; var length = points.length / 2; var indexCount = points.length; var indexStart = verts.length/6; - + // DRAW the Line var width = graphicsData.lineWidth / 2; - + // sort color - var color = HEXtoRGB(graphicsData.lineColor); + var color = PIXI.hex2rgb(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; - - var p1x, p1y, p2x, p2y, p3x, p3y; + + var px, py, p1x, p1y, p2x, p2y, p3x, p3y; var perpx, perpy, perp2x, perp2y, perp3x, perp3y; - var ipx, ipy; var a1, b1, c1, a2, b2, c2; var denom, pdist, dist; - + p1x = points[0]; p1y = points[1]; - + p2x = points[2]; p2y = points[3]; - + perpx = -(p1y - p2y); perpy = p1x - p2x; - + dist = Math.sqrt(perpx*perpx + perpy*perpy); - + perpx /= dist; perpy /= dist; perpx *= width; perpy *= width; - + // start verts.push(p1x - perpx , p1y - perpy, r, g, b, alpha); - + verts.push(p1x + perpx , p1y + perpy, r, g, b, alpha); - - for (var i = 1; i < length-1; i++) + + for (i = 1; i < length-1; i++) { p1x = points[(i-1)*2]; p1y = points[(i-1)*2 + 1]; - - p2x = points[(i)*2] - p2y = points[(i)*2 + 1] - + + p2x = points[(i)*2]; + p2y = points[(i)*2 + 1]; + p3x = points[(i+1)*2]; p3y = points[(i+1)*2 + 1]; - + perpx = -(p1y - p2y); perpy = p1x - p2x; - + dist = Math.sqrt(perpx*perpx + perpy*perpy); perpx /= dist; perpy /= dist; @@ -376,62 +374,62 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) perp2x = -(p2y - p3y); perp2y = p2x - p3x; - + dist = Math.sqrt(perp2x*perp2x + perp2y*perp2y); perp2x /= dist; perp2y /= dist; perp2x *= width; perp2y *= width; - + a1 = (-perpy + p1y) - (-perpy + p2y); b1 = (-perpx + p2x) - (-perpx + p1x); c1 = (-perpx + p1x) * (-perpy + p2y) - (-perpx + p2x) * (-perpy + p1y); a2 = (-perp2y + p3y) - (-perp2y + p2y); b2 = (-perp2x + p2x) - (-perp2x + p3x); c2 = (-perp2x + p3x) * (-perp2y + p2y) - (-perp2x + p2x) * (-perp2y + p3y); - + denom = a1*b2 - a2*b1; - if(Math.abs(denom) < 0.1 ) + if(Math.abs(denom) < 0.1 ) { - + denom+=10.1; verts.push(p2x - perpx , p2y - perpy, r, g, b, alpha); - + verts.push(p2x + perpx , p2y + perpy, r, g, b, alpha); - + continue; } - + px = (b1*c2 - b2*c1)/denom; py = (a2*c1 - a1*c2)/denom; - - + + pdist = (px -p2x) * (px -p2x) + (py -p2y) + (py -p2y); - + if(pdist > 140 * 140) { perp3x = perpx - perp2x; perp3y = perpy - perp2y; - + dist = Math.sqrt(perp3x*perp3x + perp3y*perp3y); perp3x /= dist; perp3y /= dist; perp3x *= width; perp3y *= width; - + verts.push(p2x - perp3x, p2y -perp3y); verts.push(r, g, b, alpha); - + verts.push(p2x + perp3x, p2y +perp3y); verts.push(r, g, b, alpha); - + verts.push(p2x - perp3x, p2y -perp3y); verts.push(r, g, b, alpha); - + indexCount++; } else @@ -439,42 +437,42 @@ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) verts.push(px , py); verts.push(r, g, b, alpha); - + verts.push(p2x - (px-p2x), p2y - (py - p2y)); verts.push(r, g, b, alpha); } } - - p1x = points[(length-2)*2] - p1y = points[(length-2)*2 + 1] - - p2x = points[(length-1)*2] - p2y = points[(length-1)*2 + 1] - - perpx = -(p1y - p2y) + + p1x = points[(length-2)*2]; + p1y = points[(length-2)*2 + 1]; + + p2x = points[(length-1)*2]; + p2y = points[(length-1)*2 + 1]; + + perpx = -(p1y - p2y); perpy = p1x - p2x; - + dist = Math.sqrt(perpx*perpx + perpy*perpy); perpx /= dist; perpy /= dist; perpx *= width; perpy *= width; - - verts.push(p2x - perpx , p2y - perpy) + + verts.push(p2x - perpx , p2y - perpy); verts.push(r, g, b, alpha); - - verts.push(p2x + perpx , p2y + perpy) + + verts.push(p2x + perpx , p2y + perpy); verts.push(r, g, b, alpha); - + indices.push(indexStart); - - for (var i=0; i < indexCount; i++) + + for (i = 0; i < indexCount; i++) { indices.push(indexStart++); - }; - + } + indices.push(indexStart-1); -} +}; /** * Builds a polygon to draw @@ -489,44 +487,38 @@ PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) { var points = graphicsData.points; if(points.length < 6)return; - + // get first and last point.. figure out the middle! var verts = webGLData.points; var indices = webGLData.indices; - + var length = points.length / 2; - + // sort color - var color = HEXtoRGB(graphicsData.fillColor); + var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; - + var triangles = PIXI.PolyK.Triangulate(points); - + var vertPos = verts.length / 6; - - for (var i=0; i < triangles.length; i+=3) + + var i = 0; + + for (i = 0; i < triangles.length; i+=3) { indices.push(triangles[i] + vertPos); indices.push(triangles[i] + vertPos); indices.push(triangles[i+1] + vertPos); indices.push(triangles[i+2] +vertPos); indices.push(triangles[i+2] + vertPos); - }; - - for (var i = 0; i < length; i++) + } + + for (i = 0; i < length; i++) { verts.push(points[i * 2], points[i * 2 + 1], r, g, b, alpha); - }; -} - -function HEXtoRGB(hex) { - return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; -} - - - - + } +}; diff --git a/src/pixi/renderers/webgl/WebGLRenderGroup.js b/src/pixi/renderers/webgl/WebGLRenderGroup.js index 990d9be..47d8b96 100644 --- a/src/pixi/renderers/webgl/WebGLRenderGroup.js +++ b/src/pixi/renderers/webgl/WebGLRenderGroup.js @@ -18,16 +18,16 @@ PIXI.WebGLRenderGroup = function(gl, transparent) { this.gl = gl; - this.root; - - this.backgroundColor; - this.transparent = transparent == undefined ? true : transparent; - + this.root = null; + + this.backgroundColor = undefined; + this.transparent = transparent === undefined ? true : transparent; + this.batchs = []; this.toRemove = []; - console.log(this.transparent) + //console.log(this.transparent); this.filterManager = new PIXI.WebGLFilterManager(this.transparent); -} +}; // constructor PIXI.WebGLRenderGroup.prototype.constructor = PIXI.WebGLRenderGroup; @@ -37,22 +37,22 @@ PIXI.WebGLRenderGroup.prototype.constructor = PIXI.WebGLRenderGroup; * * @method setRenderable * @param displayObject {DisplayObject} - * @private + * @private */ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) { // has this changed?? if(this.root)this.removeDisplayObjectAndChildren(this.root); - + displayObject.worldVisible = displayObject.visible; - + // soooooo // // to check if any batchs exist already?? - + // TODO what if its already has an object? should remove it this.root = displayObject; this.addDisplayObjectAndChildren(displayObject); -} +}; /** * Renders the stage to its webgl view @@ -63,32 +63,31 @@ PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) PIXI.WebGLRenderGroup.prototype.render = function(projection, buffer) { PIXI.WebGLRenderer.updateTextures(); - + var gl = this.gl; gl.uniform2f(PIXI.defaultShader.projectionVector, projection.x, projection.y); this.filterManager.begin(projection, buffer); - + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); // will render all the elements in the group var renderable; - for (var i=0; i < this.batchs.length; i++) + for (var i=0; i < this.batchs.length; i++) { - + renderable = this.batchs[i]; if(renderable instanceof PIXI.WebGLBatch) { this.batchs[i].render(); continue; } - + // render special this.renderSpecial(renderable, projection); } - -} +}; /** * Renders a specific displayObject @@ -109,13 +108,16 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project // to do! // render part of the scene... - + var startIndex; var startBatchIndex; - + var endIndex; var endBatchIndex; - + var endBatch; + + var head; + /* * LOOK FOR THE NEXT SPRITE * This part looks for the closest next sprite that can go into a batch @@ -130,25 +132,24 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project } var startBatch = nextRenderable.batch; //console.log(nextRenderable); - + //console.log(renderable) if(nextRenderable instanceof PIXI.Sprite) { startBatch = nextRenderable.batch; - - var head = startBatch.head; - var next = head; - + + head = startBatch.head; + // ok now we have the batch.. need to find the start index! - if(head == nextRenderable) + if(head === nextRenderable) { startIndex = 0; } else { startIndex = 1; - - while(head.__next != nextRenderable) + + while(head.__next !== nextRenderable) { startIndex++; head = head.__next; @@ -159,7 +160,7 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project { startBatch = nextRenderable; } - + // Get the LAST renderable object var lastRenderable = displayObject.last; while(lastRenderable._iPrev) @@ -167,22 +168,22 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project if(lastRenderable.renderable && lastRenderable.__renderGroup)break; lastRenderable = lastRenderable._iNext; } - + if(lastRenderable instanceof PIXI.Sprite) { endBatch = lastRenderable.batch; - - var head = endBatch.head; - - if(head == lastRenderable) + + head = endBatch.head; + + if(head === lastRenderable) { endIndex = 0; } else { endIndex = 1; - - while(head.__next != lastRenderable) + + while(head.__next !== lastRenderable) { endIndex++; head = head.__next; @@ -193,11 +194,11 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project { endBatch = lastRenderable; } - + //console.log(endBatch); // TODO - need to fold this up a bit! - - if(startBatch == endBatch) + + if(startBatch === endBatch) { if(startBatch instanceof PIXI.WebGLBatch) { @@ -209,11 +210,11 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project } return; } - + // now we have first and last! startBatchIndex = this.batchs.indexOf(startBatch); endBatchIndex = this.batchs.indexOf(endBatch); - + // DO the first batch if(startBatch instanceof PIXI.WebGLBatch) { @@ -223,12 +224,13 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project { this.renderSpecial(startBatch, projection); } - + // DO the middle batchs.. - for (var i=startBatchIndex+1; i < endBatchIndex; i++) + var renderable; + for (var i = startBatchIndex+1; i < endBatchIndex; i++) { renderable = this.batchs[i]; - + if(renderable instanceof PIXI.WebGLBatch) { this.batchs[i].render(); @@ -238,7 +240,7 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project this.renderSpecial(renderable, projection); } } - + // DO the last batch.. if(endBatch instanceof PIXI.WebGLBatch) { @@ -248,7 +250,7 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project { this.renderSpecial(endBatch, projection); } -} +}; /** * Renders a specific renderable @@ -260,8 +262,8 @@ PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, project */ PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable, projection) { - - var worldVisible = renderable.vcount === PIXI.visibleCount + + var worldVisible = renderable.vcount === PIXI.visibleCount; if(renderable instanceof PIXI.TilingSprite) @@ -284,9 +286,8 @@ PIXI.WebGLRenderGroup.prototype.renderSpecial = function(renderable, projection) { this.handleFilterBlock(renderable, projection); } -} +}; -flip = false; var maskStack = []; var maskPosition = 0; @@ -298,30 +299,30 @@ PIXI.WebGLRenderGroup.prototype.handleFilterBlock = function(filterBlock, projec * for now only masks are supported.. */ var gl = PIXI.gl; - + if(filterBlock.open) { if(filterBlock.data instanceof Array) { this.filterManager.pushFilter(filterBlock); // ok so.. - + } else - { + { maskPosition++; - maskStack.push(filterBlock) - + maskStack.push(filterBlock); + gl.enable(gl.STENCIL_TEST); - + gl.colorMask(false, false, false, false); - + gl.stencilFunc(gl.ALWAYS,1,1); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - + PIXI.WebGLGraphics.renderGraphics(filterBlock.data, projection); - + gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL,0,maskStack.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); @@ -335,27 +336,26 @@ PIXI.WebGLRenderGroup.prototype.handleFilterBlock = function(filterBlock, projec } else { - var maskData = maskStack.pop(filterBlock) - + var maskData = maskStack.pop(filterBlock); if(maskData) { gl.colorMask(false, false, false, false); - + gl.stencilFunc(gl.ALWAYS,1,1); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); PIXI.WebGLGraphics.renderGraphics(maskData.data, projection); - + gl.colorMask(true, true, true, true); gl.stencilFunc(gl.NOTEQUAL,0,maskStack.length); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - }; + } gl.disable(gl.STENCIL_TEST); } } -} +}; /** * Updates a webgl texture @@ -366,23 +366,23 @@ PIXI.WebGLRenderGroup.prototype.handleFilterBlock = function(filterBlock, projec */ PIXI.WebGLRenderGroup.prototype.updateTexture = function(displayObject) { - + // TODO definitely can optimse this function.. - + this.removeObject(displayObject); - + /* * LOOK FOR THE PREVIOUS RENDERABLE * This part looks for the closest previous sprite that can go into a batch * It keeps going back until it finds a sprite or the stage */ var previousRenderable = displayObject.first; - while(previousRenderable != this.root) + while(previousRenderable !== this.root) { previousRenderable = previousRenderable._iPrev; if(previousRenderable.renderable && previousRenderable.__renderGroup)break; } - + /* * LOOK FOR THE NEXT SPRITE * This part looks for the closest next sprite that can go into a batch @@ -395,9 +395,9 @@ PIXI.WebGLRenderGroup.prototype.updateTexture = function(displayObject) nextRenderable = nextRenderable._iNext; if(nextRenderable.renderable && nextRenderable.__renderGroup)break; } - + this.insertObject(displayObject, previousRenderable, nextRenderable); -} +}; /** * Adds filter blocks @@ -417,13 +417,13 @@ PIXI.WebGLRenderGroup.prototype.addFilterBlocks = function(start, end) * It keeps going back until it finds a sprite or the stage */ var previousRenderable = start; - while(previousRenderable != this.root.first) + while(previousRenderable !== this.root.first) { previousRenderable = previousRenderable._iPrev; if(previousRenderable.renderable && previousRenderable.__renderGroup)break; } this.insertAfter(start, previousRenderable); - + /* * LOOK FOR THE NEXT SPRITE * This part looks for the closest next sprite that can go into a batch @@ -431,13 +431,13 @@ PIXI.WebGLRenderGroup.prototype.addFilterBlocks = function(start, end) * scene graph */ var previousRenderable2 = end; - while(previousRenderable2 != this.root.first) + while(previousRenderable2 !== this.root.first) { previousRenderable2 = previousRenderable2._iPrev; if(previousRenderable2.renderable && previousRenderable2.__renderGroup)break; } this.insertAfter(end, previousRenderable2); -} +}; /** * Remove filter blocks @@ -451,7 +451,7 @@ PIXI.WebGLRenderGroup.prototype.removeFilterBlocks = function(start, end) { this.removeObject(start); this.removeObject(end); -} +}; /** * Adds a display object and children to the webgl context @@ -463,20 +463,20 @@ PIXI.WebGLRenderGroup.prototype.removeFilterBlocks = function(start, end) PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) { if(displayObject.__renderGroup)displayObject.__renderGroup.removeDisplayObjectAndChildren(displayObject); - + /* * LOOK FOR THE PREVIOUS RENDERABLE * This part looks for the closest previous sprite that can go into a batch * It keeps going back until it finds a sprite or the stage */ - + var previousRenderable = displayObject.first; - while(previousRenderable != this.root.first) + while(previousRenderable !== this.root.first) { previousRenderable = previousRenderable._iPrev; if(previousRenderable.renderable && previousRenderable.__renderGroup)break; } - + /* * LOOK FOR THE NEXT SPRITE * This part looks for the closest next sprite that can go into a batch @@ -489,26 +489,27 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayOb nextRenderable = nextRenderable._iNext; if(nextRenderable.renderable && nextRenderable.__renderGroup)break; } - - // one the display object hits this. we can break the loop - + + // one the display object hits this. we can break the loop + var tempObject = displayObject.first; var testObject = displayObject.last._iNext; - do + + do { tempObject.__renderGroup = this; - + if(tempObject.renderable) { - + this.insertObject(tempObject, previousRenderable, nextRenderable); previousRenderable = tempObject; } - + tempObject = tempObject._iNext; } - while(tempObject != testObject) -} + while(tempObject !== testObject); +}; /** * Removes a display object and children to the webgl context @@ -519,18 +520,16 @@ PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayOb */ PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) { - if(displayObject.__renderGroup != this)return; - -// var displayObject = displayObject.first; - var lastObject = displayObject.last; - do + if(displayObject.__renderGroup !== this) return; + + do { displayObject.__renderGroup = null; if(displayObject.renderable)this.removeObject(displayObject); displayObject = displayObject._iNext; } - while(displayObject) -} + while(displayObject); +}; /** * Inserts a displayObject into the linked list @@ -546,22 +545,23 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED var previousSprite = previousObject; var nextSprite = nextObject; - + var index, batch; + /* * so now we have the next renderable and the previous renderable - * + * */ if(displayObject instanceof PIXI.Sprite) { - var previousBatch - var nextBatch - + var previousBatch; + var nextBatch; + if(previousSprite instanceof PIXI.Sprite) { previousBatch = previousSprite.batch; if(previousBatch) { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + if(previousBatch.texture === displayObject.texture.baseTexture && previousBatch.blendMode === displayObject.blendMode) { previousBatch.insertAfter(displayObject, previousSprite); return; @@ -573,40 +573,40 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO // TODO reword! previousBatch = previousSprite; } - + if(nextSprite) { if(nextSprite instanceof PIXI.Sprite) { nextBatch = nextSprite.batch; - + //batch may not exist if item was added to the display list but not to the webGL if(nextBatch) { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + if(nextBatch.texture === displayObject.texture.baseTexture && nextBatch.blendMode === displayObject.blendMode) { nextBatch.insertBefore(displayObject, nextSprite); return; } else { - if(nextBatch == previousBatch) + if(nextBatch === previousBatch) { // THERE IS A SPLIT IN THIS BATCH! // var splitBatch = previousBatch.split(nextSprite); // COOL! - // add it back into the array + // add it back into the array /* * OOPS! * seems the new sprite is in the middle of a batch - * lets split it.. + * lets split it.. */ - var batch = PIXI.WebGLRenderer.getBatch(); + batch = PIXI.WebGLRenderer.getBatch(); - var index = this.batchs.indexOf( previousBatch ); + index = this.batchs.indexOf( previousBatch ); batch.init(displayObject); this.batchs.splice(index+1, 0, batch, splitBatch); - + return; } } @@ -615,39 +615,39 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO else { // TODO re-word! - + nextBatch = nextSprite; } } - + /* * looks like it does not belong to any batch! * but is also not intersecting one.. * time to create anew one! */ - - var batch = PIXI.WebGLRenderer.getBatch(); + + batch = PIXI.WebGLRenderer.getBatch(); batch.init(displayObject); - if(previousBatch) // if this is invalid it means + if(previousBatch) // if this is invalid it means { - var index = this.batchs.indexOf( previousBatch ); + index = this.batchs.indexOf( previousBatch ); this.batchs.splice(index+1, 0, batch); } else { this.batchs.push(batch); } - + return; } else if(displayObject instanceof PIXI.TilingSprite) { - + // add to a batch!! this.initTilingSprite(displayObject); // this.batchs.push(displayObject); - + } else if(displayObject instanceof PIXI.Strip) { @@ -655,20 +655,21 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO 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); } - - this.insertAfter(displayObject, previousSprite); - - // insert and SPLIT! + */ -} + this.insertAfter(displayObject, previousSprite); + + // insert and SPLIT! +}; /** * Inserts a displayObject into the linked list @@ -680,36 +681,38 @@ PIXI.WebGLRenderGroup.prototype.insertObject = function(displayObject, previousO */ PIXI.WebGLRenderGroup.prototype.insertAfter = function(item, displayObject) { + var index; + if(displayObject instanceof PIXI.Sprite) { var previousBatch = displayObject.batch; - + if(previousBatch) { // so this object is in a batch! - + // is it not? need to split the batch - if(previousBatch.tail == displayObject) + if(previousBatch.tail === displayObject) { - // is it tail? insert in to batchs - var index = this.batchs.indexOf( previousBatch ); + // is it tail? insert in to batchs + index = this.batchs.indexOf( previousBatch ); this.batchs.splice(index+1, 0, item); } else { // TODO MODIFY ADD / REMOVE CHILD TO ACCOUNT FOR FILTERS (also get prev and next) // - + // THERE IS A SPLIT IN THIS BATCH! // var splitBatch = previousBatch.split(displayObject.__next); - + // COOL! - // add it back into the array + // add it back into the array /* * OOPS! * seems the new sprite is in the middle of a batch - * lets split it.. + * lets split it.. */ - var index = this.batchs.indexOf( previousBatch ); + index = this.batchs.indexOf( previousBatch ); this.batchs.splice(index+1, 0, item, splitBatch); } } @@ -720,10 +723,10 @@ PIXI.WebGLRenderGroup.prototype.insertAfter = function(item, displayObject) } else { - var index = this.batchs.indexOf( displayObject ); + index = this.batchs.indexOf( displayObject ); this.batchs.splice(index+1, 0, item); } -} +}; /** * Removes a displayObject from the linked list @@ -736,26 +739,26 @@ PIXI.WebGLRenderGroup.prototype.removeObject = function(displayObject) { // loop through children.. // display object // - + // add a child from the render group.. // remove it and all its children! //displayObject.cacheVisible = false;//displayObject.visible; /* * removing is a lot quicker.. - * + * */ var batchToRemove; - + if(displayObject instanceof PIXI.Sprite) { // should always have a batch! var batch = displayObject.batch; if(!batch)return; // this means the display list has been altered befre rendering - + batch.remove(displayObject); - - if(batch.size==0) + + if(batch.size === 0) { batchToRemove = batch; } @@ -764,44 +767,44 @@ PIXI.WebGLRenderGroup.prototype.removeObject = function(displayObject) { batchToRemove = displayObject; } - + /* * Looks like there is somthing that needs removing! */ - if(batchToRemove) + if(batchToRemove) { var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - + if(index === -1)return;// this means it was added then removed before rendered + // ok so.. check to see if you adjacent batchs should be joined. // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) + if(index === 0 || index === this.batchs.length-1) { // wha - eva! just get of the empty batch! this.batchs.splice(index, 1); if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - + return; } - + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + if(this.batchs[index-1].texture === this.batchs[index+1].texture && this.batchs[index-1].blendMode === this.batchs[index+1].blendMode) { //console.log("MERGE") this.batchs[index-1].merge(this.batchs[index+1]); - + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); this.batchs.splice(index, 2); return; } } - + this.batchs.splice(index, 1); if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); } -} +}; /** @@ -816,26 +819,26 @@ PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) var gl = this.gl; // make the texture tilable.. - + sprite.verticies = new Float32Array([0, 0, sprite.width, 0, sprite.width, sprite.height, 0, sprite.height]); - + sprite.uvs = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]); - + sprite.colors = new Float32Array([1,1,1,1]); - - sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - + + sprite.indices = new Uint16Array([0, 1, 3,2]); //, 2]); + sprite._vertexBuffer = gl.createBuffer(); sprite._indexBuffer = gl.createBuffer(); sprite._uvBuffer = gl.createBuffer(); sprite._colorBuffer = gl.createBuffer(); - + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, sprite.verticies, gl.STATIC_DRAW); @@ -847,7 +850,7 @@ PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, sprite._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, sprite.indices, gl.STATIC_DRAW); - + // return ( (x > 0) && ((x & (x - 1)) == 0) ); if(sprite.texture.baseTexture._glTexture) @@ -861,7 +864,7 @@ PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) { sprite.texture.baseTexture._powerOf2 = true; } -} +}; /** * Renders a Strip @@ -879,18 +882,16 @@ PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) var shader = PIXI.stripShader; - var program = shader.program; - var m = PIXI.mat3.clone(strip.worldTransform); - + PIXI.mat3.transpose(m); - + // console.log(projection) - // set the matrix transform for the + // set the matrix transform for the gl.uniformMatrix3fv(shader.translationMatrix, false, m); gl.uniform2f(shader.projectionVector, projection.x, projection.y); gl.uniform2f(shader.offsetVector, -PIXI.offset.x, -PIXI.offset.y); - + gl.uniform1f(shader.alpha, strip.worldAlpha); /* @@ -903,24 +904,24 @@ PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); } */ - + //console.log("!!") if(!strip.dirty) - { + { gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies) + gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); - + // update the uvs gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); - + gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); - + gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); gl.vertexAttribPointer(shader.colorAttribute, 1, gl.FLOAT, false, 0, 0); - + // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); } @@ -928,32 +929,32 @@ PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projection) { strip.dirty = false; gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW) + gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); - + // update the uvs gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW) + gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); - + gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); // console.log(strip.texture.baseTexture._glTexture) gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW) + gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); gl.vertexAttribPointer(shader.colorAttribute, 1, gl.FLOAT, false, 0, 0); - + // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); - + } - + gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - + PIXI.deactivateStripShader(); //gl.useProgram(PIXI.currentProgram); -} +}; /** * Renders a TilingSprite @@ -967,35 +968,32 @@ PIXI.WebGLRenderGroup.prototype.renderTilingSprite = function(sprite, projection { var gl = this.gl; - - var shaderProgram = PIXI.shaderProgram; - var tilePosition = sprite.tilePosition; var tileScale = sprite.tileScale; - + var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - + gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) - + gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs); + this.renderStrip(sprite, projectionMatrix); -} +}; /** * Initializes a strip to be rendered @@ -1008,13 +1006,12 @@ PIXI.WebGLRenderGroup.prototype.initStrip = function(strip) { // build the strip! var gl = this.gl; - var shaderProgram = this.shaderProgram; - + strip._vertexBuffer = gl.createBuffer(); strip._indexBuffer = gl.createBuffer(); strip._uvBuffer = gl.createBuffer(); strip._colorBuffer = gl.createBuffer(); - + gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.DYNAMIC_DRAW); @@ -1024,8 +1021,7 @@ PIXI.WebGLRenderGroup.prototype.initStrip = function(strip) gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); - + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); -} - +}; diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index 9b5e703..1acec35 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -6,7 +6,7 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); // an instance of the gl context.. // only one at the moment :/ -PIXI.gl; +PIXI.gl = null; /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer @@ -21,7 +21,7 @@ PIXI.gl; * @param view {Canvas} the canvas to use as a view, optional * @param transparent=false {Boolean} the transparency of the render view, default false * @param antialias=false {Boolean} sets antialias (only applicable in chrome at the moment) - * + * */ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) { @@ -32,14 +32,14 @@ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) this.width = width || 800; this.height = height || 600; - this.view = view || document.createElement( 'canvas' ); + this.view = view || document.createElement( 'canvas' ); this.view.width = this.width; this.view.height = this.height; - // deal with losing context.. + // deal with losing context.. var scope = this; - this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false) - this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false) + this.view.addEventListener('webglcontextlost', function(event) { scope.handleContextLost(event); }, false); + this.view.addEventListener('webglcontextrestored', function(event) { scope.handleContextRestored(event); }, false); this.batchs = []; @@ -48,30 +48,30 @@ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) antialias:!!antialias, // SPEED UP?? premultipliedAlpha:false, stencil:true - } + }; //try 'experimental-webgl' try { - PIXI.gl = this.gl = this.view.getContext("experimental-webgl", options); + PIXI.gl = this.gl = this.view.getContext('experimental-webgl', options); } catch (e) { //try 'webgl' try { - PIXI.gl = this.gl = this.view.getContext("webgl", options); - } catch (e) { + PIXI.gl = this.gl = this.view.getContext('webgl', options); + } catch (e2) { // fail, not able to get a context - throw new Error(" This browser does not support webGL. Try using the canvas renderer" + this); + throw new Error(' This browser does not support webGL. Try using the canvas renderer' + this); } } PIXI.initDefaultShaders(); - - + + // PIXI.activateDefaultShader(); var gl = this.gl; - + gl.useProgram(PIXI.defaultShader.program); @@ -82,7 +82,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); - gl.colorMask(true, true, true, this.transparent); + gl.colorMask(true, true, true, this.transparent); PIXI.projection = new PIXI.Point(400, 300); PIXI.offset = new PIXI.Point(0, 0); @@ -96,7 +96,7 @@ PIXI.WebGLRenderer = function(width, height, view, transparent, antialias) this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl, this.transparent); // this.stageRenderGroup. = this.transparent -} +}; // constructor PIXI.WebGLRenderer.prototype.constructor = PIXI.WebGLRenderer; @@ -107,11 +107,11 @@ PIXI.WebGLRenderer.prototype.constructor = PIXI.WebGLRenderer; * @static * @method getBatch * @return {WebGLBatch} - * @private + * @private */ PIXI.WebGLRenderer.getBatch = function() { - if(PIXI._batchs.length == 0) + if(PIXI._batchs.length === 0) { return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } @@ -119,7 +119,7 @@ PIXI.WebGLRenderer.getBatch = function() { return PIXI._batchs.pop(); } -} +}; /** * Puts a batch back into the pool @@ -131,9 +131,9 @@ PIXI.WebGLRenderer.getBatch = function() */ PIXI.WebGLRenderer.returnBatch = function(batch) { - batch.clean(); + batch.clean(); PIXI._batchs.push(batch); -} +}; /** * Renders the stage to its webGL view @@ -144,8 +144,8 @@ PIXI.WebGLRenderer.returnBatch = function(batch) PIXI.WebGLRenderer.prototype.render = function(stage) { if(this.contextLost)return; - - + + // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { @@ -155,33 +155,33 @@ PIXI.WebGLRenderer.prototype.render = function(stage) this.stageRenderGroup.setRenderable(stage); } - // update any textures + // update any textures PIXI.WebGLRenderer.updateTextures(); - - // update the scene graph + + // update the scene graph PIXI.visibleCount++; stage.updateTransform(); - + var gl = this.gl; - + // -- Does this need to be set every frame? -- // - gl.colorMask(true, true, true, this.transparent); - gl.viewport(0, 0, this.width, this.height); - + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); - - gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], !this.transparent); gl.clear(gl.COLOR_BUFFER_BIT); // HACK TO TEST - + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; - + PIXI.projection.x = this.width/2; PIXI.projection.y = -this.height/2; - + this.stageRenderGroup.render(PIXI.projection); - + // interaction // run interaction! if(stage.interactive) @@ -193,18 +193,18 @@ PIXI.WebGLRenderer.prototype.render = function(stage) stage.interactionManager.setTarget(this); } } - + // after rendering lets confirm all frames that have been uodated.. if(PIXI.Texture.frameUpdates.length > 0) { - for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) + for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) { PIXI.Texture.frameUpdates[i].updateFrame = false; - }; - + } + PIXI.Texture.frameUpdates = []; } -} +}; /** * Updates the textures loaded into this webgl renderer @@ -215,12 +215,18 @@ PIXI.WebGLRenderer.prototype.render = function(stage) */ PIXI.WebGLRenderer.updateTextures = function() { + var i = 0; + //TODO break this out into a texture manager... - for (var i=0; i < PIXI.texturesToUpdate.length; i++) PIXI.WebGLRenderer.updateTexture(PIXI.texturesToUpdate[i]); - for (var i=0; i < PIXI.texturesToDestroy.length; i++) PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); + for (i = 0; i < PIXI.texturesToUpdate.length; i++) + PIXI.WebGLRenderer.updateTexture(PIXI.texturesToUpdate[i]); + + for (i = 0; i < PIXI.texturesToDestroy.length; i++) + PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); + PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; -} +}; /** * Updates a loaded webgl texture @@ -234,7 +240,7 @@ PIXI.WebGLRenderer.updateTexture = function(texture) { //TODO break this out into a texture manager... var gl = PIXI.gl; - + if(!texture._glTexture) { texture._glTexture = gl.createTexture(); @@ -264,7 +270,7 @@ PIXI.WebGLRenderer.updateTexture = function(texture) gl.bindTexture(gl.TEXTURE_2D, null); } -} +}; /** * Destroys a loaded webgl texture @@ -283,7 +289,7 @@ PIXI.WebGLRenderer.destroyTexture = function(texture) texture._glTexture = gl.createTexture(); gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); } -} +}; /** * resizes the webGL view to the specified width and height @@ -300,13 +306,13 @@ PIXI.WebGLRenderer.prototype.resize = function(width, height) this.view.width = width; this.view.height = height; - this.gl.viewport(0, 0, this.width, this.height); + this.gl.viewport(0, 0, this.width, this.height); //var projectionMatrix = this.projectionMatrix; PIXI.projection.x = this.width/2; PIXI.projection.y = -this.height/2; - + //PIXI.size.x = this.width/2; //PIXI.size.y = -this.height/2; @@ -314,7 +320,7 @@ PIXI.WebGLRenderer.prototype.resize = function(width, height) // projectionMatrix[5] = -2/this.height; // projectionMatrix[12] = -1; // projectionMatrix[13] = 1; -} +}; /** * Handles a lost webgl context @@ -327,7 +333,7 @@ PIXI.WebGLRenderer.prototype.handleContextLost = function(event) { event.preventDefault(); this.contextLost = true; -} +}; /** * Handles a restored webgl context @@ -336,28 +342,28 @@ PIXI.WebGLRenderer.prototype.handleContextLost = function(event) * @param event {Event} * @private */ -PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) +PIXI.WebGLRenderer.prototype.handleContextRestored = function() { - this.gl = this.view.getContext("experimental-webgl", { + this.gl = this.view.getContext('experimental-webgl', { alpha: true }); - this.initShaders(); + this.initShaders(); - for(var key in PIXI.TextureCache) + for(var key in PIXI.TextureCache) { - var texture = PIXI.TextureCache[key].baseTexture; - texture._glTexture = null; - PIXI.WebGLRenderer.updateTexture(texture); - }; + var texture = PIXI.TextureCache[key].baseTexture; + texture._glTexture = null; + PIXI.WebGLRenderer.updateTexture(texture); + } - for (var i=0; i < this.batchs.length; i++) + for (var i=0; i < this.batchs.length; i++) { - this.batchs[i].restoreLostContext(this.gl)// + this.batchs[i].restoreLostContext(this.gl); this.batchs[i].dirty = true; - }; + } PIXI._restoreBatchs(this.gl); this.contextLost = false; -} +}; diff --git a/src/pixi/renderers/webgl/WebGLShaders.js b/src/pixi/renderers/webgl/WebGLShaders.js index 016d37c..b6b66b7 100644 --- a/src/pixi/renderers/webgl/WebGLShaders.js +++ b/src/pixi/renderers/webgl/WebGLShaders.js @@ -2,8 +2,7 @@ * @author Mat Groves http://matgroves.com/ @Doormat23 */ - -PIXI.initDefaultShaders = function() +PIXI.initDefaultShaders = function() { PIXI.primitiveShader = new PIXI.PrimitiveShader(); PIXI.primitiveShader.init(); @@ -14,53 +13,51 @@ PIXI.initDefaultShaders = function() PIXI.defaultShader = new PIXI.PixiShader(); PIXI.defaultShader.init(); - var gl = PIXI.gl; + var gl = PIXI.gl; var shaderProgram = PIXI.defaultShader.program; - gl.useProgram(shaderProgram); - + gl.enableVertexAttribArray(PIXI.defaultShader.aVertexPosition); gl.enableVertexAttribArray(PIXI.defaultShader.colorAttribute); gl.enableVertexAttribArray(PIXI.defaultShader.aTextureCoord); -} +}; PIXI.activatePrimitiveShader = function() { var gl = PIXI.gl; - + gl.useProgram(PIXI.primitiveShader.program); - + gl.disableVertexAttribArray(PIXI.defaultShader.aVertexPosition); gl.disableVertexAttribArray(PIXI.defaultShader.colorAttribute); gl.disableVertexAttribArray(PIXI.defaultShader.aTextureCoord); gl.enableVertexAttribArray(PIXI.primitiveShader.aVertexPosition); gl.enableVertexAttribArray(PIXI.primitiveShader.colorAttribute); -} +}; PIXI.deactivatePrimitiveShader = function() { var gl = PIXI.gl; gl.useProgram(PIXI.defaultShader.program); - + gl.disableVertexAttribArray(PIXI.primitiveShader.aVertexPosition); gl.disableVertexAttribArray(PIXI.primitiveShader.colorAttribute); gl.enableVertexAttribArray(PIXI.defaultShader.aVertexPosition); gl.enableVertexAttribArray(PIXI.defaultShader.colorAttribute); gl.enableVertexAttribArray(PIXI.defaultShader.aTextureCoord); - -} +}; PIXI.activateStripShader = function() { var gl = PIXI.gl; - + gl.useProgram(PIXI.stripShader.program); // gl.disableVertexAttribArray(PIXI.defaultShader.aTextureCoord); -} +}; PIXI.deactivateStripShader = function() { @@ -68,7 +65,7 @@ PIXI.deactivateStripShader = function() gl.useProgram(PIXI.defaultShader.program); //gl.enableVertexAttribArray(PIXI.defaultShader.aTextureCoord); -} +}; /* @@ -78,12 +75,12 @@ SHADER COMPILER HELPERS PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); -} +}; PIXI.CompileFragmentShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.FRAGMENT_SHADER); -} +}; PIXI._CompileShader = function(gl, shaderSrc, shaderType) { @@ -93,29 +90,28 @@ PIXI._CompileShader = function(gl, shaderSrc, shaderType) gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - console.log(gl.getShaderInfoLog(shader)); + window.console.log(gl.getShaderInfoLog(shader)); return null; } return shader; -} - +}; PIXI.compileProgram = function(vertexSrc, fragmentSrc) { var gl = PIXI.gl; var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); - - var shaderProgram = gl.createProgram(); - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - console.log("Could not initialise shaders"); - } + var shaderProgram = gl.createProgram(); + + gl.attachShader(shaderProgram, vertexShader); + gl.attachShader(shaderProgram, fragmentShader); + gl.linkProgram(shaderProgram); + + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + window.console.log("Could not initialise shaders"); + } return shaderProgram; -} +}; diff --git a/src/pixi/text/BitmapText.js b/src/pixi/text/BitmapText.js index 128c217..fb5fb8c 100644 --- a/src/pixi/text/BitmapText.js +++ b/src/pixi/text/BitmapText.js @@ -3,7 +3,7 @@ */ /** - * A Text Object will create a line(s) of text using bitmap font. To split a line you can use "\n", "\r" or "\r\n" + * A Text Object will create a line(s) of text using bitmap font. To split a line you can use '\n', '\r' or '\r\n' * You can generate the fnt files using * http://www.angelcode.com/products/bmfont/ for windows or * http://www.bmglyph.com/ for mac. @@ -13,8 +13,8 @@ * @constructor * @param text {String} The copy that you would like the text to display * @param style {Object} The style parameters - * @param style.font {String} The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) - * @param [style.align="left"] {String} An alignment of the multiline text ("left", "center" or "right") + * @param style.font {String} The size (optional) and bitmap font id (required) eq 'Arial' or '20px Arial' (must have loaded previously) + * @param [style.align='left'] {String} An alignment of the multiline text ('left', 'center' or 'right') */ PIXI.BitmapText = function(text, style) { @@ -23,8 +23,7 @@ PIXI.BitmapText = function(text, style) this.setText(text); this.setStyle(style); this.updateText(); - this.dirty = false - + this.dirty = false; }; // constructor @@ -39,7 +38,7 @@ PIXI.BitmapText.prototype.constructor = PIXI.BitmapText; */ PIXI.BitmapText.prototype.setText = function(text) { - this.text = text || " "; + this.text = text || ' '; this.dirty = true; }; @@ -48,16 +47,16 @@ PIXI.BitmapText.prototype.setText = function(text) * * @method setStyle * @param style {Object} The style parameters - * @param style.font {String} The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) - * @param [style.align="left"] {String} An alignment of the multiline text ("left", "center" or "right") + * @param style.font {String} The size (optional) and bitmap font id (required) eq 'Arial' or '20px Arial' (must have loaded previously) + * @param [style.align='left'] {String} An alignment of the multiline text ('left', 'center' or 'right') */ PIXI.BitmapText.prototype.setStyle = function(style) { style = style || {}; - style.align = style.align || "left"; + style.align = style.align || 'left'; this.style = style; - var font = style.font.split(" "); + var font = style.font.split(' '); this.fontName = font[font.length - 1]; this.fontSize = font.length >= 2 ? parseInt(font[font.length - 2], 10) : PIXI.BitmapText.fonts[this.fontName].size; @@ -100,7 +99,7 @@ PIXI.BitmapText.prototype.updateText = function() if(prevCharCode && charData[prevCharCode]) { - pos.x += charData.kerning[prevCharCode]; + pos.x += charData.kerning[prevCharCode]; } chars.push({texture:charData.texture, line: line, charCode: charCode, position: new PIXI.Point(pos.x + charData.xOffset, pos.y + charData.yOffset)}); pos.x += charData.xAdvance; @@ -115,11 +114,11 @@ PIXI.BitmapText.prototype.updateText = function() for(i = 0; i <= line; i++) { var alignOffset = 0; - if(this.style.align == "right") + if(this.style.align === 'right') { alignOffset = maxLineWidth - lineWidths[i]; } - else if(this.style.align == "center") + else if(this.style.align === 'center') { alignOffset = (maxLineWidth - lineWidths[i]) / 2; } @@ -128,7 +127,7 @@ PIXI.BitmapText.prototype.updateText = function() for(i = 0; i < chars.length; i++) { - var c = new PIXI.Sprite(chars[i].texture)//PIXI.Sprite.fromFrame(chars[i].charCode); + var c = new PIXI.Sprite(chars[i].texture); //PIXI.Sprite.fromFrame(chars[i].charCode); c.position.x = (chars[i].position.x + lineAlignOffsets[chars[i].line]) * scale; c.position.y = chars[i].position.y * scale; c.scale.x = c.scale.y = scale; diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index f708d85..75d50d0 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -3,25 +3,25 @@ */ /** - * A Text Object will create a line(s) of text to split a line you can use "\n" + * A Text Object will create a line(s) of text to split a line you can use '\n' * * @class Text * @extends Sprite * @constructor * @param text {String} The copy that you would like the text to display * @param [style] {Object} The style parameters - * @param [style.font] {String} default "bold 20pt Arial" The style and size of the font - * @param [style.fill="black"] {Object} A canvas fillstyle that will be used on the text eg "red", "#00FF00" - * @param [style.align="left"] {String} An alignment of the multiline text ("left", "center" or "right") - * @param [style.stroke] {String} A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" + * @param [style.font] {String} default 'bold 20pt Arial' The style and size of the font + * @param [style.fill='black'] {Object} A canvas fillstyle that will be used on the text eg 'red', '#00FF00' + * @param [style.align='left'] {String} An alignment of the multiline text ('left', 'center' or 'right') + * @param [style.stroke] {String} A canvas fillstyle that will be used on the text stroke eg 'blue', '#FCFF00' * @param [style.strokeThickness=0] {Number} A number that represents the thickness of the stroke. Default is 0 (no stroke) * @param [style.wordWrap=false] {Boolean} Indicates if word wrap should be used * @param [style.wordWrapWidth=100] {Number} The width at which text will wrap */ PIXI.Text = function(text, style) { - this.canvas = document.createElement("canvas"); - this.context = this.canvas.getContext("2d"); + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext('2d'); PIXI.Sprite.call(this, PIXI.Texture.fromCanvas(this.canvas)); this.setText(text); @@ -40,10 +40,10 @@ PIXI.Text.prototype.constructor = PIXI.Text; * * @method setStyle * @param [style] {Object} The style parameters - * @param [style.font="bold 20pt Arial"] {String} The style and size of the font - * @param [style.fill="black"] {Object} A canvas fillstyle that will be used on the text eg "red", "#00FF00" - * @param [style.align="left"] {String} An alignment of the multiline text ("left", "center" or "right") - * @param [style.stroke="black"] {String} A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" + * @param [style.font='bold 20pt Arial'] {String} The style and size of the font + * @param [style.fill='black'] {Object} A canvas fillstyle that will be used on the text eg 'red', '#00FF00' + * @param [style.align='left'] {String} An alignment of the multiline text ('left', 'center' or 'right') + * @param [style.stroke='black'] {String} A canvas fillstyle that will be used on the text stroke eg 'blue', '#FCFF00' * @param [style.strokeThickness=0] {Number} A number that represents the thickness of the stroke. Default is 0 (no stroke) * @param [style.wordWrap=false] {Boolean} Indicates if word wrap should be used * @param [style.wordWrapWidth=100] {Number} The width at which text will wrap @@ -51,10 +51,10 @@ PIXI.Text.prototype.constructor = PIXI.Text; PIXI.Text.prototype.setStyle = function(style) { style = style || {}; - style.font = style.font || "bold 20pt Arial"; - style.fill = style.fill || "black"; - style.align = style.align || "left"; - style.stroke = style.stroke || "black"; //provide a default, see: https://github.com/GoodBoyDigital/pixi.js/issues/136 + style.font = style.font || 'bold 20pt Arial'; + style.fill = style.fill || 'black'; + style.align = style.align || 'left'; + style.stroke = style.stroke || 'black'; //provide a default, see: https://github.com/GoodBoyDigital/pixi.js/issues/136 style.strokeThickness = style.strokeThickness || 0; style.wordWrap = style.wordWrap || false; style.wordWrapWidth = style.wordWrapWidth || 100; @@ -63,14 +63,14 @@ PIXI.Text.prototype.setStyle = function(style) }; /** - * Set the copy for the text object. To split a line you can use "\n" + * Set the copy for the text object. To split a line you can use '\n' * * @method setText * @param {String} text The copy that you would like the text to display */ PIXI.Text.prototype.setText = function(text) { - this.text = text.toString() || " "; + this.text = text.toString() || ' '; this.dirty = true; }; @@ -105,7 +105,7 @@ PIXI.Text.prototype.updateText = function() this.canvas.width = maxLineWidth + this.style.strokeThickness; //calculate text height - var lineHeight = this.determineFontHeight("font: " + this.style.font + ";") + this.style.strokeThickness; + var lineHeight = this.determineFontHeight('font: ' + this.style.font + ';') + this.style.strokeThickness; this.canvas.height = lineHeight * lines.length; //set canvas text styles @@ -115,18 +115,18 @@ PIXI.Text.prototype.updateText = function() this.context.strokeStyle = this.style.stroke; this.context.lineWidth = this.style.strokeThickness; - this.context.textBaseline = "top"; + this.context.textBaseline = 'top'; //draw lines line by line for (i = 0; i < lines.length; i++) { var linePosition = new PIXI.Point(this.style.strokeThickness / 2, this.style.strokeThickness / 2 + i * lineHeight); - if(this.style.align == "right") + if(this.style.align === 'right') { linePosition.x += maxLineWidth - lineWidths[i]; } - else if(this.style.align == "center") + else if(this.style.align === 'center') { linePosition.x += (maxLineWidth - lineWidths[i]) / 2; } @@ -197,11 +197,11 @@ PIXI.Text.prototype.determineFontHeight = function(fontStyle) if(!result) { - var body = document.getElementsByTagName("body")[0]; - var dummy = document.createElement("div"); - var dummyText = document.createTextNode("M"); + var body = document.getElementsByTagName('body')[0]; + var dummy = document.createElement('div'); + var dummyText = document.createTextNode('M'); dummy.appendChild(dummyText); - dummy.setAttribute("style", fontStyle + ';position:absolute;top:0;left:0'); + dummy.setAttribute('style', fontStyle + ';position:absolute;top:0;left:0'); body.appendChild(dummy); result = dummy.offsetHeight; @@ -225,34 +225,34 @@ PIXI.Text.prototype.wordWrap = function(text) { // Greedy wrapping algorithm that will wrap words as the line grows longer // than its horizontal bounds. - var result = ""; - var lines = text.split("\n"); + var result = ''; + var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var spaceLeft = this.style.wordWrapWidth; - var words = lines[i].split(" "); + var words = lines[i].split(' '); for (var j = 0; j < words.length; j++) { var wordWidth = this.context.measureText(words[j]).width; - var wordWidthWithSpace = wordWidth + this.context.measureText(" ").width; + var wordWidthWithSpace = wordWidth + this.context.measureText(' ').width; if(wordWidthWithSpace > spaceLeft) { // Skip printing the newline if it's the first word of the line that is // greater than the word wrap width. if(j > 0) { - result += "\n"; + result += '\n'; } - result += words[j] + " "; + result += words[j] + ' '; spaceLeft = this.style.wordWrapWidth - wordWidth; } else { spaceLeft -= wordWidthWithSpace; - result += words[j] + " "; + result += words[j] + ' '; } } - result += "\n"; + result += '\n'; } return result; }; diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 6c9a83c..317e4e0 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -69,7 +69,7 @@ PIXI.BaseTexture = function(source) { var scope = this; - this.source.onload = function(){ + this.source.onload = function() { scope.hasLoaded = true; scope.width = scope.source.width; @@ -78,7 +78,7 @@ PIXI.BaseTexture = function(source) // add it to somewhere... PIXI.texturesToUpdate.push(scope); scope.dispatchEvent( { type: 'loaded', content: scope } ); - } + }; // this.image.src = imageUrl; } } @@ -93,7 +93,7 @@ PIXI.BaseTexture = function(source) this.imageUrl = null; this._powerOf2 = false; -} +}; PIXI.BaseTexture.prototype.constructor = PIXI.BaseTexture; @@ -106,17 +106,17 @@ PIXI.BaseTexture.prototype.destroy = function() { if(this.source instanceof Image) { - if (this.imageUrl in PIXI.BaseTextureCache) + if (this.imageUrl in PIXI.BaseTextureCache) delete PIXI.BaseTextureCache[this.imageUrl]; this.imageUrl = null; this.source.src = null; } this.source = null; PIXI.texturesToDestroy.push(this); -} +}; /** - * + * * * @method destroy */ @@ -126,7 +126,7 @@ PIXI.BaseTexture.prototype.updateSourceImage = function(newSrc) this.hasLoaded = false; this.source.src = null; this.source.src = newSrc; -} +}; /** * Helper function that returns a base texture based on an image url @@ -156,4 +156,4 @@ PIXI.BaseTexture.fromImage = function(imageUrl, crossorigin) } return baseTexture; -} +}; diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index c7451df..fe1df38 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -5,11 +5,11 @@ /** A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. - __Hint__: All DisplayObjects (exmpl. Sprites) that renders on RenderTexture should be preloaded. - Otherwise black rectangles will be drawn instead. - + __Hint__: All DisplayObjects (exmpl. Sprites) that renders on RenderTexture should be preloaded. + Otherwise black rectangles will be drawn instead. + RenderTexture takes snapshot of DisplayObject passed to render method. If DisplayObject is passed to render method, position and rotation of it will be ignored. For example: - + var renderTexture = new PIXI.RenderTexture(800, 600); var sprite = PIXI.Sprite.fromImage("spinObj_01.png"); sprite.position.x = 800/2; @@ -39,7 +39,7 @@ PIXI.RenderTexture = function(width, height) this.indetityMatrix = PIXI.mat3.create(); - this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); if(PIXI.gl) { @@ -49,7 +49,7 @@ PIXI.RenderTexture = function(width, height) { this.initCanvas(); } -} +}; PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); PIXI.RenderTexture.prototype.constructor = PIXI.RenderTexture; @@ -68,7 +68,7 @@ PIXI.RenderTexture.prototype.initWebGL = function() gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); this.glFramebuffer.width = this.width; - this.glFramebuffer.height = this.height; + this.glFramebuffer.height = this.height; this.baseTexture = new PIXI.BaseTexture(); @@ -95,7 +95,7 @@ PIXI.RenderTexture.prototype.initWebGL = function() // set the correct render function.. this.render = this.renderWebGL; -} +}; PIXI.RenderTexture.prototype.resize = function(width, height) @@ -103,24 +103,24 @@ PIXI.RenderTexture.prototype.resize = function(width, height) this.width = width; this.height = height; - + if(PIXI.gl) { - this.projection.x = this.width/2 - this.projection.y = -this.height/2; - + this.projection.x = this.width / 2; + this.projection.y = -this.height / 2; + var gl = PIXI.gl; gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); } else { - - this.frame.width = this.width + + this.frame.width = this.width; this.frame.height = this.height; this.renderer.resize(this.width, this.height); } -} +}; /** * Initializes the canvas data for this texture @@ -136,7 +136,7 @@ PIXI.RenderTexture.prototype.initCanvas = function() this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); this.render = this.renderCanvas; -} +}; /** * This function will draw the display object to the texture. @@ -151,15 +151,15 @@ PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, position, cle var gl = PIXI.gl; // enable the alpha color mask.. - gl.colorMask(true, true, true, true); + gl.colorMask(true, true, true, true); - gl.viewport(0, 0, this.width, this.height); + gl.viewport(0, 0, this.width, this.height); gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); if(clear) { - gl.clearColor(0,0,0, 0); + gl.clearColor(0,0,0, 0); gl.clear(gl.COLOR_BUFFER_BIT); } @@ -178,20 +178,20 @@ PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, position, cle displayObject.worldTransform[2] = position.x; displayObject.worldTransform[5] -= position.y; } - + PIXI.visibleCount++; displayObject.vcount = PIXI.visibleCount; - + for(var i=0,j=children.length; i this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) { - throw new Error("Texture Error: frame does not fit inside the base Texture dimensions " + this); + throw new Error('Texture Error: frame does not fit inside the base Texture dimensions ' + this); } this.updateFrame = true; PIXI.Texture.frameUpdates.push(this); //this.dispatchEvent( { type: 'update', content: this } ); -} +}; /** * Helper function that returns a texture based on an image url @@ -145,7 +145,7 @@ PIXI.Texture.fromImage = function(imageUrl, crossorigin) } return texture; -} +}; /** * Helper function that returns a texture based on a frame id @@ -159,9 +159,9 @@ PIXI.Texture.fromImage = function(imageUrl, crossorigin) PIXI.Texture.fromFrame = function(frameId) { var texture = PIXI.TextureCache[frameId]; - if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache " + this); + if(!texture) throw new Error('The frameId "' + frameId + '" does not exist in the texture cache ' + this); return texture; -} +}; /** * Helper function that returns a texture based on a canvas element @@ -176,7 +176,7 @@ PIXI.Texture.fromCanvas = function(canvas) { var baseTexture = new PIXI.BaseTexture(canvas); return new PIXI.Texture(baseTexture); -} +}; /** @@ -190,7 +190,7 @@ PIXI.Texture.fromCanvas = function(canvas) PIXI.Texture.addTextureToCache = function(texture, id) { PIXI.TextureCache[id] = texture; -} +}; /** * Remove a texture from the textureCache. @@ -202,11 +202,10 @@ PIXI.Texture.addTextureToCache = function(texture, id) */ PIXI.Texture.removeTextureFromCache = function(id) { - var texture = PIXI.TextureCache[id] + var texture = PIXI.TextureCache[id]; PIXI.TextureCache[id] = null; return texture; -} +}; // this is more for webGL.. it contains updated frames.. PIXI.Texture.frameUpdates = []; - diff --git a/src/pixi/utils/Detector.js b/src/pixi/utils/Detector.js index 2bc7d34..535a94f 100644 --- a/src/pixi/utils/Detector.js +++ b/src/pixi/utils/Detector.js @@ -23,14 +23,20 @@ PIXI.autoDetectRenderer = function(width, height, view, transparent, antialias) if(!height)height = 600; // BORROWED from Mr Doob (mrdoob.com) - var webgl = ( function () { try { var canvas = document.createElement( 'canvas' ); return !! window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); + var webgl = ( function () { try { + var canvas = document.createElement( 'canvas' ); + return !! window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); + } catch( e ) { + return false; + } + } )(); if(webgl) { - var ie = (navigator.userAgent.toLowerCase().indexOf('msie') != -1); - webgl = !ie; + var ie = (navigator.userAgent.toLowerCase().indexOf('msie') !== -1); + webgl = !ie; } - + //console.log(webgl); if( webgl ) { diff --git a/src/pixi/utils/Polyk.js b/src/pixi/utils/Polyk.js index 0b1a136..8c5d30e 100644 --- a/src/pixi/utils/Polyk.js +++ b/src/pixi/utils/Polyk.js @@ -44,11 +44,12 @@ PIXI.PolyK.Triangulate = function(p) { var sign = true; - var n = p.length>>1; - if(n<3) return []; + var n = p.length >> 1; + if(n < 3) return []; + var tgs = []; var avl = []; - for(var i=0; i= 0) && (v >= 0) && (u + v < 1); -} +}; /** * Checks if a shape is convex @@ -145,5 +152,5 @@ PIXI.PolyK._PointInTriangle = function(px, py, ax, ay, bx, by, cx, cy) */ PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) { - return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) == sign; -} + return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) === sign; +}; diff --git a/src/pixi/utils/Utils.js b/src/pixi/utils/Utils.js index 6a64805..4551722 100644 --- a/src/pixi/utils/Utils.js +++ b/src/pixi/utils/Utils.js @@ -18,13 +18,13 @@ 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']; + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || + window[vendors[x] + 'CancelRequestAnimationFrame']; } -if (!window.requestAnimationFrame) - window.requestAnimationFrame = function(callback, element) { +if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function(callback) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, @@ -32,11 +32,13 @@ if (!window.requestAnimationFrame) lastTime = currTime + timeToCall; return id; }; +} -if (!window.cancelAnimationFrame) +if (!window.cancelAnimationFrame) { window.cancelAnimationFrame = function(id) { clearTimeout(id); }; +} window.requestAnimFrame = window.requestAnimationFrame; @@ -46,36 +48,36 @@ window.requestAnimFrame = window.requestAnimationFrame; * @method hex2rgb * @param hex {Number} */ -function hex2rgb(hex) { +PIXI.hex2rgb = function hex2rgb(hex) { return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; -} +}; /** * A polyfill for Function.prototype.bind * * @method bind */ -if (typeof Function.prototype.bind != 'function') { - Function.prototype.bind = (function () { - var slice = Array.prototype.slice; - return function (thisArg) { - var target = this, boundArgs = slice.call(arguments, 1); +if (typeof Function.prototype.bind !== 'function') { + Function.prototype.bind = (function () { + var slice = Array.prototype.slice; + return function (thisArg) { + var target = this, boundArgs = slice.call(arguments, 1); - if (typeof target != 'function') throw new TypeError(); + if (typeof target !== 'function') throw new TypeError(); - function bound() { - var args = boundArgs.concat(slice.call(arguments)); - target.apply(this instanceof bound ? this : thisArg, args); - } + function bound() { + var args = boundArgs.concat(slice.call(arguments)); + target.apply(this instanceof bound ? this : thisArg, args); + } - bound.prototype = (function F(proto) { - if (proto) F.prototype = proto; - if (!(this instanceof F)) return new F(); - })(target.prototype); + bound.prototype = (function F(proto) { + if (proto) F.prototype = proto; + if (!(this instanceof F)) return new F(); + })(target.prototype); - return bound; - }; - })(); + return bound; + }; + })(); } /** @@ -84,57 +86,57 @@ if (typeof Function.prototype.bind != 'function') { * @class AjaxRequest * @constructor */ -var AjaxRequest = PIXI.AjaxRequest = function() +PIXI.AjaxRequest = function AjaxRequest() { - var activexmodes = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Microsoft.XMLHTTP"] //activeX versions to check for in IE + var activexmodes = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Microsoft.XMLHTTP']; //activeX versions to check for in IE if (window.ActiveXObject) { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) for (var i=0; i>>>>>>>>") - console.log("_") + window.console.log('>>>>>>>>>'); + window.console.log('_'); var safe = 0; var tmp = item.first; - console.log(tmp); + window.console.log(tmp); while(tmp._iNext) { safe++; tmp = tmp._iNext; - console.log(tmp); + window.console.log(tmp); // console.log(tmp); if(safe > 100) { - console.log("BREAK") - break + window.console.log('BREAK'); + break; } } -} +}; From 5d516cfb8177e5d70be0da745e47ec5df1d5c873 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 16:14:18 -0800 Subject: [PATCH 08/12] remove some trailing whitespace --- src/pixi/filters/DotScreenFilter.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pixi/filters/DotScreenFilter.js b/src/pixi/filters/DotScreenFilter.js index de00f77..7a684a1 100644 --- a/src/pixi/filters/DotScreenFilter.js +++ b/src/pixi/filters/DotScreenFilter.js @@ -4,7 +4,7 @@ */ /** - * + * * This filter applies a pixlate effect making display objects appear 'blocky' * @class PixelateFilter * @contructor @@ -14,7 +14,7 @@ PIXI.DotScreenFilter = function() PIXI.AbstractFilter.call( this ); this.passes = [this]; - + // set the uniforms this.uniforms = { scale: {type: '1f', value:1}, @@ -54,7 +54,7 @@ PIXI.DotScreenFilter.prototype = Object.create( PIXI.DotScreenFilter.prototype ) PIXI.DotScreenFilter.prototype.constructor = PIXI.DotScreenFilter; /** - * + * * This describes the the scale * @property scale * @type Number @@ -70,7 +70,7 @@ Object.defineProperty(PIXI.DotScreenFilter.prototype, 'scale', { }); /** - * + * * This radius describes angle * @property angle * @type Number From 6dafb2524d4656f38493fd706638fadef8d3b9db Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 17:00:30 -0800 Subject: [PATCH 09/12] moar jshint fixes for tests --- .jshintrc | 14 ++++++++++++- Gruntfile.js | 16 +++++++++++---- test/functional/example-1-basics/index.js | 8 ++++---- test/unit/pixi/filters/MaskFilter.js | 8 ++++---- test/unit/pixi/loaders/BitmapFontLoader.js | 1 - test/unit/pixi/utils/EventTarget.js | 24 ++++++++++++++++------ 6 files changed, 51 insertions(+), 20 deletions(-) diff --git a/.jshintrc b/.jshintrc index b913f2b..08babe8 100644 --- a/.jshintrc +++ b/.jshintrc @@ -37,11 +37,23 @@ "maxcomplexity" : false, // Restrict the cyclomatic complexity of the code. "maxlen" : 220, // Require that all lines are 100 characters or less. "globals" : { // Register globals that are used in the code. + //commonjs globals "module": false, "require": false, + // PIXI globals "PIXI": false, - "spine": false + "spine": false, + + //chai globals + "chai": false, + + //mocha globals + "describe": false, + "it": false, + + //resemble globals + "resemble": false }, // == Relaxing Options ================================================ diff --git a/Gruntfile.js b/Gruntfile.js index 1952af7..ed72644 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -97,7 +97,7 @@ module.exports = function(grunt) { }, files: { srcBlob: '<%= dirs.src %>/**/*.js', - testBlob: '<%= dirs.test %>/{functional,lib/pixi,unit}/**/*.js', + testBlob: '<%= dirs.test %>/{functional,lib/pixi,unit/pixi}/**/*.js', build: '<%= dirs.build %>/pixi.dev.js', buildMin: '<%= dirs.build %>/pixi.js' }, @@ -122,10 +122,18 @@ module.exports = function(grunt) { } }, jshint: { - src: srcFiles.filter(function(v) { return v.match(/(Intro|Outro|Spine|Pixi)\.js$/) === null; }).concat('Gruntfile.js'), - test: ['<%= files.testBlob %>'], options: { jshintrc: '.jshintrc' + }, + source: srcFiles.filter(function(v) { return v.match(/(Intro|Outro|Spine|Pixi)\.js$/) === null; }).concat('Gruntfile.js'), + test: { + src: ['<%= files.testBlob %>'], + options: { + jshintrc: undefined, //don't use jshintrc for tests + expr: true, + undef: false, + camelcase: false + } } }, uglify: { @@ -170,7 +178,7 @@ module.exports = function(grunt) { grunt.registerTask('default', ['build', 'test']); - grunt.registerTask('build', ['jshint:src', 'concat', 'uglify']); + grunt.registerTask('build', ['jshint:source', 'concat', 'uglify']); grunt.registerTask('build-debug', ['concat_sourcemap', 'uglify']); grunt.registerTask('test', ['concat', 'jshint:test', 'karma']); diff --git a/test/functional/example-1-basics/index.js b/test/functional/example-1-basics/index.js index 7ae7a98..2ad32bd 100644 --- a/test/functional/example-1-basics/index.js +++ b/test/functional/example-1-basics/index.js @@ -16,7 +16,7 @@ describe('Example 1 - Basics', function () { function animate() { currentFrame += 1; - requestAnimFrame( animate ); + window.requestAnimFrame( animate ); // just for fun, lets rotate mr rabbit a little bunny.rotation += 0.1; @@ -39,10 +39,10 @@ describe('Example 1 - Basics', function () { // add the renderer view element to the DOM document.body.appendChild(renderer.view); - requestAnimFrame( animate ); + window.requestAnimFrame( animate ); // create a texture from an image path - var texture = PIXI.Texture.fromImage(baseUri + "/bunny.png"); + var texture = PIXI.Texture.fromImage(baseUri + '/bunny.png'); // create a new Sprite using the texture bunny = new PIXI.Sprite(texture); @@ -67,7 +67,7 @@ describe('Example 1 - Basics', function () { // loader.on('onProgress', function (event) { // console.log(event.content); // }); - loader.on('onComplete', function (event) { + loader.on('onComplete', function () { done(); initScene(); }); diff --git a/test/unit/pixi/filters/MaskFilter.js b/test/unit/pixi/filters/MaskFilter.js index 32d6a45..695f078 100644 --- a/test/unit/pixi/filters/MaskFilter.js +++ b/test/unit/pixi/filters/MaskFilter.js @@ -2,9 +2,9 @@ describe('pixi/filters/MaskFilter', function () { 'use strict'; var expect = chai.expect; - // var MaskFilter = PIXI.MaskFilter; + var MaskFilter = PIXI.MaskFilter; - // it('Module exists', function () { - // expect(MaskFilter).to.be.a('function'); - // }); + it('Module exists', function () { + expect(MaskFilter).to.be.a('function'); + }); }); diff --git a/test/unit/pixi/loaders/BitmapFontLoader.js b/test/unit/pixi/loaders/BitmapFontLoader.js index 6253c42..046f018 100644 --- a/test/unit/pixi/loaders/BitmapFontLoader.js +++ b/test/unit/pixi/loaders/BitmapFontLoader.js @@ -2,7 +2,6 @@ describe('pixi/loaders/BitmapFontLoader', function () { 'use strict'; var expect = chai.expect; - var BitmapFontLoader = PIXI.BitmapFontLoader; it('Module exists', function () { expect(PIXI.BitmapFontLoader).to.be.a('function'); diff --git a/test/unit/pixi/utils/EventTarget.js b/test/unit/pixi/utils/EventTarget.js index dc4ebd9..67c6ad1 100644 --- a/test/unit/pixi/utils/EventTarget.js +++ b/test/unit/pixi/utils/EventTarget.js @@ -9,13 +9,17 @@ describe('pixi/utils/EventTarget', function () { }); it('Confirm new instance', function () { - var obj = {}; EventTarget.call(obj); + var obj = {}; + + EventTarget.call(obj); pixi_utils_EventTarget_like(obj); }); it('addEventListener and dispatchEvent works', function (done) { var myData = {}, - obj = {}; EventTarget.call(obj); + obj = {}; + + EventTarget.call(obj); obj.addEventListener('myevent', function (event) { expect(event).to.be.an('object'); @@ -28,7 +32,9 @@ describe('pixi/utils/EventTarget', function () { }); it('removeEventListener works', function (done) { - var obj = {}; EventTarget.call(obj); + var obj = {}; + + EventTarget.call(obj); function onMyEvent() { done(new Error('addEventListener should not have been called')); @@ -42,7 +48,9 @@ describe('pixi/utils/EventTarget', function () { it('multiple dispatches', function () { var called = 0, - obj = {}; EventTarget.call(obj); + obj = {}; + + EventTarget.call(obj); function onMyEvent() { called++; @@ -58,7 +66,9 @@ describe('pixi/utils/EventTarget', function () { it('multiple events', function () { var called = 0, - obj = {}; EventTarget.call(obj); + obj = {}; + + EventTarget.call(obj); function onMyEvent() { called++; @@ -75,7 +85,9 @@ describe('pixi/utils/EventTarget', function () { it('multiple events one removed', function () { var called = 0, - obj = {}; EventTarget.call(obj); + obj = {}; + + EventTarget.call(obj); function onMyEvent() { called++; From 2f5d3a450abae0e5cf46207177b9358a06c3d49e Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 17:11:40 -0800 Subject: [PATCH 10/12] no longer need that --- test/unit/pixi/filters/MaskFilter.js | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 test/unit/pixi/filters/MaskFilter.js diff --git a/test/unit/pixi/filters/MaskFilter.js b/test/unit/pixi/filters/MaskFilter.js deleted file mode 100644 index 695f078..0000000 --- a/test/unit/pixi/filters/MaskFilter.js +++ /dev/null @@ -1,10 +0,0 @@ -describe('pixi/filters/MaskFilter', function () { - 'use strict'; - - var expect = chai.expect; - var MaskFilter = PIXI.MaskFilter; - - it('Module exists', function () { - expect(MaskFilter).to.be.a('function'); - }); -}); From 13cf18ce39c612cb5f6de0d7fc0f05728dac1056 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 17:33:42 -0800 Subject: [PATCH 11/12] some small changes to tests --- test/karma.conf.js | 2 +- test/lib/pixi/textures/Texture.js | 2 +- test/unit/pixi/renderers/webgl/WebGLShaders.js | 15 +++++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/test/karma.conf.js b/test/karma.conf.js index c66a696..cf5f7c1 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -66,7 +66,7 @@ module.exports = function(config) { // report which specs are slower than 500ms // CLI --report-slower-than 500 - reportSlowerThan : 1000, + reportSlowerThan : 500, preprocessors : { // '**/client/js/*.js': 'coverage' diff --git a/test/lib/pixi/textures/Texture.js b/test/lib/pixi/textures/Texture.js index d5867b6..bf064e7 100644 --- a/test/lib/pixi/textures/Texture.js +++ b/test/lib/pixi/textures/Texture.js @@ -25,7 +25,7 @@ function pixi_textures_Texture_confirmNew(obj, done) { if (obj.baseTexture.hasLoaded) { confirmFrameDone(); } else { - pixi_core_Rectangle_confirm(obj.frame, 0, 0, 1, 1); obj.addEventListener('update', confirmFrameDone); + pixi_core_Rectangle_confirm(obj.frame, 0, 0, 1, 1); } } diff --git a/test/unit/pixi/renderers/webgl/WebGLShaders.js b/test/unit/pixi/renderers/webgl/WebGLShaders.js index 2872de8..4459958 100644 --- a/test/unit/pixi/renderers/webgl/WebGLShaders.js +++ b/test/unit/pixi/renderers/webgl/WebGLShaders.js @@ -4,10 +4,17 @@ describe('renderers/webgl/WebGLShaders', function () { var expect = chai.expect; it('Module members exist', function () { - expect(PIXI).to.respondTo('initPrimitiveShader'); - expect(PIXI).to.respondTo('initDefaultShader'); - expect(PIXI).to.respondTo('initDefaultStripShader'); - expect(PIXI).to.respondTo('activateDefaultShader'); + expect(PIXI).to.respondTo('initDefaultShaders'); + expect(PIXI).to.respondTo('activatePrimitiveShader'); + expect(PIXI).to.respondTo('deactivatePrimitiveShader'); + + expect(PIXI).to.respondTo('activateStripShader'); + expect(PIXI).to.respondTo('deactivateStripShader'); + + expect(PIXI).to.respondTo('CompileVertexShader'); + expect(PIXI).to.respondTo('CompileFragmentShader'); + expect(PIXI).to.respondTo('_CompileShader'); + expect(PIXI).to.respondTo('compileProgram'); }); }); From 812fb076deced61016a0ac47af283de871996915 Mon Sep 17 00:00:00 2001 From: Chad Engler Date: Sun, 8 Dec 2013 17:37:09 -0800 Subject: [PATCH 12/12] remove build badge until pixi is on travis-ci --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index b8750d3..9f5601a 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ Pixi Renderer ![pixi.js logo](http://www.goodboydigital.com/pixijs/logo_small.png) -[![Build Status](https://secure.travis-ci.org/drkibitz/pixi.js.png)](http://travis-ci.org/drkibitz/pixi.js) - #### JavaScript 2D Renderer #### The aim of this project is to provide a fast lightweight 2D library that works