diff --git a/spine-turbulenz/LICENSE b/spine-turbulenz/LICENSE deleted file mode 100644 index 815ec1ca1..000000000 --- a/spine-turbulenz/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Spine Runtimes Software License -Version 2.3 - -Copyright (c) 2013-2015, Esoteric Software -All rights reserved. - -You are granted a perpetual, non-exclusive, non-sublicensable and -non-transferable license to use, install, execute and perform the Spine -Runtimes Software (the "Software") and derivative works solely for personal -or internal use. Without the written permission of Esoteric Software (see -Section 2 of the Spine Software License Agreement), you may not (a) modify, -translate, adapt or otherwise create derivative works, improvements of the -Software or develop new applications using the Software or (b) remove, -delete, alter or obscure any trademarks or any copyright, trademark, patent -or other intellectual property or proprietary rights notices on or in the -Software, including any copy thereof. Redistributions in binary or source -form must include this license and terms. - -THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/spine-turbulenz/README.md b/spine-turbulenz/README.md deleted file mode 100644 index 789b945cd..000000000 --- a/spine-turbulenz/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# spine-turbulenz - -spine-turbulenz is a basic example of how to load and manipulate [Spine](http://esotericsoftware.com) skeletal animation data using [Turbulenz](http://biz.turbulenz.com/developers). spine-turbulenz is based on [spine-js](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-js). - -## Licensing - -This Spine Runtime may only be used for personal or internal use, typically to evaluate Spine before purchasing. If you would like to incorporate a Spine Runtime into your applications, distribute software containing a Spine Runtime, or modify a Spine Runtime, then you will need a valid [Spine license](https://esotericsoftware.com/spine-purchase). Please see the [Spine Runtimes Software License](https://github.com/EsotericSoftware/spine-runtimes/blob/master/LICENSE) for detailed information. - -The Spine Runtimes are developed with the intent to be used with data exported from Spine. By purchasing Spine, `Section 2` of the [Spine Software License](https://esotericsoftware.com/files/license.txt) grants the right to create and distribute derivative works of the Spine Runtimes. - -## Spine version - -spine-turbulenz works with data exported from Spine 3.1.08. Updating spine-turbulenz to [v3.2](https://github.com/EsotericSoftware/spine-runtimes/issues/586) and [v3.3](https://github.com/EsotericSoftware/spine-runtimes/issues/613) is in progress. - -spine-turbulenz supports all Spine features except for rendering meshes. - -spine-turbulenz does not yet support loading the binary format. - -## Setup - -To run the example: - -1. Copy the contents of `spine-js` to `spine-turbulenz/spine-js`. -1. Place the files on a webserver. Images can't be loaded when run from a local directory. -1. Open `spine-turbulenz/example/index.html` in a web browser. - -## Demos - -- [spine-turbulenz Demo](http://esotericsoftware.com/files/runtimes/turbulenz/example/)
- [spine-turbulenz Demo source](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-turbulenz/example/index.html) - -## Notes - -- Atlas images should not use premultiplied alpha or rotation. diff --git a/spine-turbulenz/SpriteBatch.js b/spine-turbulenz/SpriteBatch.js deleted file mode 100644 index 0b54a565c..000000000 --- a/spine-turbulenz/SpriteBatch.js +++ /dev/null @@ -1,76 +0,0 @@ -/****************************************************************************** - * Spine Runtimes Software License - * Version 2.3 - * - * Copyright (c) 2013-2015, Esoteric Software - * All rights reserved. - * - * You are granted a perpetual, non-exclusive, non-sublicensable and - * non-transferable license to use, install, execute and perform the Spine - * Runtimes Software (the "Software") and derivative works solely for personal - * or internal use. Without the written permission of Esoteric Software (see - * Section 2 of the Spine Software License Agreement), you may not (a) modify, - * translate, adapt or otherwise create derivative works, improvements of the - * Software or develop new applications using the Software or (b) remove, - * delete, alter or obscure any trademarks or any copyright, trademark, patent - * or other intellectual property or proprietary rights notices on or in the - * Software, including any copy thereof. Redistributions in binary or source - * form must include this license and terms. - * - * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -function SpriteBatch (draw2D) { - this.draw2D = draw2D; - this.buffer = []; -} -SpriteBatch.prototype = { - count: 0, - texture: null, - blendMode: null, - begin: function (blendMode, sortMode) { - this.blendMode = blendMode; - this.draw2D.begin(blendMode, sortMode); - }, - add: function (texture, x1, y1, x2, y2, x3, y3, x4, y4, r, g, b, a, u1, v1, u2, v2) { - if (this.texture && this.texture != texture) this.flush(); - this.texture = texture; - var index = this.count++ * 16; - var buffer = this.buffer; - buffer[index++] = x1; - buffer[index++] = y1; - buffer[index++] = x2; - buffer[index++] = y2; - buffer[index++] = x3; - buffer[index++] = y3; - buffer[index++] = x4; - buffer[index++] = y4; - buffer[index++] = r; - buffer[index++] = g; - buffer[index++] = b; - buffer[index++] = a; - buffer[index++] = u1; - buffer[index++] = v1; - buffer[index++] = u2; - buffer[index] = v2; - }, - flush: function () { - if (!this.texture) return; - this.draw2D.drawRaw(this.texture, this.buffer, this.count, 0); - this.texture = null; - this.count = 0; - }, - end: function () { - this.flush(); - this.draw2D.end(); - } -}; diff --git a/spine-turbulenz/example/data/goblins.atlas b/spine-turbulenz/example/data/goblins.atlas deleted file mode 100644 index 271742263..000000000 --- a/spine-turbulenz/example/data/goblins.atlas +++ /dev/null @@ -1,285 +0,0 @@ - -goblins.png -format: RGBA8888 -filter: Linear,Linear -repeat: none -spear - rotate: false - xy: 2, 142 - size: 22, 368 - orig: 22, 368 - offset: 0, 0 - index: -1 -goblingirl/head - rotate: false - xy: 26, 429 - size: 103, 81 - orig: 103, 81 - offset: 0, 0 - index: -1 -goblin/head - rotate: false - xy: 26, 361 - size: 103, 66 - orig: 103, 66 - offset: 0, 0 - index: -1 -goblin/torso - rotate: false - xy: 131, 414 - size: 68, 96 - orig: 68, 96 - offset: 0, 0 - index: -1 -goblingirl/torso - rotate: false - xy: 26, 263 - size: 68, 96 - orig: 68, 96 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 26, 153 - size: 26, 108 - orig: 26, 108 - offset: 0, 0 - index: -1 -goblin/right-lower-leg - rotate: false - xy: 201, 434 - size: 36, 76 - orig: 36, 76 - offset: 0, 0 - index: -1 -goblingirl/right-lower-leg - rotate: false - xy: 54, 185 - size: 36, 76 - orig: 36, 76 - offset: 0, 0 - index: -1 -goblin/left-upper-leg - rotate: false - xy: 96, 286 - size: 33, 73 - orig: 33, 73 - offset: 0, 0 - index: -1 -goblin/pelvis - rotate: false - xy: 131, 369 - size: 62, 43 - orig: 62, 43 - offset: 0, 0 - index: -1 -goblingirl/pelvis - rotate: false - xy: 131, 324 - size: 62, 43 - orig: 62, 43 - offset: 0, 0 - index: -1 -goblin/right-foot - rotate: false - xy: 131, 289 - size: 63, 33 - orig: 63, 33 - offset: 0, 0 - index: -1 -goblin/left-lower-leg - rotate: false - xy: 2, 70 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblin/right-upper-leg - rotate: false - xy: 2, 5 - size: 34, 63 - orig: 34, 63 - offset: 0, 0 - index: -1 -goblingirl/left-lower-leg - rotate: false - xy: 195, 342 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblingirl/left-upper-leg - rotate: false - xy: 37, 81 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblingirl/right-upper-leg - rotate: false - xy: 38, 16 - size: 34, 63 - orig: 34, 63 - offset: 0, 0 - index: -1 -goblin/eyes-closed - rotate: false - xy: 38, 2 - size: 34, 12 - orig: 34, 12 - offset: 0, 0 - index: -1 -goblin/undies - rotate: false - xy: 54, 154 - size: 36, 29 - orig: 36, 29 - offset: 0, 0 - index: -1 -goblin/right-arm - rotate: false - xy: 72, 102 - size: 23, 50 - orig: 23, 50 - offset: 0, 0 - index: -1 -goblin/left-foot - rotate: false - xy: 131, 256 - size: 65, 31 - orig: 65, 31 - offset: 0, 0 - index: -1 -goblingirl/right-arm - rotate: false - xy: 196, 290 - size: 28, 50 - orig: 28, 50 - offset: 0, 0 - index: -1 -goblingirl/left-shoulder - rotate: false - xy: 226, 294 - size: 28, 46 - orig: 28, 46 - offset: 0, 0 - index: -1 -goblin/left-arm - rotate: false - xy: 198, 253 - size: 37, 35 - orig: 37, 35 - offset: 0, 0 - index: -1 -goblingirl/left-foot - rotate: false - xy: 92, 223 - size: 65, 31 - orig: 65, 31 - offset: 0, 0 - index: -1 -goblingirl/right-foot - rotate: false - xy: 92, 188 - size: 63, 33 - orig: 63, 33 - offset: 0, 0 - index: -1 -goblin/undie-straps - rotate: false - xy: 92, 167 - size: 55, 19 - orig: 55, 19 - offset: 0, 0 - index: -1 -goblingirl/left-arm - rotate: false - xy: 159, 219 - size: 37, 35 - orig: 37, 35 - offset: 0, 0 - index: -1 -goblin/right-shoulder - rotate: false - xy: 97, 120 - size: 39, 45 - orig: 39, 45 - offset: 0, 0 - index: -1 -goblingirl/right-shoulder - rotate: false - xy: 198, 206 - size: 39, 45 - orig: 39, 45 - offset: 0, 0 - index: -1 -goblin/left-hand - rotate: false - xy: 157, 176 - size: 36, 41 - orig: 36, 41 - offset: 0, 0 - index: -1 -goblin/neck - rotate: false - xy: 195, 163 - size: 36, 41 - orig: 36, 41 - offset: 0, 0 - index: -1 -goblingirl/undie-straps - rotate: false - xy: 97, 99 - size: 55, 19 - orig: 55, 19 - offset: 0, 0 - index: -1 -goblingirl/neck - rotate: false - xy: 138, 120 - size: 35, 41 - orig: 35, 41 - offset: 0, 0 - index: -1 -goblingirl/left-hand - rotate: false - xy: 175, 121 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -goblin/left-shoulder - rotate: false - xy: 212, 117 - size: 29, 44 - orig: 29, 44 - offset: 0, 0 - index: -1 -goblingirl/eyes-closed - rotate: false - xy: 154, 97 - size: 37, 21 - orig: 37, 21 - offset: 0, 0 - index: -1 -goblin/right-hand - rotate: false - xy: 193, 78 - size: 36, 37 - orig: 36, 37 - offset: 0, 0 - index: -1 -goblingirl/right-hand - rotate: false - xy: 74, 39 - size: 36, 37 - orig: 36, 37 - offset: 0, 0 - index: -1 -goblingirl/undies - rotate: false - xy: 74, 8 - size: 36, 29 - orig: 36, 29 - offset: 0, 0 - index: -1 diff --git a/spine-turbulenz/example/data/goblins.json b/spine-turbulenz/example/data/goblins.json deleted file mode 100644 index f1dcc96a0..000000000 --- a/spine-turbulenz/example/data/goblins.json +++ /dev/null @@ -1,499 +0,0 @@ -{ -"bones": [ - { "name": "root" }, - { "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 }, - { "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 }, - { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 }, - { "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 }, - { "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 }, - { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 }, - { "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 }, - { "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 }, - { "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 }, - { "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 }, - { "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 }, - { "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 }, - { "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }, - { "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 }, - { "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 }, - { "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 }, - { "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 } -], -"slots": [ - { "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" }, - { "name": "left arm", "bone": "left arm", "attachment": "left arm" }, - { "name": "left hand item", "bone": "left hand", "attachment": "spear" }, - { "name": "left hand", "bone": "left hand", "attachment": "left hand" }, - { "name": "left foot", "bone": "left foot", "attachment": "left foot" }, - { "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" }, - { "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" }, - { "name": "neck", "bone": "neck", "attachment": "neck" }, - { "name": "torso", "bone": "torso", "attachment": "torso" }, - { "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" }, - { "name": "right foot", "bone": "right foot", "attachment": "right foot" }, - { "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" }, - { "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" }, - { "name": "undies", "bone": "pelvis", "attachment": "undies" }, - { "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" }, - { "name": "head", "bone": "head", "attachment": "head" }, - { "name": "eyes", "bone": "head" }, - { "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" }, - { "name": "right arm", "bone": "right arm", "attachment": "right arm" }, - { "name": "right hand item", "bone": "right hand", "attachment": "dagger" }, - { "name": "right hand", "bone": "right hand", "attachment": "right hand" } -], -"skins": { - "default": { - "left hand item": { - "dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 }, - "spear": { "x": -4.55, "y": 39.2, "rotation": 13.04, "width": 22, "height": 368 } - }, - "right hand item": { - "dagger": { "x": 6.51, "y": -24.15, "rotation": -8.06, "width": 26, "height": 108 } - } - }, - "goblin": { - "neck": { - "neck": { "name": "goblin/neck", "x": 10.1, "y": 0.42, "rotation": -93.69, "width": 36, "height": 41 } - }, - "undies": { - "undies": { "name": "goblin/undies", "x": 6.3, "y": 0.12, "rotation": 0.91, "width": 36, "height": 29 } - }, - "right hand": { - "right hand": { "name": "goblin/right-hand", "x": 7.88, "y": 2.78, "rotation": 91.96, "width": 36, "height": 37 } - }, - "right arm": { - "right arm": { "name": "goblin/right-arm", "x": 16.44, "y": -1.04, "rotation": 94.32, "width": 23, "height": 50 } - }, - "head": { - "head": { "name": "goblin/head", "x": 25.73, "y": 2.33, "rotation": -92.29, "width": 103, "height": 66 } - }, - "left shoulder": { - "left shoulder": { "name": "goblin/left-shoulder", "x": 15.56, "y": -2.26, "rotation": 62.01, "width": 29, "height": 44 } - }, - "left arm": { - "left arm": { - "name": "goblin/left-arm", - "x": 16.7, - "y": -1.69, - "scaleX": 1.057, - "scaleY": 1.057, - "rotation": 33.84, - "width": 37, - "height": 35 - } - }, - "left hand": { - "left hand": { - "name": "goblin/left-hand", - "x": 3.47, - "y": 3.41, - "scaleX": 0.892, - "scaleY": 0.892, - "rotation": 31.14, - "width": 36, - "height": 41 - } - }, - "right lower leg": { - "right lower leg": { "name": "goblin/right-lower-leg", "x": 25.68, "y": -3.15, "rotation": 111.83, "width": 36, "height": 76 } - }, - "right upper leg": { - "right upper leg": { "name": "goblin/right-upper-leg", "x": 20.35, "y": 1.47, "rotation": 97.49, "width": 34, "height": 63 } - }, - "pelvis": { - "pelvis": { "name": "goblin/pelvis", "x": -5.61, "y": 0.76, "width": 62, "height": 43 } - }, - "left lower leg": { - "left lower leg": { "name": "goblin/left-lower-leg", "x": 23.58, "y": -2.06, "rotation": 105.75, "width": 33, "height": 70 } - }, - "left upper leg": { - "left upper leg": { "name": "goblin/left-upper-leg", "x": 29.68, "y": -3.87, "rotation": 89.09, "width": 33, "height": 73 } - }, - "torso": { - "torso": { "name": "goblin/torso", "x": 38.09, "y": -3.87, "rotation": -94.95, "width": 68, "height": 96 } - }, - "right shoulder": { - "right shoulder": { "name": "goblin/right-shoulder", "x": 15.68, "y": -1.03, "rotation": 130.65, "width": 39, "height": 45 } - }, - "right foot": { - "right foot": { "name": "goblin/right-foot", "x": 23.56, "y": 9.8, "rotation": 1.52, "width": 63, "height": 33 } - }, - "left foot": { - "left foot": { "name": "goblin/left-foot", "x": 24.85, "y": 8.74, "rotation": 3.32, "width": 65, "height": 31 } - }, - "undie straps": { - "undie straps": { "name": "goblin/undie-straps", "x": -3.87, "y": 13.1, "scaleX": 1.089, "width": 55, "height": 19 } - }, - "eyes": { - "eyes closed": { "name": "goblin/eyes-closed", "x": 32.21, "y": -21.27, "rotation": -88.92, "width": 34, "height": 12 } - } - }, - "goblingirl": { - "left upper leg": { - "left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 } - }, - "left lower leg": { - "left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 } - }, - "left foot": { - "left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 } - }, - "right upper leg": { - "right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 } - }, - "right lower leg": { - "right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 } - }, - "right foot": { - "right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 } - }, - "torso": { - "torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 } - }, - "left shoulder": { - "left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 } - }, - "left arm": { - "left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 } - }, - "left hand": { - "left hand": { - "name": "goblingirl/left-hand", - "x": 4.34, - "y": 2.39, - "scaleX": 0.896, - "scaleY": 0.896, - "rotation": 30.34, - "width": 35, - "height": 40 - } - }, - "neck": { - "neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 } - }, - "head": { - "head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 } - }, - "right shoulder": { - "right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 } - }, - "right arm": { - "right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 } - }, - "right hand": { - "right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 } - }, - "pelvis": { - "pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 } - }, - "undie straps": { - "undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 } - }, - "undies": { - "undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 } - }, - "eyes": { - "eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 } - } - } -}, -"animations": { - "walk": { - "bones": { - "left upper leg": { - "rotate": [ - { "time": 0, "angle": -26.55 }, - { "time": 0.1333, "angle": -8.78 }, - { "time": 0.2333, "angle": 9.51 }, - { "time": 0.3666, "angle": 30.74 }, - { "time": 0.5, "angle": 25.33 }, - { "time": 0.6333, "angle": 26.11 }, - { "time": 0.7333, "angle": -7.7 }, - { "time": 0.8666, "angle": -21.19 }, - { "time": 1, "angle": -26.55 } - ], - "translate": [ - { "time": 0, "x": -1.32, "y": 1.7 }, - { "time": 0.3666, "x": -0.06, "y": 2.42 }, - { "time": 1, "x": -1.32, "y": 1.7 } - ] - }, - "right upper leg": { - "rotate": [ - { "time": 0, "angle": 42.45 }, - { "time": 0.1333, "angle": 52.1 }, - { "time": 0.2333, "angle": 8.53 }, - { "time": 0.5, "angle": -16.93 }, - { "time": 0.6333, "angle": 1.89 }, - { - "time": 0.7333, - "angle": 28.06, - "curve": [ 0.462, 0.11, 1, 1 ] - }, - { - "time": 0.8666, - "angle": 58.68, - "curve": [ 0.5, 0.02, 1, 1 ] - }, - { "time": 1, "angle": 42.45 } - ], - "translate": [ - { "time": 0, "x": 6.23, "y": 0 }, - { "time": 0.2333, "x": 2.14, "y": 2.4 }, - { "time": 0.5, "x": 2.44, "y": 4.8 }, - { "time": 1, "x": 6.23, "y": 0 } - ] - }, - "left lower leg": { - "rotate": [ - { "time": 0, "angle": -22.98 }, - { "time": 0.1333, "angle": -63.5 }, - { "time": 0.2333, "angle": -73.76 }, - { "time": 0.5, "angle": 5.11 }, - { "time": 0.6333, "angle": -28.29 }, - { "time": 0.7333, "angle": 4.08 }, - { "time": 0.8666, "angle": 3.53 }, - { "time": 1, "angle": -22.98 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 }, - { "time": 0.2333, "x": 2.55, "y": -0.47 }, - { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 1, "x": 0, "y": 0 } - ] - }, - "left foot": { - "rotate": [ - { "time": 0, "angle": -3.69 }, - { "time": 0.1333, "angle": -10.42 }, - { "time": 0.2333, "angle": -5.01 }, - { "time": 0.3666, "angle": 3.87 }, - { "time": 0.5, "angle": -3.87 }, - { "time": 0.6333, "angle": 2.78 }, - { "time": 0.7333, "angle": 1.68 }, - { "time": 0.8666, "angle": -8.54 }, - { "time": 1, "angle": -3.69 } - ] - }, - "right shoulder": { - "rotate": [ - { - "time": 0, - "angle": 5.29, - "curve": [ 0.264, 0, 0.75, 1 ] - }, - { "time": 0.6333, "angle": 6.65 }, - { "time": 1, "angle": 5.29 } - ] - }, - "right arm": { - "rotate": [ - { - "time": 0, - "angle": -4.02, - "curve": [ 0.267, 0, 0.804, 0.99 ] - }, - { - "time": 0.6333, - "angle": 19.78, - "curve": [ 0.307, 0, 0.787, 0.99 ] - }, - { "time": 1, "angle": -4.02 } - ] - }, - "right hand": { - "rotate": [ - { "time": 0, "angle": 8.98 }, - { "time": 0.6333, "angle": 0.51 }, - { "time": 1, "angle": 8.98 } - ] - }, - "left shoulder": { - "rotate": [ - { - "time": 0, - "angle": 6.25, - "curve": [ 0.339, 0, 0.683, 1 ] - }, - { - "time": 0.5, - "angle": -11.78, - "curve": [ 0.281, 0, 0.686, 0.99 ] - }, - { "time": 1, "angle": 6.25 } - ], - "translate": [ - { "time": 0, "x": 1.15, "y": 0.23 } - ] - }, - "left hand": { - "rotate": [ - { - "time": 0, - "angle": -21.23, - "curve": [ 0.295, 0, 0.755, 0.98 ] - }, - { - "time": 0.5, - "angle": -27.28, - "curve": [ 0.241, 0, 0.75, 0.97 ] - }, - { "time": 1, "angle": -21.23 } - ] - }, - "left arm": { - "rotate": [ - { - "time": 0, - "angle": 28.37, - "curve": [ 0.339, 0, 0.683, 1 ] - }, - { - "time": 0.5, - "angle": 60.09, - "curve": [ 0.281, 0, 0.686, 0.99 ] - }, - { "time": 1, "angle": 28.37 } - ] - }, - "torso": { - "rotate": [ - { "time": 0, "angle": -10.28 }, - { - "time": 0.1333, - "angle": -15.38, - "curve": [ 0.545, 0, 0.818, 1 ] - }, - { - "time": 0.3666, - "angle": -9.78, - "curve": [ 0.58, 0.17, 0.669, 0.99 ] - }, - { - "time": 0.6333, - "angle": -15.75, - "curve": [ 0.235, 0.01, 0.795, 1 ] - }, - { - "time": 0.8666, - "angle": -7.06, - "curve": [ 0.209, 0, 0.816, 0.98 ] - }, - { "time": 1, "angle": -10.28 } - ], - "translate": [ - { "time": 0, "x": -1.29, "y": 1.68 } - ] - }, - "right foot": { - "rotate": [ - { "time": 0, "angle": -5.25 }, - { "time": 0.2333, "angle": -1.91 }, - { "time": 0.3666, "angle": -6.45 }, - { "time": 0.5, "angle": -5.39 }, - { "time": 0.7333, "angle": -11.68 }, - { "time": 0.8666, "angle": 0.46 }, - { "time": 1, "angle": -5.25 } - ] - }, - "right lower leg": { - "rotate": [ - { - "time": 0, - "angle": -3.39, - "curve": [ 0.316, 0.01, 0.741, 0.98 ] - }, - { - "time": 0.1333, - "angle": -45.53, - "curve": [ 0.229, 0, 0.738, 0.97 ] - }, - { "time": 0.2333, "angle": -4.83 }, - { "time": 0.5, "angle": -19.53 }, - { "time": 0.6333, "angle": -64.8 }, - { - "time": 0.7333, - "angle": -82.56, - "curve": [ 0.557, 0.18, 1, 1 ] - }, - { "time": 1, "angle": -3.39 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.5, "x": 0, "y": 0 }, - { "time": 0.6333, "x": 2.18, "y": 0.21 }, - { "time": 1, "x": 0, "y": 0 } - ] - }, - "hip": { - "rotate": [ - { "time": 0, "angle": 0, "curve": "stepped" }, - { "time": 1, "angle": 0 } - ], - "translate": [ - { "time": 0, "x": 0, "y": -4.16 }, - { - "time": 0.1333, - "x": 0, - "y": -7.05, - "curve": [ 0.359, 0.47, 0.646, 0.74 ] - }, - { "time": 0.3666, "x": 0, "y": 6.78 }, - { "time": 0.5, "x": 0, "y": -6.13 }, - { - "time": 0.6333, - "x": 0, - "y": -7.05, - "curve": [ 0.359, 0.47, 0.646, 0.74 ] - }, - { "time": 0.8666, "x": 0, "y": 6.78 }, - { "time": 1, "x": 0, "y": -4.16 } - ] - }, - "neck": { - "rotate": [ - { "time": 0, "angle": 3.6 }, - { "time": 0.1333, "angle": 17.49 }, - { "time": 0.2333, "angle": 6.1 }, - { "time": 0.3666, "angle": 3.45 }, - { "time": 0.5, "angle": 5.17 }, - { "time": 0.6333, "angle": 18.36 }, - { "time": 0.7333, "angle": 6.09 }, - { "time": 0.8666, "angle": 2.28 }, - { "time": 1, "angle": 3.6 } - ] - }, - "head": { - "rotate": [ - { - "time": 0, - "angle": 3.6, - "curve": [ 0, 0, 0.704, 1.17 ] - }, - { "time": 0.1333, "angle": -0.2 }, - { "time": 0.2333, "angle": 6.1 }, - { "time": 0.3666, "angle": 3.45 }, - { - "time": 0.5, - "angle": 5.17, - "curve": [ 0, 0, 0.704, 1.61 ] - }, - { "time": 0.6666, "angle": 1.1 }, - { "time": 0.7333, "angle": 6.09 }, - { "time": 0.8666, "angle": 2.28 }, - { "time": 1, "angle": 3.6 } - ] - } - }, - "slots": { - "eyes": { - "attachment": [ - { "time": 0.7, "name": "eyes closed" }, - { "time": 0.8, "name": null } - ] - } - } - } -} -} \ No newline at end of file diff --git a/spine-turbulenz/example/data/goblins.png b/spine-turbulenz/example/data/goblins.png deleted file mode 100644 index 863b29467..000000000 Binary files a/spine-turbulenz/example/data/goblins.png and /dev/null differ diff --git a/spine-turbulenz/example/data/hero.atlas b/spine-turbulenz/example/data/hero.atlas deleted file mode 100644 index 1c0922303..000000000 --- a/spine-turbulenz/example/data/hero.atlas +++ /dev/null @@ -1,139 +0,0 @@ - -hero.png -size: 512,256 -format: RGBA8888 -filter: Linear,Linear -repeat: none -body - rotate: false - xy: 176, 81 - size: 97, 95 - orig: 97, 95 - offset: 0, 0 - index: -1 -eyes - rotate: false - xy: 181, 48 - size: 82, 31 - orig: 82, 31 - offset: 0, 0 - index: -1 -fingers - rotate: false - xy: 458, 155 - size: 31, 33 - orig: 31, 33 - offset: 0, 0 - index: -1 -foot1 - rotate: false - xy: 236, 4 - size: 50, 42 - orig: 50, 42 - offset: 0, 0 - index: -1 -foot2 - rotate: false - xy: 181, 8 - size: 53, 38 - orig: 53, 38 - offset: 0, 0 - index: -1 -forearm1 - rotate: false - xy: 288, 5 - size: 41, 49 - orig: 41, 49 - offset: 0, 0 - index: -1 -forearm2 - rotate: false - xy: 425, 111 - size: 31, 32 - orig: 31, 32 - offset: 0, 0 - index: -1 -hand1 - rotate: false - xy: 386, 128 - size: 37, 48 - orig: 37, 48 - offset: 0, 0 - index: -1 -hand2 - rotate: false - xy: 425, 145 - size: 31, 37 - orig: 31, 37 - offset: 0, 0 - index: -1 -head - rotate: false - xy: 2, 74 - size: 172, 173 - orig: 172, 173 - offset: 0, 0 - index: -1 -mantles - rotate: false - xy: 2, 17 - size: 136, 55 - orig: 136, 55 - offset: 0, 0 - index: -1 -mouth - rotate: false - xy: 2, 2 - size: 61, 13 - orig: 61, 13 - offset: 0, 0 - index: -1 -shin1 - rotate: false - xy: 456, 190 - size: 53, 57 - orig: 53, 57 - offset: 0, 0 - index: -1 -shin2 - rotate: false - xy: 275, 56 - size: 51, 54 - orig: 51, 54 - offset: 0, 0 - index: -1 -sword - rotate: false - xy: 176, 178 - size: 216, 69 - orig: 216, 69 - offset: 0, 0 - index: -1 -thigh1 - rotate: false - xy: 394, 184 - size: 60, 63 - orig: 60, 63 - offset: 0, 0 - index: -1 -thigh2 - rotate: false - xy: 275, 112 - size: 57, 64 - orig: 57, 64 - offset: 0, 0 - index: -1 -upperarm1 - rotate: false - xy: 334, 120 - size: 50, 56 - orig: 50, 56 - offset: 0, 0 - index: -1 -upperarm2 - rotate: false - xy: 140, 13 - size: 39, 59 - orig: 39, 59 - offset: 0, 0 - index: -1 diff --git a/spine-turbulenz/example/data/hero.json b/spine-turbulenz/example/data/hero.json deleted file mode 100644 index 5ceec665d..000000000 --- a/spine-turbulenz/example/data/hero.json +++ /dev/null @@ -1 +0,0 @@ -{"skeleton":{"hash":"/c595Zn6OYuZT0GEQ7y1piry/xk","spine":"Dev","width":319.29,"height":337.01},"bones":[{"name":"root"},{"name":"Hip","parent":"root","y":94.88},{"name":"L_Ground","parent":"root","x":-31.28,"y":0.26},{"name":"LookTarget","parent":"root","x":112.83,"y":218.2},{"name":"R_Ground","parent":"root","x":28.11,"y":0.26},{"name":"L_Ankle","parent":"L_Ground","x":0.26,"y":33.05},{"name":"LookConstraintGoal","parent":"LookTarget","y":-43.82},{"name":"R_Ankle","parent":"R_Ground","y":31.79},{"name":"body","parent":"Hip","length":60.79,"x":4.09,"y":3.17,"rotation":96.39},{"name":"thigh1","parent":"Hip","length":23.94,"x":-17.51,"y":-5.22,"rotation":-107.07},{"name":"thigh2","parent":"Hip","length":23.65,"x":21.85,"y":-5.86,"rotation":-85.46},{"name":"head","parent":"body","length":24.35,"x":74.55,"y":-4.84,"rotation":-92.69},{"name":"mantles","parent":"body","x":48.47,"y":-9,"rotation":-2.25},{"name":"shin1","parent":"thigh1","length":28.23,"x":29.76,"y":-0.91,"rotation":10.26},{"name":"shin2","parent":"thigh2","length":25.35,"x":31.99,"y":2.96,"rotation":-2.25},{"name":"upperarm1","parent":"body","length":19.35,"x":52.49,"y":41.84,"rotation":130.11},{"name":"upperarm2","parent":"body","length":25.98,"x":57.94,"y":-38.93,"rotation":-178.95},{"name":"foot1","parent":"shin1","length":27.07,"x":28.17,"y":-0.48,"rotation":-90.96,"inheritRotation":false},{"name":"foot2","parent":"shin2","length":22.28,"x":25.54,"y":0.27,"rotation":-90.42,"inheritRotation":false},{"name":"forearm1","parent":"upperarm1","length":22.06,"x":23.97,"y":5.16,"rotation":30.56},{"name":"forearm2","parent":"upperarm2","length":15.3,"x":28.74,"y":-0.9,"rotation":6.79},{"name":"hand1","parent":"forearm1","length":28.01,"x":27.54,"y":0.44,"rotation":16.24},{"name":"hand2","parent":"forearm2","length":23.76,"x":22.8,"y":-0.21,"rotation":1.35},{"name":"weapon","parent":"hand2","length":157.4,"x":15.97,"y":1.43,"rotation":77.9}],"ik":[{"name":"L_Leg","bones":["thigh1","shin1"],"target":"L_Ankle","bendPositive":false},{"name":"R_Leg","bones":["thigh2","shin2"],"target":"R_Ankle","bendPositive":false},{"name":"LookConstraint","bones":["head"],"target":"LookConstraintGoal","mix":0}],"slots":[{"name":"upperarm2","bone":"upperarm2","attachment":"upperarm2"},{"name":"sword","bone":"root"},{"name":"hand2","bone":"hand2","attachment":"hand2"},{"name":"weapon","bone":"weapon","attachment":"sword"},{"name":"fingers","bone":"hand2","attachment":"fingers"},{"name":"forearm2","bone":"forearm2","attachment":"forearm2"},{"name":"thigh2","bone":"thigh2","attachment":"thigh2"},{"name":"foot2","bone":"foot2","attachment":"foot2"},{"name":"shin2","bone":"shin2","attachment":"shin2"},{"name":"thigh1","bone":"thigh1","attachment":"thigh1"},{"name":"foot1","bone":"foot1","attachment":"foot1"},{"name":"body","bone":"body","attachment":"body"},{"name":"shin1","bone":"shin1","attachment":"shin1"},{"name":"upperarm1","bone":"upperarm1","attachment":"upperarm1"},{"name":"mantles","bone":"mantles","attachment":"mantles"},{"name":"head","bone":"head","attachment":"head"},{"name":"mouth","bone":"head","attachment":"mouth"},{"name":"eyes","bone":"head","attachment":"eyes"},{"name":"forearm1","bone":"forearm1","attachment":"forearm1"},{"name":"hand1","bone":"hand1","attachment":"hand1"}],"skins":{"default":{"body":{"body":{"x":33.81,"y":2.59,"rotation":-92.7,"width":97,"height":95}},"eyes":{"eyes":{"x":6.48,"y":50.75,"rotation":0.12,"width":82,"height":31}},"fingers":{"fingers":{"x":16.21,"y":1.37,"rotation":82.36,"width":31,"height":33}},"foot1":{"foot1":{"x":12.55,"y":0.12,"rotation":90.96,"width":50,"height":42}},"foot2":{"foot2":{"x":8.83,"y":2.92,"rotation":90.42,"width":53,"height":38}},"forearm1":{"forearm1":{"x":11.88,"y":-5.04,"rotation":106.61,"width":41,"height":49}},"forearm2":{"forearm2":{"x":13.08,"y":-0.63,"rotation":83.71,"width":31,"height":32}},"hand1":{"hand1":{"x":11.92,"y":-0.7,"rotation":90.37,"width":37,"height":48}},"hand2":{"hand2":{"x":14.23,"y":1.64,"rotation":82.36,"width":31,"height":37}},"head":{"head":{"x":7.79,"y":71.87,"rotation":0.12,"width":172,"height":173}},"mantles":{"mantles":{"x":15.57,"y":11.76,"rotation":-90.45,"width":136,"height":55}},"mouth":{"mouth":{"x":12.07,"y":10.76,"rotation":0.12,"width":61,"height":13}},"shin1":{"shin1":{"x":8.95,"y":0.67,"rotation":96.8,"width":53,"height":57}},"shin2":{"shin2":{"x":2.25,"y":-2.94,"rotation":87.71,"width":51,"height":54}},"thigh1":{"thigh1":{"x":11.98,"y":-1.01,"rotation":107.07,"width":60,"height":63}},"thigh2":{"thigh2":{"x":15.7,"y":-4.61,"rotation":85.46,"width":57,"height":64}},"upperarm1":{"upperarm1":{"x":6.6,"y":0.05,"rotation":137.18,"width":50,"height":56}},"upperarm2":{"upperarm2":{"x":13.32,"y":-2.21,"rotation":90.45,"width":39,"height":59}},"weapon":{"sword":{"x":71.38,"y":0.2,"rotation":0.19,"width":216,"height":69}}}},"events":{"Footstep":{}},"animations":{"Attack":{"bones":{"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-12.6,"y":-11.34},{"time":0.0666,"x":-20.75,"y":-23.08},{"time":0.1333,"x":-15.51,"y":-16.91},{"time":0.2,"x":-5.88,"y":-21.85},{"time":0.2666,"x":-7.08,"y":-25.29},{"time":0.4,"x":-12.6,"y":-11.34}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":51.94,"y":0,"curve":"stepped"},{"time":0.4,"x":51.94,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-67.98,"y":0,"curve":"stepped"},{"time":0.4,"x":-67.98,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":2.2},{"time":0.0666,"angle":13.21},{"time":0.1333,"angle":-9.58},{"time":0.2,"angle":-23.58},{"time":0.2666,"angle":-32.14},{"time":0.4,"angle":2.2}],"translate":[{"time":0,"x":-0.76,"y":-1.89},{"time":0.1333,"x":4.86,"y":-0.24},{"time":0.2,"x":8.05,"y":-2.43},{"time":0.4,"x":-0.76,"y":-1.89}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":14.5,"y":-3.78,"curve":"stepped"},{"time":0.4,"x":14.5,"y":-3.78}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":-22.57,"y":1.51},{"time":0.2,"x":-13.26,"y":-2.4},{"time":0.4,"x":-22.57,"y":1.51}]},"head":{"rotate":[{"time":0,"angle":-19.21},{"time":0.0666,"angle":-19.17},{"time":0.1333,"angle":4.76},{"time":0.2,"angle":12.46},{"time":0.2666,"angle":12.57},{"time":0.4,"angle":-19.21}],"translate":[{"time":0,"x":0,"y":0},{"time":0.0666,"x":3.47,"y":5.7},{"time":0.2,"x":-4.55,"y":-12.27},{"time":0.4,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":-8.27},{"time":0.0666,"angle":5.32},{"time":0.1333,"angle":4.8},{"time":0.2,"angle":-2.43},{"time":0.2666,"angle":-12.35},{"time":0.4,"angle":-8.27}],"translate":[{"time":0,"x":0,"y":0},{"time":0.0666,"x":5.51,"y":-5.45},{"time":0.1333,"x":1.53,"y":-5.87},{"time":0.2,"x":0.46,"y":-6.11},{"time":0.2666,"x":-6.55,"y":-4.72},{"time":0.4,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-4.05},{"time":0.0666,"angle":33.65},{"time":0.1333,"angle":-3.75},{"time":0.2666,"angle":-49.64},{"time":0.3333,"angle":-42.31},{"time":0.4,"angle":-4.05}],"translate":[{"time":0,"x":0,"y":0},{"time":0.2,"x":-2.5,"y":-6.51},{"time":0.4,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":324.46},{"time":0.0666,"angle":101.05},{"time":0.1333,"angle":49.05},{"time":0.2,"angle":15.11},{"time":0.2666,"angle":313.18},{"time":0.4,"angle":324.46}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-2.1,"y":-8.13},{"time":0.2,"x":-10.56,"y":1.25},{"time":0.4,"x":0,"y":0}]},"foot1":{"rotate":[{"time":0,"angle":8.9,"curve":"stepped"},{"time":0.4,"angle":8.9}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-13.11,"curve":"stepped"},{"time":0.4,"angle":-13.11}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":7.93},{"time":0.0666,"angle":42.3},{"time":0.1333,"angle":21.87},{"time":0.3333,"angle":43.27},{"time":0.4,"angle":7.93}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":56.31},{"time":0.0666,"angle":87.62},{"time":0.1333,"angle":6.51},{"time":0.2,"angle":1},{"time":0.2666,"angle":45.14},{"time":0.4,"angle":56.31}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":-8.94},{"time":0.2666,"angle":-20.79},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":17.89},{"time":0.0666,"angle":-12.89},{"time":0.1333,"angle":-11.39},{"time":0.2,"angle":6.2},{"time":0.2666,"angle":18.96},{"time":0.4,"angle":17.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.4,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0}]}}},"Crouch":{"bones":{"upperarm2":{"rotate":[{"time":0,"angle":38.03},{"time":0.5,"angle":30.8},{"time":1,"angle":38.03}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-15.51,"curve":[0.25,0,0.75,1]},{"time":0.5,"angle":-11.54,"curve":[0.25,0,0.75,1]},{"time":1,"angle":-15.51}],"translate":[{"time":0,"x":-0.41,"y":-2.32,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":-2.2,"y":-0.53,"curve":[0.25,0,0.75,1]},{"time":1,"x":-0.41,"y":-2.32}]},"head":{"rotate":[{"time":0,"angle":8.72},{"time":0.5,"angle":3.24},{"time":1,"angle":8.72}],"translate":[{"time":0,"x":-4.42,"y":-2.85,"curve":[0.361,0.63,0.697,1]},{"time":0.1666,"x":-4.84,"y":-3.05,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":-2.35,"y":-1.86,"curve":[0.36,0.43,0.701,0.8]},{"time":1,"x":-4.42,"y":-2.85}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-11.22,"y":-42.01,"curve":"stepped"},{"time":1,"x":-11.22,"y":-42.01}]},"mantles":{"rotate":[{"time":0,"angle":9.04},{"time":0.5,"angle":7.13},{"time":1,"angle":9.04}],"translate":[{"time":0,"x":-0.09,"y":0,"curve":"stepped"},{"time":1,"x":-0.09,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-29.07,"y":1.18,"curve":"stepped"},{"time":1,"x":-29.07,"y":1.18}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":16.23,"y":0,"curve":"stepped"},{"time":1,"x":16.23,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-5.42},{"time":0.5,"angle":-11.1},{"time":1,"angle":-5.42}],"translate":[{"time":0,"x":-6.94,"y":5.85,"curve":"stepped"},{"time":1,"x":-6.94,"y":5.85}]},"forearm1":{"rotate":[{"time":0,"angle":25.38},{"time":0.5,"angle":32.07},{"time":1,"angle":25.38}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":18.6},{"time":0.5,"angle":26.15},{"time":1,"angle":18.6}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-2.75,"y":0,"curve":"stepped"},{"time":1,"x":-2.75,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-0.92,"y":6.67,"curve":"stepped"},{"time":1,"x":-0.92,"y":6.67}]},"foot1":{"rotate":[{"time":0,"angle":270.13,"curve":"stepped"},{"time":1,"angle":270.13}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":-13.39},{"time":0.5,"angle":-17.28},{"time":1,"angle":-13.39}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-9.29},{"time":0.5,"angle":-1.97},{"time":1,"angle":-9.29}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-4.92,"curve":"stepped"},{"time":1,"x":0,"y":-4.92}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-12.22,"curve":"stepped"},{"time":1,"x":0,"y":-12.22}]}}},"Fall":{"bones":{"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":13.15,"y":7.94,"curve":"stepped"},{"time":1,"x":13.15,"y":7.94}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":35.34,"y":4.14,"curve":"stepped"},{"time":1,"x":35.34,"y":4.14}]},"foot1":{"rotate":[{"time":0,"angle":19.62,"curve":"stepped"},{"time":1,"angle":19.62}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":39.16,"curve":"stepped"},{"time":1,"angle":39.16}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":14.13,"curve":"stepped"},{"time":1,"angle":14.13}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":-17.81,"curve":"stepped"},{"time":1,"angle":-17.81}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":-25.71,"curve":"stepped"},{"time":1,"angle":-25.71}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":26.18,"curve":"stepped"},{"time":1,"angle":26.18}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":37.75,"curve":"stepped"},{"time":1,"angle":37.75}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":12.3,"curve":"stepped"},{"time":1,"angle":12.3}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Idle":{"bones":{"upperarm2":{"rotate":[{"time":0,"angle":0.46},{"time":0.5,"angle":358.79},{"time":1,"angle":0.46}],"translate":[{"time":0,"x":0,"y":0},{"time":0.5,"x":-3.12,"y":8.02},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":1.66},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":0,"y":-3.7,"curve":[0.25,0,0.75,1]},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":-4.18},{"time":0.5,"angle":-8.25},{"time":1,"angle":-4.18}],"translate":[{"time":0,"x":-1.06,"y":0,"curve":[0.382,0.57,0.735,1]},{"time":0.1666,"x":0,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":-3.74,"y":0,"curve":[0.243,0,0.648,0.6]},{"time":1,"x":-1.06,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-2.92,"curve":[0.25,0,0.75,1]},{"time":0.5,"x":-3.18,"y":-4.03,"curve":[0.25,0,0.75,1]},{"time":1,"x":0,"y":-2.92}]},"mantles":{"rotate":[{"time":0,"angle":0},{"time":0.4333,"angle":-4.83,"curve":[0.25,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":-0.09,"y":0,"curve":[0.3,0.21,0.755,1]},{"time":0.4333,"x":-1.41,"y":0,"curve":[0.25,0,0.75,1]},{"time":0.9333,"x":0,"y":0},{"time":1,"x":-0.09,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-7.15,"y":0,"curve":"stepped"},{"time":1,"x":-7.15,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":5.94,"y":0,"curve":"stepped"},{"time":1,"x":5.94,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":-15.4,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"x":1.84,"y":-5,"curve":[0.516,0,0.75,1]},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":9.63,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":13.63},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-8.65},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":[0.404,0,0.75,1]},{"time":0.5,"angle":12.36,"curve":[0.516,0,0.75,1]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Jump":{"bones":{"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":-6.83,"y":12.06,"curve":"stepped"},{"time":1,"x":-6.83,"y":12.06}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":2.41,"y":1.2,"curve":"stepped"},{"time":1,"x":2.41,"y":1.2}]},"foot1":{"rotate":[{"time":0,"angle":-32.23,"curve":"stepped"},{"time":1,"angle":-32.23}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-33.3,"curve":"stepped"},{"time":1,"angle":-33.3}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-10.4,"curve":"stepped"},{"time":1,"angle":-10.4}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"head":{"rotate":[{"time":0,"angle":4.89,"curve":"stepped"},{"time":1,"angle":4.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":22.69,"curve":"stepped"},{"time":1,"angle":22.69}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":56.41,"curve":"stepped"},{"time":1,"angle":56.41}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":23.71,"curve":"stepped"},{"time":1,"angle":23.71}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":20.06,"curve":"stepped"},{"time":1,"angle":20.06}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"mantles":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]}}},"Run":{"bones":{"upperarm1":{"rotate":[{"time":0,"angle":-40.45},{"time":0.044,"angle":-34.97},{"time":0.0881,"angle":1.79},{"time":0.1322,"angle":42.58},{"time":0.3117,"angle":-282.55},{"time":0.3525,"angle":48.21},{"time":0.3966,"angle":26.17},{"time":0.4407,"angle":-22.81},{"time":0.5333,"angle":-40.45}],"translate":[{"time":0,"x":0,"y":0},{"time":0.044,"x":1.33,"y":0.56},{"time":0.1762,"x":-2.74,"y":-5.58},{"time":0.3117,"x":-3.1,"y":-2.45},{"time":0.4407,"x":-0.75,"y":4.05},{"time":0.5333,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":27.41},{"time":0.044,"angle":21.5},{"time":0.0881,"angle":16.71},{"time":0.1322,"angle":30.61},{"time":0.3117,"angle":38.33},{"time":0.3525,"angle":37.81},{"time":0.3966,"angle":16.47},{"time":0.4407,"angle":17.71},{"time":0.5333,"angle":27.41}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-20.19},{"time":0.044,"angle":-24.82},{"time":0.1762,"angle":-14.29},{"time":0.3525,"angle":21.84},{"time":0.3966,"angle":9.46},{"time":0.4407,"angle":12.08},{"time":0.5333,"angle":-20.19}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":49.53,"y":-0.29},{"time":0.044,"x":39.66,"y":-0.29},{"time":0.0881,"x":-3.63,"y":-0.29},{"time":0.1322,"x":-10.76,"y":-0.29},{"time":0.1762,"x":-16.65,"y":22.09},{"time":0.2203,"x":-10,"y":27.07},{"time":0.2666,"x":-11.26,"y":16.63},{"time":0.3117,"x":12.41,"y":7.75},{"time":0.3525,"x":37.47,"y":7.29},{"time":0.3966,"x":52.33,"y":5.52},{"time":0.4407,"x":68.69,"y":19.42},{"time":0.4848,"x":68.69,"y":7.96},{"time":0.5333,"x":49.53,"y":-0.29}]},"foot1":{"rotate":[{"time":0,"angle":20.27},{"time":0.044,"angle":-0.6},{"time":0.1322,"angle":-31.14},{"time":0.1762,"angle":262.34},{"time":0.2203,"angle":-71.2},{"time":0.2666,"angle":-84.95},{"time":0.3117,"angle":-63.21},{"time":0.3525,"angle":-8.37},{"time":0.3966,"angle":-18.33},{"time":0.4407,"angle":34.08},{"time":0.5333,"angle":20.27}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":-58.44,"y":26.01},{"time":0.044,"x":-42,"y":21.08},{"time":0.0881,"x":-5.28,"y":9.57},{"time":0.1322,"x":11.16,"y":11.76},{"time":0.1762,"x":19.38,"y":26.56},{"time":0.2203,"x":23.89,"y":16.89},{"time":0.2666,"x":21.52,"y":-0.14},{"time":0.3117,"x":-19.32,"y":-0.14},{"time":0.3525,"x":-53.26,"y":0.13},{"time":0.3966,"x":-65.63,"y":6.46},{"time":0.4407,"x":-75.71,"y":39.48},{"time":0.5333,"x":-58.44,"y":26.01}]},"foot2":{"rotate":[{"time":0,"angle":262.95},{"time":0.0881,"angle":-74.33},{"time":0.1322,"angle":-4.26},{"time":0.1762,"angle":13.38},{"time":0.2203,"angle":28.95},{"time":0.2666,"angle":35.05},{"time":0.3117,"angle":7.53},{"time":0.3525,"angle":-31.42},{"time":0.4407,"angle":260.06},{"time":0.5333,"angle":262.95}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":-8.39},{"time":0.044,"x":1.64,"y":-12.87},{"time":0.0881,"x":1.64,"y":-11.23,"curve":[0.25,0,0.75,1]},{"time":0.1762,"x":1.64,"y":8.97},{"time":0.2203,"x":1.64,"y":-1.1},{"time":0.2666,"x":0,"y":-8.39},{"time":0.3117,"x":0,"y":-10.17},{"time":0.3525,"x":0,"y":-9.45,"curve":[0.25,0,0.75,1]},{"time":0.4407,"x":0,"y":5.78},{"time":0.4848,"x":1.64,"y":-1.1},{"time":0.5333,"x":0,"y":-8.39}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1762,"x":-1.45,"y":9.68},{"time":0.5333,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":-11.15},{"time":0.044,"angle":-16.76},{"time":0.1762,"angle":-8.61},{"time":0.3117,"angle":-20.17},{"time":0.4407,"angle":-8.61},{"time":0.5333,"angle":-11.15}],"translate":[{"time":0,"x":3.36,"y":-2.52},{"time":0.044,"x":4.98,"y":0.87},{"time":0.1762,"x":2.6,"y":4.02},{"time":0.3117,"x":5.73,"y":0.46},{"time":0.4407,"x":2.7,"y":5.1},{"time":0.5333,"x":3.36,"y":-2.52}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":6.02,"y":0},{"time":0.1322,"x":-3.58,"y":1.43},{"time":0.1762,"x":0.23,"y":2.72},{"time":0.2666,"x":6.13,"y":-0.59},{"time":0.3305,"x":8.81,"y":5.77},{"time":0.3966,"x":31,"y":0.35},{"time":0.4848,"x":22.13,"y":0.17},{"time":0.5333,"x":6.02,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":-8.31,"y":-2.37},{"time":0.1322,"x":-3.93,"y":-2.37},{"time":0.2666,"x":3.22,"y":-1.52},{"time":0.3525,"x":-18.12,"y":0.17},{"time":0.3966,"x":-28.38,"y":0.17},{"time":0.5333,"x":-8.31,"y":-2.37}]},"head":{"rotate":[{"time":0,"angle":8.08},{"time":0.044,"angle":1.34,"curve":[0.25,0,0.851,0.81]},{"time":0.1762,"angle":6.45},{"time":0.2666,"angle":10.37},{"time":0.3117,"angle":3.57,"curve":[0.25,0,0.842,0.77]},{"time":0.4407,"angle":7.81},{"time":0.5333,"angle":8.08}],"translate":[{"time":0,"x":2.87,"y":0.23},{"time":0.044,"x":-3.5,"y":-1.82},{"time":0.1762,"x":4.6,"y":0.76},{"time":0.2666,"x":1.55,"y":-6.16},{"time":0.3117,"x":-7.07,"y":-8.66},{"time":0.4407,"x":7.03,"y":0.05},{"time":0.5333,"x":2.87,"y":0.23}]},"mantles":{"rotate":[{"time":0,"angle":0},{"time":0.044,"angle":-2.17},{"time":0.2666,"angle":2.9},{"time":0.3117,"angle":-0.95},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.044,"x":-2.6,"y":-0.65},{"time":0.2666,"x":1.39,"y":-0.59},{"time":0.3117,"x":-2.6,"y":-0.65},{"time":0.5333,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":30.8},{"time":0.044,"angle":38.3},{"time":0.1322,"angle":5.43},{"time":0.2203,"angle":334.6,"curve":[0.25,0,0.75,1]},{"time":0.3117,"angle":328.38},{"time":0.4407,"angle":21.28},{"time":0.5333,"angle":30.8}],"translate":[{"time":0,"x":-5.33,"y":-1.55},{"time":0.1762,"x":-6.43,"y":2.12},{"time":0.5333,"x":-5.33,"y":-1.55}]},"forearm2":{"rotate":[{"time":0,"angle":35.89},{"time":0.0881,"angle":25.71},{"time":0.1762,"angle":29.3},{"time":0.2203,"angle":34.63,"curve":[0.25,0,0.75,1]},{"time":0.3117,"angle":38.94},{"time":0.4407,"angle":30.09},{"time":0.5333,"angle":35.89}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":8.06},{"time":0.044,"angle":12.45},{"time":0.1762,"angle":33.85},{"time":0.4407,"angle":22.92},{"time":0.5333,"angle":8.06}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5333,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5333,"x":0,"y":0}]}},"events":[{"time":0.2666,"name":"Footstep"},{"time":0.5333,"name":"Footstep"}]},"Walk":{"bones":{"L_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":68.76,"y":0},{"time":0.1333,"x":57.43,"y":0},{"time":0.2666,"x":41.05,"y":0},{"time":0.4,"x":21.33,"y":0},{"time":0.5333,"x":5.89,"y":0},{"time":0.6666,"x":4.91,"y":0},{"time":0.8,"x":5.89,"y":10.31},{"time":0.9333,"x":44.68,"y":10.8},{"time":1.0666,"x":68.76,"y":0}]},"thigh1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":24.92,"y":0},{"time":0.2666,"x":22.2,"y":0},{"time":0.4,"x":21.75,"y":-1.01},{"time":0.5333,"x":21.29,"y":0},{"time":0.6666,"x":16.1,"y":1},{"time":0.9333,"x":21.7,"y":-3.92},{"time":1.0666,"x":24.92,"y":0}]},"Hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":-7.39},{"time":0.1333,"x":0,"y":-6.32},{"time":0.2666,"x":0,"y":-1.44},{"time":0.3333,"x":0,"y":1.49},{"time":0.4,"x":0,"y":0.87},{"time":0.5333,"x":0,"y":-9.59},{"time":0.6666,"x":0,"y":-8.44},{"time":0.8,"x":0,"y":-1.44},{"time":0.8666,"x":0,"y":1.49},{"time":0.9333,"x":0,"y":0.87},{"time":1.0666,"x":0,"y":-7.39}]},"foot1":{"rotate":[{"time":0,"angle":17.4},{"time":0.1333,"angle":-0.28},{"time":0.4,"angle":-10.63},{"time":0.5333,"angle":-8.71},{"time":0.6666,"angle":-24.7},{"time":0.8,"angle":-43.24},{"time":0.9333,"angle":-35.2},{"time":1.0666,"angle":17.4}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"thigh2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":-25.09,"y":0},{"time":0.2,"x":-16.15,"y":-4.51},{"time":0.4,"x":-9.43,"y":-3.48},{"time":0.5333,"x":-4.25,"y":-1.41},{"time":0.6666,"x":-6.64,"y":0.04},{"time":0.8,"x":-11.55,"y":-2.12},{"time":0.9333,"x":-22.84,"y":-3.88},{"time":1.0666,"x":-25.09,"y":0}]},"R_Ground":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":-53.9,"y":0},{"time":0.1333,"x":-55,"y":2.56},{"time":0.2666,"x":-56,"y":14.27},{"time":0.4,"x":-9.55,"y":9.63},{"time":0.5333,"x":18.47,"y":-0.26},{"time":0.6666,"x":6.23,"y":-0.26},{"time":0.8,"x":-20.75,"y":-0.26},{"time":0.9333,"x":-36.46,"y":-3.45},{"time":1.0666,"x":-53.9,"y":0}]},"foot2":{"rotate":[{"time":0,"angle":-20},{"time":0.1333,"angle":-36.58},{"time":0.2666,"angle":-69.51},{"time":0.4,"angle":-13.92},{"time":0.5333,"angle":33.26},{"time":0.6666,"angle":0.41},{"time":0.9333,"angle":-1.16},{"time":1.0666,"angle":-20}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"upperarm1":{"rotate":[{"time":0,"angle":13.97},{"time":0.1333,"angle":2.64},{"time":0.5333,"angle":-293.8},{"time":0.6666,"angle":-302.37},{"time":0.8,"angle":41.55},{"time":0.9333,"angle":14.48},{"time":1.0666,"angle":13.97}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":4.42,"y":3.57},{"time":0.5333,"x":-0.22,"y":-4.77},{"time":0.6666,"x":0.24,"y":-2.39},{"time":1.0666,"x":0,"y":0}]},"forearm1":{"rotate":[{"time":0,"angle":-11.7},{"time":0.1333,"angle":-5.73},{"time":0.5333,"angle":24.76},{"time":0.6666,"angle":33.27,"curve":[0.25,0,0.75,1]},{"time":0.8,"angle":3.08},{"time":0.9333,"angle":5.39},{"time":1.0666,"angle":-11.7}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"hand1":{"rotate":[{"time":0,"angle":-19.62},{"time":0.1333,"angle":-25.06},{"time":0.2666,"angle":-27.67},{"time":0.4,"angle":-34.31},{"time":0.5333,"angle":-24.05},{"time":0.8,"angle":16.76},{"time":0.9333,"angle":7.44},{"time":1.0666,"angle":-19.62}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"body":{"rotate":[{"time":0,"angle":2.18},{"time":0.1333,"angle":-2.56,"curve":[0.464,0,0.75,1]},{"time":0.3333,"angle":4.73},{"time":0.5333,"angle":0.29},{"time":0.6666,"angle":-2.56,"curve":[0.464,0,0.75,1]},{"time":0.8666,"angle":3.59},{"time":1.0666,"angle":2.18}],"translate":[{"time":0,"x":10.86,"y":-1.14},{"time":0.1333,"x":10.48,"y":-2.93},{"time":0.3333,"x":1.78,"y":5.09},{"time":0.5333,"x":12.04,"y":-2.64},{"time":0.6666,"x":10.48,"y":-2.93},{"time":0.8666,"x":1.78,"y":6.43},{"time":1.0666,"x":10.86,"y":-1.14}]},"head":{"rotate":[{"time":0,"angle":-11.7},{"time":0.1333,"angle":-2.87},{"time":0.3333,"angle":-10.46},{"time":0.5333,"angle":-6.46},{"time":0.6666,"angle":-2.85},{"time":0.8666,"angle":-8.52},{"time":1.0666,"angle":-11.7}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-2.96,"y":-3.42},{"time":0.3333,"x":1.04,"y":0.33},{"time":0.5333,"x":0,"y":0},{"time":0.6666,"x":-2.96,"y":-3.42},{"time":0.8666,"x":1.04,"y":0.33},{"time":1.0666,"x":0,"y":0}]},"upperarm2":{"rotate":[{"time":0,"angle":349.66},{"time":0.1333,"angle":349.79},{"time":0.2666,"angle":343.53},{"time":0.4,"angle":334.09},{"time":0.5333,"angle":327.79},{"time":0.8,"angle":338.53},{"time":0.9333,"angle":354.68},{"time":1.0666,"angle":349.66}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-0.76,"y":-1.44},{"time":0.5333,"x":-0.19,"y":8.7},{"time":1.0666,"x":0,"y":0}]},"forearm2":{"rotate":[{"time":0,"angle":21.04},{"time":0.1333,"angle":24.41},{"time":0.2666,"angle":-0.81},{"time":0.4,"angle":23.68},{"time":0.5333,"angle":23.61},{"time":0.6666,"angle":25.56},{"time":0.8,"angle":12.55},{"time":0.9333,"angle":-0.27},{"time":1.0666,"angle":21.04}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"hand2":{"rotate":[{"time":0,"angle":-12.1},{"time":0.1333,"angle":-8.87},{"time":0.2666,"angle":13.76},{"time":0.4,"angle":-3.02},{"time":0.5333,"angle":11.48},{"time":0.6666,"angle":5.24},{"time":0.8,"angle":3.93},{"time":0.9333,"angle":0.31},{"time":1.0666,"angle":-12.1}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"root":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"L_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"R_Ankle":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":-1.35,"curve":"stepped"},{"time":1.0666,"x":0,"y":-1.35}]},"mantles":{"rotate":[{"time":0,"angle":-3.56},{"time":0.3333,"angle":-8.55},{"time":0.5333,"angle":-6.73},{"time":0.8666,"angle":-8.55},{"time":1.0666,"angle":-3.56}],"translate":[{"time":0,"x":0,"y":0},{"time":0.1333,"x":-1.9,"y":-1.47},{"time":0.3333,"x":-0.66,"y":-0.2},{"time":0.6666,"x":-1.9,"y":-1.47},{"time":0.8666,"x":-0.66,"y":-0.2},{"time":1.0666,"x":0,"y":0}]},"shin1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"shin2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"weapon":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1.0666,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1.0666,"x":0,"y":0}]},"LookConstraintGoal":{"rotate":[{"time":0.9333,"angle":0}]}},"events":[{"time":0.5333,"name":"Footstep"},{"time":1.0666,"name":"Footstep"}]}}} \ No newline at end of file diff --git a/spine-turbulenz/example/data/hero.png b/spine-turbulenz/example/data/hero.png deleted file mode 100644 index 1a4712def..000000000 Binary files a/spine-turbulenz/example/data/hero.png and /dev/null differ diff --git a/spine-turbulenz/example/data/spineboy.atlas b/spine-turbulenz/example/data/spineboy.atlas deleted file mode 100644 index 15b598a2e..000000000 --- a/spine-turbulenz/example/data/spineboy.atlas +++ /dev/null @@ -1,195 +0,0 @@ - -spineboy.png -size: 1024,256 -format: RGBA8888 -filter: Linear,Linear -repeat: none -eye_indifferent - rotate: false - xy: 890, 146 - size: 56, 53 - orig: 56, 53 - offset: 0, 0 - index: -1 -eye_surprised - rotate: false - xy: 444, 5 - size: 56, 53 - orig: 56, 53 - offset: 0, 0 - index: -1 -front_bracer - rotate: false - xy: 966, 103 - size: 35, 48 - orig: 35, 48 - offset: 0, 0 - index: -1 -front_fist_closed - rotate: false - xy: 847, 84 - size: 45, 49 - orig: 45, 49 - offset: 0, 0 - index: -1 -front_fist_open - rotate: false - xy: 968, 190 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -front_foot - rotate: false - xy: 890, 201 - size: 76, 41 - orig: 76, 41 - offset: 0, 0 - index: -1 -front_foot_bend1 - rotate: false - xy: 444, 98 - size: 77, 42 - orig: 77, 42 - offset: 0, 0 - index: -1 -front_foot_bend2 - rotate: false - xy: 279, 5 - size: 65, 56 - orig: 65, 56 - offset: 0, 0 - index: -1 -front_shin - rotate: false - xy: 792, 132 - size: 49, 110 - orig: 49, 110 - offset: 0, 0 - index: -1 -front_thigh - rotate: false - xy: 935, 77 - size: 29, 67 - orig: 29, 67 - offset: 0, 0 - index: -1 -front_upper_arm - rotate: false - xy: 410, 3 - size: 32, 58 - orig: 32, 58 - offset: 0, 0 - index: -1 -goggles - rotate: false - xy: 444, 142 - size: 157, 100 - orig: 157, 100 - offset: 0, 0 - index: -1 -gun - rotate: false - xy: 603, 120 - size: 126, 122 - orig: 126, 122 - offset: 0, 0 - index: -1 -head - rotate: false - xy: 279, 63 - size: 163, 179 - orig: 163, 179 - offset: 0, 0 - index: -1 -mouth_grind - rotate: false - xy: 948, 153 - size: 56, 35 - orig: 56, 35 - offset: 0, 0 - index: -1 -mouth_oooo - rotate: false - xy: 731, 97 - size: 56, 35 - orig: 56, 35 - offset: 0, 0 - index: -1 -mouth_smile - rotate: false - xy: 789, 95 - size: 56, 35 - orig: 56, 35 - offset: 0, 0 - index: -1 -muzzle - rotate: false - xy: 2, 2 - size: 275, 240 - orig: 277, 240 - offset: 0, 0 - index: -1 -neck - rotate: false - xy: 595, 93 - size: 22, 25 - orig: 22, 25 - offset: 0, 0 - index: -1 -rear_bracer - rotate: false - xy: 966, 58 - size: 34, 43 - orig: 34, 43 - offset: 0, 0 - index: -1 -rear_foot - rotate: false - xy: 444, 60 - size: 68, 36 - orig: 68, 36 - offset: 0, 0 - index: -1 -rear_foot_bend1 - rotate: false - xy: 523, 100 - size: 70, 40 - orig: 70, 40 - offset: 0, 0 - index: -1 -rear_foot_bend2 - rotate: false - xy: 346, 11 - size: 62, 50 - orig: 62, 50 - offset: 0, 0 - index: -1 -rear_shin - rotate: false - xy: 843, 135 - size: 45, 107 - orig: 45, 107 - offset: 0, 0 - index: -1 -rear_thigh - rotate: false - xy: 894, 82 - size: 39, 62 - orig: 39, 62 - offset: 0, 0 - index: -1 -rear_upper_arm - rotate: false - xy: 502, 6 - size: 28, 52 - orig: 28, 52 - offset: 0, 0 - index: -1 -torso - rotate: false - xy: 731, 134 - size: 59, 108 - orig: 59, 108 - offset: 0, 0 - index: -1 diff --git a/spine-turbulenz/example/data/spineboy.json b/spine-turbulenz/example/data/spineboy.json deleted file mode 100644 index 8a0230a5a..000000000 --- a/spine-turbulenz/example/data/spineboy.json +++ /dev/null @@ -1 +0,0 @@ -{"skeleton":{"hash":"lJsAlqDM/k/QFOECFqgH7sfcOrk","spine":"Dev","width":470.64,"height":731.52},"bones":[{"name":"hip","y":247.47},{"name":"front_thigh","parent":"hip","length":74.8,"x":-17.45,"y":-11.64,"rotation":-95.51},{"name":"rear_thigh","parent":"hip","length":85.71,"x":8.91,"y":-5.62,"rotation":-72.54},{"name":"torso","parent":"hip","length":127.55,"x":-1.61,"y":4.9,"rotation":103.82},{"name":"front_shin","parent":"front_thigh","length":128.76,"x":78.69,"y":1.6,"rotation":-2.21,"inheritScale":false},{"name":"front_upper_arm","parent":"torso","length":69.45,"x":103.75,"y":19.32,"rotation":168.37},{"name":"neck","parent":"torso","length":25.45,"x":127.49,"y":-0.3,"rotation":-31.53},{"name":"rear_shin","parent":"rear_thigh","length":121.87,"x":86.1,"y":-1.32,"rotation":-19.83},{"name":"rear_upper_arm","parent":"torso","length":51.93,"x":92.35,"y":-19.22,"rotation":-169.55},{"name":"front_bracer","parent":"front_upper_arm","length":40.57,"x":68.8,"y":-0.68,"rotation":18.29},{"name":"front_foot","parent":"front_shin","length":91.34,"x":128.75,"y":-0.33,"rotation":77.9},{"name":"head","parent":"neck","length":263.57,"x":27.66,"y":-0.25,"rotation":23.18},{"name":"rear_bracer","parent":"rear_upper_arm","length":34.55,"x":51.35,"rotation":23.15},{"name":"rear_foot","parent":"rear_shin","length":82.57,"x":121.45,"y":-0.75,"rotation":69.3},{"name":"front_fist","parent":"front_bracer","length":65.38,"x":40.56,"y":0.19,"rotation":12.43},{"name":"gun","parent":"rear_bracer","length":43.1,"x":34.42,"y":-0.45,"rotation":5.34},{"name":"gunTip","parent":"gun","x":201.04,"y":52.13,"rotation":6.83}],"slots":[{"name":"rear_upper_arm","bone":"rear_upper_arm","attachment":"rear_upper_arm"},{"name":"rear_bracer","bone":"rear_bracer","attachment":"rear_bracer"},{"name":"gun","bone":"gun","attachment":"gun"},{"name":"rear_foot","bone":"rear_foot","attachment":"rear_foot"},{"name":"rear_thigh","bone":"rear_thigh","attachment":"rear_thigh"},{"name":"rear_shin","bone":"rear_shin","attachment":"rear_shin"},{"name":"neck","bone":"neck","attachment":"neck"},{"name":"torso","bone":"torso","attachment":"torso"},{"name":"front_upper_arm","bone":"front_upper_arm","attachment":"front_upper_arm"},{"name":"head","bone":"head","attachment":"head"},{"name":"eye","bone":"head","attachment":"eye_indifferent"},{"name":"front_thigh","bone":"front_thigh","attachment":"front_thigh"},{"name":"front_foot","bone":"front_foot","attachment":"front_foot"},{"name":"front_shin","bone":"front_shin","attachment":"front_shin"},{"name":"mouth","bone":"head","attachment":"mouth_smile"},{"name":"goggles","bone":"head","attachment":"goggles"},{"name":"front_bracer","bone":"front_bracer","attachment":"front_bracer"},{"name":"front_fist","bone":"front_fist","attachment":"front_fist_closed"},{"name":"muzzle","bone":"gunTip","additive":true},{"name":"head-bb","bone":"head"}],"skins":{"default":{"eye":{"eye_indifferent":{"x":85.72,"y":-28.18,"rotation":-70.63,"width":93,"height":89},"eye_surprised":{"x":85.72,"y":-28.18,"rotation":-70.63,"width":93,"height":89}},"front_bracer":{"front_bracer":{"x":12.03,"y":-1.67,"rotation":79.59,"width":58,"height":80}},"front_fist":{"front_fist_closed":{"x":35.49,"y":6,"rotation":67.16,"width":75,"height":82},"front_fist_open":{"x":39.56,"y":7.76,"rotation":67.16,"width":86,"height":87}},"front_foot":{"front_foot":{"x":29.51,"y":7.83,"rotation":18.68,"width":126,"height":69},"front_foot_bend1":{"x":29.51,"y":7.83,"rotation":18.68,"width":128,"height":70},"front_foot_bend2":{"x":16.07,"y":13.83,"rotation":18.68,"width":108,"height":93}},"front_shin":{"front_shin":{"x":55.11,"y":-3.54,"rotation":96.59,"width":82,"height":184}},"front_thigh":{"front_thigh":{"x":42.47,"y":4.44,"rotation":84.86,"width":48,"height":112}},"front_upper_arm":{"front_upper_arm":{"x":28.3,"y":7.37,"rotation":97.89,"width":54,"height":97}},"goggles":{"goggles":{"x":97.07,"y":6.54,"rotation":-70.63,"width":261,"height":166}},"gun":{"gun":{"x":77.3,"y":16.4,"rotation":60.82,"width":210,"height":203}},"head":{"head":{"x":128.95,"y":0.29,"rotation":-70.63,"width":271,"height":298}},"head-bb":{"head":{"type":"boundingbox","vertices":[-19.143097,-70.30209,40.80313,-118.074234,257.77155,-115.61827,285.16193,57.18005,120.77191,164.95125,-5.067627,76.94907]}},"mouth":{"mouth_grind":{"x":23.68,"y":-32.23,"rotation":-70.63,"width":93,"height":59},"mouth_oooo":{"x":23.68,"y":-32.23,"rotation":-70.63,"width":93,"height":59},"mouth_smile":{"x":23.68,"y":-32.23,"rotation":-70.63,"width":93,"height":59}},"muzzle":{"muzzle":{"x":18.25,"y":5.44,"rotation":0.15,"width":462,"height":400}},"neck":{"neck":{"x":9.76,"y":-3.01,"rotation":-55.22,"width":36,"height":41}},"rear_bracer":{"rear_bracer":{"x":11.15,"y":-2.2,"rotation":66.17,"width":56,"height":72}},"rear_foot":{"rear_foot":{"x":31.51,"y":3.57,"rotation":23.07,"width":113,"height":60},"rear_foot_bend1":{"x":34.39,"y":4.8,"rotation":23.07,"width":117,"height":66},"rear_foot_bend2":{"x":30.38,"y":12.62,"rotation":23.07,"width":103,"height":83}},"rear_shin":{"rear_shin":{"x":58.29,"y":-2.75,"rotation":92.37,"width":75,"height":178}},"rear_thigh":{"rear_thigh":{"x":33.1,"y":-4.11,"rotation":72.54,"width":65,"height":104}},"rear_upper_arm":{"rear_upper_arm":{"x":21.12,"y":4.08,"rotation":89.32,"width":47,"height":87}},"torso":{"torso":{"x":63.61,"y":7.12,"rotation":-94.53,"width":98,"height":180}}}},"events":{"footstep":{},"headAttach":{"int":3,"float":4},"headBehind":{"int":5,"float":6,"string":"setup"},"headPop":{"int":1,"float":2}},"animations":{"death":{"slots":{"eye":{"attachment":[{"time":0,"name":"eye_surprised"},{"time":0.4666,"name":"eye_indifferent"},{"time":2.2333,"name":"eye_surprised"},{"time":4.5333,"name":"eye_indifferent"}]},"front_fist":{"attachment":[{"time":0,"name":"front_fist_open"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_oooo"},{"time":2.2333,"name":"mouth_grind"},{"time":4.5333,"name":"mouth_oooo"}]}},"bones":{"head":{"rotate":[{"time":0,"angle":-2.82},{"time":0.1333,"angle":-28.74},{"time":0.2333,"angle":11.42},{"time":0.3333,"angle":-50.24},{"time":0.4,"angle":-72.66,"curve":"stepped"},{"time":0.4333,"angle":-72.66},{"time":0.5,"angle":-20.24},{"time":0.5666,"angle":-85.28,"curve":"stepped"},{"time":0.9333,"angle":-85.28,"curve":"stepped"},{"time":2.2333,"angle":-85.28},{"time":2.5,"angle":-51.96,"curve":"stepped"},{"time":4.5333,"angle":-51.96},{"time":4.6666,"angle":-85.28}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":-2.82},{"time":0.1333,"angle":12.35},{"time":0.2333,"angle":29.89},{"time":0.3,"angle":70.36},{"time":0.4,"angle":-10.22,"curve":"stepped"},{"time":0.4333,"angle":-10.22},{"time":0.5,"angle":2.92},{"time":0.5666,"angle":47.94,"curve":"stepped"},{"time":2.2333,"angle":47.94},{"time":2.5,"angle":18.5,"curve":"stepped"},{"time":4.5333,"angle":18.5},{"time":4.6666,"angle":47.94}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"torso":{"rotate":[{"time":0,"angle":-8.61},{"time":0.1333,"angle":28.19},{"time":0.2666,"angle":-280.19},{"time":0.4,"angle":-237.22,"curve":"stepped"},{"time":0.4333,"angle":-237.22},{"time":0.5,"angle":76.03,"curve":"stepped"},{"time":0.8,"angle":76.03,"curve":"stepped"},{"time":0.9333,"angle":76.03,"curve":"stepped"},{"time":2.2333,"angle":76.03}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.9333,"x":0,"y":0,"curve":"stepped"},{"time":2.2333,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-38.85},{"time":0.1333,"angle":-299.58},{"time":0.2666,"angle":-244.74},{"time":0.4,"angle":-292.35},{"time":0.4333,"angle":-315.84},{"time":0.5,"angle":-347.94},{"time":0.7,"angle":-347.33,"curve":"stepped"},{"time":2.2333,"angle":-347.33},{"time":2.7,"angle":-290.68},{"time":2.7666,"angle":-285.1},{"time":4.6666,"angle":-290.68},{"time":4.8,"angle":8.61},{"time":4.8666,"angle":10.94}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":-44.69},{"time":0.1333,"angle":112.26},{"time":0.2666,"angle":129.07},{"time":0.4,"angle":134.94,"curve":"stepped"},{"time":0.4333,"angle":134.94},{"time":0.5666,"angle":172.6,"curve":"stepped"},{"time":0.9333,"angle":172.6,"curve":"stepped"},{"time":2.2333,"angle":172.6}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_bracer":{"rotate":[{"time":0,"angle":21.88},{"time":0.1333,"angle":11.48},{"time":0.2666,"angle":-18.81},{"time":0.4,"angle":-18.92},{"time":0.4333,"angle":-18.28},{"time":0.5,"angle":60.61},{"time":0.7,"angle":-18.87,"curve":"stepped"},{"time":2.2333,"angle":-18.87},{"time":2.7,"angle":-1.95,"curve":"stepped"},{"time":4.6666,"angle":-1.95},{"time":4.8,"angle":34.55},{"time":4.9333,"angle":-18.74}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_fist":{"rotate":[{"time":0,"angle":-2.33},{"time":0.2666,"angle":26.34},{"time":0.7,"angle":-6.07,"curve":"stepped"},{"time":2.2333,"angle":-6.07},{"time":2.7,"angle":5.72,"curve":"stepped"},{"time":4.6666,"angle":5.72},{"time":4.8666,"angle":-6.52}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_bracer":{"rotate":[{"time":0,"angle":10.36},{"time":0.1333,"angle":-23.12},{"time":0.2666,"angle":-23.11},{"time":0.4,"angle":-23.16,"curve":"stepped"},{"time":0.4333,"angle":-23.16},{"time":0.5666,"angle":-23.2,"curve":"stepped"},{"time":0.9333,"angle":-23.2,"curve":"stepped"},{"time":2.2333,"angle":-23.2}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"gun":{"rotate":[{"time":0,"angle":-2.78},{"time":0.1333,"angle":-24.58}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.9333,"angle":0,"curve":"stepped"},{"time":2.2333,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.2,"x":50.34,"y":151.73},{"time":0.4,"x":5.16,"y":-119.64,"curve":"stepped"},{"time":0.4333,"x":5.16,"y":-119.64},{"time":0.5,"x":50.34,"y":-205.18,"curve":"stepped"},{"time":0.8,"x":50.34,"y":-205.18,"curve":"stepped"},{"time":0.9333,"x":50.34,"y":-205.18,"curve":"stepped"},{"time":2.2333,"x":50.34,"y":-205.18}],"scale":[{"time":0,"x":1,"y":1}]},"front_thigh":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":8.47},{"time":0.2666,"angle":115.95},{"time":0.4,"angle":180.66,"curve":"stepped"},{"time":0.4333,"angle":180.66},{"time":0.5,"angle":155.22},{"time":0.6,"angle":97.73}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_shin":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":-27.37},{"time":0.2666,"angle":-35.1},{"time":0.4,"angle":-37.72,"curve":"stepped"},{"time":0.4333,"angle":-37.72},{"time":0.5,"angle":-40.06},{"time":0.6,"angle":2.76}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_thigh":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":70.45},{"time":0.2666,"angle":155.34},{"time":0.4,"angle":214.31,"curve":"stepped"},{"time":0.4333,"angle":214.31},{"time":0.5,"angle":169.67},{"time":0.8,"angle":83.27}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_shin":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":18.93},{"time":0.2666,"angle":-21.04},{"time":0.4,"angle":-29.93,"curve":"stepped"},{"time":0.4333,"angle":-29.93},{"time":0.5,"angle":-16.79},{"time":0.8,"angle":7.77}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":-11.62},{"time":0.4,"angle":-45.59,"curve":"stepped"},{"time":0.4333,"angle":-45.59}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":0},{"time":0.4,"angle":-48.75,"curve":"stepped"},{"time":0.4333,"angle":-48.75}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"gunTip":{"rotate":[{"time":0,"angle":0}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]}}},"hit":{"slots":{"front_fist":{"attachment":[{"time":0.1666,"name":"front_fist_open"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_grind"},{"time":0.3333,"name":"mouth_smile"}]}},"bones":{"torso":{"rotate":[{"time":0,"angle":56.42},{"time":0.3333,"angle":8.89}]},"neck":{"rotate":[{"time":0,"angle":35.38},{"time":0.2333,"angle":24.94}]},"head":{"rotate":[{"time":0,"angle":10.21},{"time":0.3333,"angle":-41.3}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-310.92,"curve":[0.38,0.53,0.744,1]},{"time":0.3333,"angle":-112.59}],"translate":[{"time":0,"x":7.23,"y":-13.13}]},"front_bracer":{"rotate":[{"time":0,"angle":36.99},{"time":0.3333,"angle":-28.64}]},"front_fist":{"rotate":[{"time":0,"angle":13.59},{"time":0.3333,"angle":7.55}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":271.02,"curve":[0.342,0.36,0.68,0.71]},{"time":0.3333,"angle":-15.84}],"translate":[{"time":0.3333,"x":-0.09,"y":-0.46}]},"rear_bracer":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":40.03}]},"gun":{"rotate":[{"time":0,"angle":14.98},{"time":0.3333,"angle":39.75}]},"hip":{"translate":[{"time":0,"x":-75.54,"y":-78.03},{"time":0.2333,"x":-36.48,"y":12.42},{"time":0.3333,"x":-36.48,"y":-2.99}]},"front_thigh":{"rotate":[{"time":0,"angle":90.94,"curve":[0.227,0.26,0.432,1]},{"time":0.3333,"angle":32.02}],"translate":[{"time":0,"x":7.21,"y":-4}]},"rear_thigh":{"rotate":[{"time":0,"angle":40.51,"curve":[0.295,0.3,0.59,0.99]},{"time":0.3333,"angle":90.76}],"translate":[{"time":0,"x":-1.96,"y":-0.32}]},"front_shin":{"rotate":[{"time":0,"angle":-96.62},{"time":0.3333,"angle":-15.13}]},"rear_shin":{"rotate":[{"time":0,"angle":7.99},{"time":0.3333,"angle":-67.54}],"scale":[{"time":0,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":5.4},{"time":0.3333,"angle":-16.26}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":2.67},{"time":0.3333,"angle":-10.31}]}}},"idle":{"slots":{"front_fist":{"attachment":[{"time":0,"name":"front_fist_open"},{"time":1.6666,"name":"front_fist_open"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_smile"},{"time":1.6666,"name":"mouth_smile"}]}},"bones":{"torso":{"rotate":[{"time":0,"angle":-5.61,"curve":[0.25,0,0.75,1]},{"time":0.8333,"angle":-9.65,"curve":[0.25,0,0.75,1]},{"time":1.6666,"angle":-5.61}],"translate":[{"time":0,"x":-6.49,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-59.85,"curve":[0.492,0,0.75,1]},{"time":0.6666,"angle":-54.31,"curve":[0.324,0.11,0.75,1]},{"time":1.6666,"angle":-59.85}],"translate":[{"time":0,"x":-7.12,"y":-8.23},{"time":0.6666,"x":-6.32,"y":-8.3},{"time":1.6666,"x":-7.12,"y":-8.23}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":62.41,"curve":[0.504,0.02,0.75,1]},{"time":0.7333,"angle":43.83,"curve":[0.25,0,0.75,1]},{"time":1.6666,"angle":62.41}],"translate":[{"time":0,"x":-1.83,"y":-16.78},{"time":0.6666,"x":0.34,"y":-15.23},{"time":1.6666,"x":-1.83,"y":-16.78}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":0},{"time":0.6666,"angle":2.39},{"time":1.6666,"angle":0}],"translate":[{"time":0,"x":-1.88,"y":-4.76,"curve":"stepped"},{"time":1.6666,"x":-1.88,"y":-4.76}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"front_thigh":{"rotate":[{"time":0,"angle":0.64,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"angle":-4.34,"curve":[0.594,0,0.653,1]},{"time":1.6666,"angle":0.64}],"translate":[{"time":0,"x":-13.39,"y":6.69,"curve":"stepped"},{"time":1.6666,"x":-13.39,"y":6.69}],"scale":[{"time":0,"x":0.896,"y":1,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"x":0.825,"y":1,"curve":[0.594,0,0.653,1]},{"time":1.6666,"x":0.896,"y":1}]},"front_shin":{"rotate":[{"time":0,"angle":-19.28,"curve":"stepped"},{"time":1.6666,"angle":-19.28}],"scale":[{"time":0,"x":1,"y":1,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"x":0.994,"y":1,"curve":[0.594,0,0.653,1]},{"time":1.6666,"x":1,"y":1}]},"rear_thigh":{"rotate":[{"time":0,"angle":30.5,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"angle":40.15,"curve":[0.594,0,0.653,1]},{"time":1.6666,"angle":30.5}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"rear_shin":{"rotate":[{"time":0,"angle":-23.83,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"angle":-43.77,"curve":[0.594,0,0.653,1]},{"time":1.6666,"angle":-23.83}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":5.13,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"angle":10.04,"curve":[0.594,0,0.653,1]},{"time":1.6666,"angle":5.13}],"scale":[{"time":0,"x":0.755,"y":1.309,"curve":"stepped"},{"time":1.6666,"x":0.755,"y":1.309}]},"hip":{"translate":[{"time":0,"x":-6.63,"y":-23.01,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"x":6.27,"y":-35,"curve":[0.594,0,0.653,1]},{"time":1.6666,"x":-6.63,"y":-23.01}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":-7.34,"curve":[0.235,0,0.558,0.99]},{"time":0.6666,"angle":3.85,"curve":[0.594,0,0.653,1]},{"time":1.6666,"angle":-7.34}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"rear_bracer":{"rotate":[{"time":0,"angle":-17.16,"curve":[0.25,0,0.75,1]},{"time":0.6666,"angle":12.52,"curve":[0.25,0,0.75,1]},{"time":1.6666,"angle":-17.16}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"head":{"rotate":[{"time":0,"angle":-5.51,"curve":[0.25,0,0.75,1]},{"time":0.6666,"angle":-3.12,"curve":[0.25,0,0.75,1]},{"time":1.6666,"angle":-5.51}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"front_bracer":{"rotate":[{"time":0,"angle":45.46,"curve":[0.492,0,0.75,1]},{"time":0.6666,"angle":41.33,"curve":[0.32,0.1,0.736,0.91]},{"time":1.6666,"angle":45.46}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"gun":{"rotate":[{"time":0,"angle":0,"curve":[0.25,0,0.75,1]},{"time":0.6666,"angle":-15.59,"curve":[0.732,0,0.769,0.99]},{"time":1.6666,"angle":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1.6666,"x":1,"y":1}]},"front_fist":{"rotate":[{"time":0,"angle":-6.84,"curve":[0.492,0,0.75,1]},{"time":0.6666,"angle":-14.63,"curve":[0.324,0.11,0.75,1]},{"time":1.6666,"angle":-6.84}],"scale":[{"time":0,"x":1,"y":1,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":0.689,"y":1.1,"curve":[0.25,0,0.75,1]},{"time":1.6666,"x":1,"y":1}]}}},"jump":{"slots":{"front_fist":{"attachment":[{"time":0,"name":"front_fist_open"},{"time":0.2,"name":"front_fist_closed"},{"time":0.6666,"name":"front_fist_open"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_grind"}]},"torso":{"attachment":[{"time":0,"name":"torso"}]}},"bones":{"front_thigh":{"rotate":[{"time":0,"angle":91.53,"curve":[0.278,0.46,0.763,1]},{"time":0.2,"angle":-35.83,"curve":[0.761,0,0.75,1]},{"time":0.4333,"angle":127.74},{"time":0.7333,"angle":48.18,"curve":[0.227,0.26,0.432,1]},{"time":0.8333,"angle":25.35},{"time":0.9333,"angle":45.37},{"time":1.0333,"angle":38.12},{"time":1.1333,"angle":25.35},{"time":1.3333,"angle":91.53}],"translate":[{"time":0,"x":-2.56,"y":5.77},{"time":0.4333,"x":8.3,"y":7.98},{"time":0.7333,"x":7.21,"y":-4},{"time":1.3333,"x":-2.56,"y":5.77}],"scale":[{"time":0,"x":1,"y":1}]},"torso":{"rotate":[{"time":0,"angle":-42.63},{"time":0.2,"angle":-5.74},{"time":0.4333,"angle":-50.76},{"time":0.7333,"angle":1.89},{"time":0.8333,"angle":11.58},{"time":0.9666,"angle":-1.89},{"time":1.1333,"angle":11.58},{"time":1.3333,"angle":-42.63}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_thigh":{"rotate":[{"time":0,"angle":-26.32},{"time":0.2,"angle":121.44},{"time":0.4333,"angle":70.54},{"time":0.7333,"angle":79.89,"curve":[0.295,0.3,0.59,0.99]},{"time":0.8333,"angle":99.12},{"time":0.9333,"angle":74.05},{"time":1.0333,"angle":98.04},{"time":1.1333,"angle":99.12},{"time":1.3333,"angle":-26.32}],"translate":[{"time":0,"x":-0.56,"y":-0.32},{"time":0.4333,"x":-8.5,"y":10.58},{"time":0.7333,"x":-1.96,"y":-0.32},{"time":1.3333,"x":-0.56,"y":-0.32}],"scale":[{"time":0,"x":1,"y":1}]},"rear_shin":{"rotate":[{"time":0,"angle":-78.69},{"time":0.4333,"angle":-55.56},{"time":0.7333,"angle":-62.84},{"time":0.8333,"angle":-80.74},{"time":0.9333,"angle":-41.12},{"time":1.0333,"angle":-77.4},{"time":1.1333,"angle":-80.74},{"time":1.3333,"angle":-78.69}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.7333,"x":1,"y":1}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-22.61},{"time":0.2,"angle":-246.68},{"time":0.6,"angle":11.28,"curve":[0.246,0,0.633,0.53]},{"time":0.7333,"angle":-57.45,"curve":[0.38,0.53,0.744,1]},{"time":0.8666,"angle":-112.59},{"time":0.9333,"angle":-102.17},{"time":1.0333,"angle":-108.61},{"time":1.1333,"angle":-112.59},{"time":1.3333,"angle":-22.61}],"translate":[{"time":0,"x":6.08,"y":7.15},{"time":0.2,"x":7.23,"y":-13.13,"curve":"stepped"},{"time":0.7333,"x":7.23,"y":-13.13},{"time":1.3333,"x":6.08,"y":7.15}],"scale":[{"time":0,"x":1,"y":1}]},"front_bracer":{"rotate":[{"time":0,"angle":66.46},{"time":0.2,"angle":42.39},{"time":0.4333,"angle":26.06},{"time":0.7333,"angle":13.28},{"time":0.8666,"angle":-28.64},{"time":0.9333,"angle":-22.31},{"time":1.0333,"angle":-35.39},{"time":1.1333,"angle":-28.64},{"time":1.3333,"angle":66.46}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_fist":{"rotate":[{"time":0,"angle":-28.43},{"time":0.4333,"angle":-45.6},{"time":0.7333,"angle":-53.66},{"time":0.8666,"angle":7.55},{"time":0.9333,"angle":31.15},{"time":1.0333,"angle":-32.58},{"time":1.1333,"angle":7.55},{"time":1.3333,"angle":-28.43}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":39.68},{"time":0.2,"angle":276.57},{"time":0.3,"angle":17.73},{"time":0.4333,"angle":83.38},{"time":0.6,"angle":-4.71,"curve":[0.246,0,0.633,0.53]},{"time":0.7333,"angle":-69.63,"curve":[0.342,0.36,0.68,0.71]},{"time":0.7666,"angle":321.47,"curve":[0.333,0.33,0.667,0.66]},{"time":0.8,"angle":33.7,"curve":[0.358,0.64,0.693,1]},{"time":0.8666,"angle":34.56},{"time":1.0333,"angle":71.96},{"time":1.1333,"angle":34.56},{"time":1.3333,"angle":39.68}],"translate":[{"time":0,"x":-3.1,"y":-4.86},{"time":0.2,"x":23.33,"y":49.07},{"time":0.4333,"x":20.78,"y":40.21},{"time":1.3333,"x":-3.1,"y":-4.86}],"scale":[{"time":0,"x":1,"y":1}]},"rear_bracer":{"rotate":[{"time":0,"angle":29.66},{"time":0.2,"angle":45.06},{"time":0.4333,"angle":-4.34},{"time":0.7666,"angle":61.68},{"time":0.8,"angle":82.59},{"time":0.8666,"angle":80.06},{"time":1.0333,"angle":57.56},{"time":1.1333,"angle":80.06},{"time":1.3333,"angle":29.66}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":24.9},{"time":0.2,"angle":16.31},{"time":0.4333,"angle":7.44},{"time":0.7333,"angle":-20.35},{"time":0.8333,"angle":-0.69,"curve":"stepped"},{"time":1.1333,"angle":-0.69},{"time":1.3333,"angle":24.9}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"head":{"rotate":[{"time":0,"angle":24.92},{"time":0.2,"angle":10.36},{"time":0.4333,"angle":28.65},{"time":0.7333,"angle":-2.65},{"time":0.8333,"angle":-28.94,"curve":"stepped"},{"time":1.1333,"angle":-28.94},{"time":1.3333,"angle":24.92}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"hip":{"rotate":[{"time":0,"angle":0}],"translate":[{"time":0,"x":-34.51,"y":-78.62,"curve":[0.232,1,0.75,1]},{"time":0.2,"x":-34.51,"y":182.5,"curve":[0.232,0.48,0.598,0.79]},{"time":0.7666,"x":-34.51,"y":596.22,"curve":[0.329,0.17,0.66,0.21]},{"time":1.1333,"x":-34.51,"y":2.49},{"time":1.3333,"x":-34.51,"y":-78.62}],"scale":[{"time":0,"x":1,"y":1}]},"front_shin":{"rotate":[{"time":0,"angle":-90.62,"curve":[0.416,0.54,0.743,1]},{"time":0.2,"angle":-10.52,"curve":[0.644,0,0.75,1]},{"time":0.4333,"angle":-127.72},{"time":0.7333,"angle":-19.91},{"time":0.8333,"angle":-5.16},{"time":0.9333,"angle":-35.06},{"time":1.0333,"angle":-43.97},{"time":1.1333,"angle":-5.16},{"time":1.3333,"angle":-90.62}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":-0.79},{"time":0.0333,"angle":16.27},{"time":0.0666,"angle":23.52},{"time":0.1,"angle":21.02},{"time":0.1333,"angle":10.92},{"time":0.2,"angle":-38.45},{"time":0.4333,"angle":6.62},{"time":0.7333,"angle":-11.51},{"time":1.0333,"angle":-22.91},{"time":1.3333,"angle":-0.79}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":-12.77},{"time":0.2,"angle":17.05},{"time":0.4333,"angle":19.45},{"time":0.7333,"angle":2.67},{"time":1.0333,"angle":-28.49},{"time":1.3333,"angle":-12.77}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"gun":{"rotate":[{"time":0,"angle":6.18},{"time":0.2,"angle":30.81},{"time":0.4333,"angle":13.25},{"time":0.7333,"angle":14.98},{"time":0.7666,"angle":25.64},{"time":0.8,"angle":20.62},{"time":0.8666,"angle":64.52},{"time":1.0333,"angle":8.59},{"time":1.1333,"angle":64.52},{"time":1.3333,"angle":6.18}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]}}},"run":{"slots":{"front_fist":{"attachment":[{"time":0,"name":"front_fist_closed"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_grind"}]},"torso":{"attachment":[{"time":0,"name":"torso"}]}},"bones":{"front_thigh":{"rotate":[{"time":0,"angle":42.05,"curve":[0.195,0.86,0.75,1]},{"time":0.0666,"angle":46.07},{"time":0.1333,"angle":-20.28},{"time":0.2,"angle":-27.23},{"time":0.2666,"angle":-47.16},{"time":0.3333,"angle":-39.79},{"time":0.4,"angle":-25.86},{"time":0.4666,"angle":14.35},{"time":0.5333,"angle":55.62},{"time":0.6,"angle":69.65},{"time":0.6666,"angle":86.4},{"time":0.7333,"angle":65.87},{"time":0.8,"angle":42.05}],"translate":[{"time":0,"x":0,"y":0},{"time":0.0333,"x":-5.79,"y":11.15},{"time":0.0666,"x":-5.13,"y":11.55},{"time":0.1333,"x":-7.7,"y":8.98},{"time":0.5333,"x":-1.26,"y":3.83},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"torso":{"rotate":[{"time":0,"angle":-39.7},{"time":0.2,"angle":-57.29},{"time":0.4,"angle":-39.7},{"time":0.6,"angle":-57.29},{"time":0.8,"angle":-39.7}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_thigh":{"rotate":[{"time":0,"angle":-56.59},{"time":0.0666,"angle":-21.57},{"time":0.1333,"angle":27.95},{"time":0.2,"angle":42.42},{"time":0.2666,"angle":62.37},{"time":0.3333,"angle":45.42},{"time":0.4,"angle":15.67},{"time":0.4666,"angle":28.22},{"time":0.5333,"angle":-38.62},{"time":0.6,"angle":-53.26},{"time":0.6666,"angle":-79.31},{"time":0.7333,"angle":-86.47},{"time":0.8,"angle":-56.59}],"translate":[{"time":0,"x":0,"y":0},{"time":0.4,"x":-6.76,"y":-3.86},{"time":0.4333,"x":-15.85,"y":7.28},{"time":0.4666,"x":-13.04,"y":4.04},{"time":0.5,"x":-10.24,"y":7.11},{"time":0.5333,"x":-9.01,"y":-5.15},{"time":0.6666,"x":-23.18,"y":-2.57},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_shin":{"rotate":[{"time":0,"angle":-74},{"time":0.0666,"angle":-83.38},{"time":0.1333,"angle":-106.69},{"time":0.2,"angle":-66.01},{"time":0.2666,"angle":-55.22},{"time":0.3333,"angle":-24.8},{"time":0.4,"angle":18.44,"curve":[0.25,0,0.75,1]},{"time":0.4666,"angle":-56.65},{"time":0.5333,"angle":-11.94,"curve":[0.25,0,0.75,1]},{"time":0.6666,"angle":-41.26},{"time":0.7333,"angle":-43.6},{"time":0.8,"angle":-74}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-89.36},{"time":0.0666,"angle":-95.67},{"time":0.1333,"angle":-22},{"time":0.2,"angle":-316.04},{"time":0.2666,"angle":-274.94},{"time":0.3333,"angle":-273.74},{"time":0.4,"angle":-272.09},{"time":0.4666,"angle":-264.89},{"time":0.5333,"angle":-320.09},{"time":0.6,"angle":-50.83},{"time":0.6666,"angle":-81.72},{"time":0.7333,"angle":-83.92},{"time":0.8,"angle":-89.36}],"translate":[{"time":0,"x":6.24,"y":10.05},{"time":0.2666,"x":4.95,"y":-13.13},{"time":0.6,"x":-2.43,"y":1.94},{"time":0.8,"x":6.24,"y":10.05}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_bracer":{"rotate":[{"time":0,"angle":33.43},{"time":0.0666,"angle":20.53},{"time":0.1333,"angle":15.26},{"time":0.2,"angle":19.28},{"time":0.2666,"angle":22.62},{"time":0.3333,"angle":37.29},{"time":0.4,"angle":41.53},{"time":0.4666,"angle":31.73},{"time":0.5333,"angle":67.45},{"time":0.6666,"angle":39.77},{"time":0.7333,"angle":30.95},{"time":0.8,"angle":33.43}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_fist":{"rotate":[{"time":0,"angle":-19.75},{"time":0.0666,"angle":-37.11},{"time":0.1333,"angle":-50.79},{"time":0.2666,"angle":-12.69},{"time":0.3333,"angle":3.01},{"time":0.4333,"angle":12.05},{"time":0.5333,"angle":13.25},{"time":0.8,"angle":-19.75}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":68.68},{"time":0.0666,"angle":73.89},{"time":0.1333,"angle":-9.64},{"time":0.2,"angle":284.27},{"time":0.2666,"angle":283.29},{"time":0.3333,"angle":278.28},{"time":0.4,"angle":271.02},{"time":0.4666,"angle":263.2},{"time":0.5333,"angle":314.25},{"time":0.6,"angle":16.83},{"time":0.6666,"angle":70.35},{"time":0.7333,"angle":73.53},{"time":0.8,"angle":68.68}],"translate":[{"time":0,"x":-2.57,"y":-8.89},{"time":0.1333,"x":-4.68,"y":7.2},{"time":0.2,"x":21.73,"y":51.17},{"time":0.6,"x":4.33,"y":2.05},{"time":0.8,"x":-2.57,"y":-8.89}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_bracer":{"rotate":[{"time":0,"angle":31.04},{"time":0.0666,"angle":28.28},{"time":0.1333,"angle":49.36},{"time":0.2,"angle":59.37},{"time":0.2666,"angle":8.56},{"time":0.3333,"angle":9.38},{"time":0.4,"angle":11.51},{"time":0.4666,"angle":7.22},{"time":0.5333,"angle":-18.44},{"time":0.6,"angle":11.44},{"time":0.6666,"angle":9.99},{"time":0.7333,"angle":8.28},{"time":0.8,"angle":31.04}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":11.03},{"time":0.2,"angle":13.58},{"time":0.4,"angle":11.03},{"time":0.6,"angle":13.58},{"time":0.8,"angle":11.03}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"head":{"rotate":[{"time":0,"angle":11.03},{"time":0.1,"angle":12.34},{"time":0.2,"angle":25.55},{"time":0.4,"angle":11.03},{"time":0.5,"angle":12.34},{"time":0.6,"angle":25.55},{"time":0.8,"angle":11.03}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":-62.47,"y":-23.1},{"time":0.0666,"x":-62.47,"y":-38.51,"curve":[0.244,0.04,0.75,1]},{"time":0.2666,"x":-62.47,"y":22.28,"curve":[0.17,0.52,0.75,1]},{"time":0.4,"x":-62.47,"y":-23.1},{"time":0.4333,"x":-62.47,"y":-24.59},{"time":0.4666,"x":-62.47,"y":-43.29,"curve":[0.25,0,0.75,1]},{"time":0.6666,"x":-62.47,"y":22.28},{"time":0.8,"x":-62.47,"y":-23.1}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_shin":{"rotate":[{"time":0,"angle":0,"curve":[0.481,0.01,0.75,1]},{"time":0.0666,"angle":-64.42},{"time":0.1333,"angle":-20.59,"curve":[0.25,0,0.75,1]},{"time":0.2666,"angle":-62.51},{"time":0.3333,"angle":-79.74},{"time":0.4,"angle":-78.28},{"time":0.4666,"angle":-118.96,"curve":[0.93,0,0.952,0.95]},{"time":0.6,"angle":-88.95},{"time":0.6666,"angle":-79.09},{"time":0.7333,"angle":-47.77},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":0},{"time":0.0333,"angle":-21.13,"curve":[0.121,0.23,0.75,1]},{"time":0.0666,"angle":17.64},{"time":0.1,"angle":29.92},{"time":0.1333,"angle":16.44},{"time":0.2,"angle":-29.22},{"time":0.2666,"angle":-1.61},{"time":0.3333,"angle":-10.22},{"time":0.4666,"angle":-15.99},{"time":0.6,"angle":9.03},{"time":0.7333,"angle":17.32},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":0},{"time":0.0666,"angle":-12.04},{"time":0.1333,"angle":-0.87},{"time":0.2,"angle":25.81},{"time":0.2666,"angle":4.71},{"time":0.4,"angle":18.09,"curve":[0.281,0.73,0.75,1]},{"time":0.4333,"angle":-1.7},{"time":0.4666,"angle":27.12},{"time":0.5,"angle":38.83},{"time":0.5333,"angle":30.76},{"time":0.5666,"angle":-20.49},{"time":0.6,"angle":-30.8},{"time":0.6666,"angle":-1.31},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"gun":{"rotate":[{"time":0,"angle":0},{"time":0.1333,"angle":24.72},{"time":0.5,"angle":-11.87},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]}},"events":[{"time":0,"name":"footstep"},{"time":0.4,"name":"footstep","int":1}]},"shoot":{"slots":{"front_fist":{"attachment":[{"time":0.1333,"name":"front_fist_closed"},{"time":0.4,"name":"front_fist_open"}]},"mouth":{"attachment":[{"time":0.1333,"name":"mouth_grind"}]},"muzzle":{"attachment":[{"time":0.1333,"name":"muzzle"},{"time":0.2666,"name":null}],"color":[{"time":0.1333,"color":"ffffff00","curve":[0.118,0.99,0.75,1]},{"time":0.1666,"color":"ffffffff","curve":[0.821,0,0.909,0.89]},{"time":0.2666,"color":"ffffff00"}]}},"bones":{"front_fist":{"scale":[{"time":0.1333,"x":1,"y":1,"curve":"stepped"},{"time":0.4,"x":1,"y":1}]},"gunTip":{"translate":[{"time":0.1333,"x":0,"y":0},{"time":0.2,"x":20.93,"y":1.57}],"scale":[{"time":0.1333,"x":1,"y":1},{"time":0.2,"x":1.247,"y":1.516}]},"gun":{"rotate":[{"time":0,"angle":1.9}],"translate":[{"time":0,"x":7.95,"y":5.84,"curve":[0,0.3,0.678,1]},{"time":0.3,"x":-9.3,"y":-1.41},{"time":0.4,"x":0,"y":0}]},"rear_bracer":{"rotate":[{"time":0,"angle":-30.47}],"translate":[{"time":0,"x":0,"y":0,"curve":[0,0.3,0.678,1]},{"time":0.3,"x":-5.99,"y":-3.71},{"time":0.4,"x":0,"y":0}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":62.3}],"translate":[{"time":0,"x":0,"y":0,"curve":[0,0.3,0.678,1]},{"time":0.3,"x":2.81,"y":11.41},{"time":0.4,"x":0,"y":0}]}}},"test":{"slots":{"front_foot":{"color":[{"time":0.6666,"color":"ffffffff"},{"time":1.3333,"color":"ff0700ff"}]},"gun":{"color":[{"time":0,"color":"ffffffff","curve":"stepped"},{"time":0.6666,"color":"ffffffff"},{"time":1.3333,"color":"32ff00ff"}]},"rear_foot":{"color":[{"time":0.6666,"color":"ffffffff"},{"time":1.3333,"color":"ff0700ff"}]}},"bones":{"head":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":-20.72},{"time":0.6666,"angle":-32.41},{"time":1,"angle":-5.3},{"time":1.3333,"angle":24.96},{"time":1.6666,"angle":15.61},{"time":2,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.172,0.37,0.574,0.73]},{"time":0.1666,"x":144.19,"y":-77.59,"curve":[0.372,0.61,0.765,1]},{"time":0.3333,"x":217.61,"y":-192.63,"curve":[0.282,0,0.624,0.31]},{"time":0.5,"x":181.21,"y":-365.66,"curve":[0.313,0.21,0.654,0.54]},{"time":0.6666,"x":20.09,"y":-500.4,"curve":[0.147,0.27,0.75,1]},{"time":0.8333,"x":-194.24,"y":-341.84},{"time":1,"x":-307.93,"y":-114},{"time":1.1666,"x":-330.38,"y":121.42,"curve":[0.25,0,0.764,0.48]},{"time":1.3333,"x":-240.42,"y":335.66,"curve":[0.229,0.37,0.58,0.73]},{"time":1.5,"x":-56.12,"y":288.06,"curve":[0.296,0.6,0.641,1]},{"time":1.6666,"x":87.63,"y":191.33,"curve":[0.238,0,0.626,0.39]},{"time":1.8333,"x":60.62,"y":95.14,"curve":[0.41,0.26,0.803,0.62]},{"time":2,"x":0,"y":0}]}},"drawOrder":[{"time":0.6666,"offsets":[{"slot":"head","offset":-9},{"slot":"eye","offset":-9},{"slot":"mouth","offset":-12},{"slot":"goggles","offset":-12}]},{"time":1.3333}],"events":[{"time":0,"name":"headPop","int":0,"float":0,"string":"pop.wav"},{"time":1,"name":"headBehind","int":7,"float":8,"string":"animate"},{"time":2,"name":"headAttach","int":0,"float":0,"string":"attach.wav"}]},"walk":{"slots":{"front_fist":{"attachment":[{"time":0,"name":"front_fist_closed"}]},"mouth":{"attachment":[{"time":0,"name":"mouth_smile"}]},"torso":{"attachment":[{"time":0,"name":"torso"}]}},"bones":{"front_thigh":{"rotate":[{"time":0,"angle":15.79},{"time":0.1,"angle":27.39},{"time":0.2,"angle":-7.94},{"time":0.3,"angle":-16.94},{"time":0.4,"angle":-28.62},{"time":0.5,"angle":-19.3},{"time":0.6,"angle":-3.08},{"time":0.7,"angle":29.51},{"time":0.8,"angle":15.79}],"translate":[{"time":0,"x":0,"y":0},{"time":0.4,"x":-1.18,"y":0.54},{"time":0.5,"x":0.11,"y":0.41},{"time":0.6,"x":9.48,"y":0.27},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.4,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_shin":{"rotate":[{"time":0,"angle":5.12},{"time":0.1,"angle":-20.87},{"time":0.2,"angle":13.37},{"time":0.3,"angle":15.98},{"time":0.4,"angle":5.94},{"time":0.5,"angle":-26.76},{"time":0.7,"angle":-55.44},{"time":0.8,"angle":5.12}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_thigh":{"rotate":[{"time":0,"angle":-34.38},{"time":0.1,"angle":-30.32},{"time":0.2,"angle":-37.22},{"time":0.3,"angle":20.73},{"time":0.4,"angle":8.69},{"time":0.5,"angle":12.16},{"time":0.6,"angle":-24.62},{"time":0.7,"angle":-27.26},{"time":0.8,"angle":-34.38}],"translate":[{"time":0,"x":0,"y":0},{"time":0.4,"x":4.08,"y":-9.53},{"time":0.5,"x":0,"y":0},{"time":0.7,"x":-21.14,"y":-9.6},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_shin":{"rotate":[{"time":0,"angle":14.26},{"time":0.1,"angle":-17.3},{"time":0.2,"angle":-12.67},{"time":0.3,"angle":-58.89},{"time":0.4,"angle":15.95},{"time":0.5,"angle":-9},{"time":0.6,"angle":26.06},{"time":0.7,"angle":21.85},{"time":0.8,"angle":14.26}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.1,"x":0.951,"y":1},{"time":0.5,"x":0.975,"y":1},{"time":0.8,"x":1,"y":1}]},"rear_foot":{"rotate":[{"time":0,"angle":10.13},{"time":0.1,"angle":12.27},{"time":0.2,"angle":-2.94},{"time":0.3,"angle":6.29},{"time":0.4,"angle":13.45},{"time":0.5,"angle":-3.57},{"time":0.6,"angle":-0.97},{"time":0.7,"angle":2.97},{"time":0.8,"angle":10.13}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_upper_arm":{"rotate":[{"time":0,"angle":-23.74},{"time":0.4,"angle":-320.57},{"time":0.8,"angle":-23.74}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_upper_arm":{"rotate":[{"time":0,"angle":11.62},{"time":0.1,"angle":19.36},{"time":0.4,"angle":345.26},{"time":0.5,"angle":343.44},{"time":0.8,"angle":11.62}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"torso":{"rotate":[{"time":0,"angle":-12.11},{"time":0.1666,"angle":-17.16},{"time":0.4,"angle":-12.11},{"time":0.5666,"angle":-15.81},{"time":0.8,"angle":-12.11}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":1.41},{"time":0.2333,"angle":-3.04},{"time":0.4,"angle":1.41},{"time":0.6333,"angle":-3.04},{"time":0.8,"angle":1.41}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"head":{"rotate":[{"time":0,"angle":6.97},{"time":0.1666,"angle":8.02},{"time":0.2666,"angle":12.65},{"time":0.4,"angle":6.97},{"time":0.5666,"angle":8.02},{"time":0.6666,"angle":12.65},{"time":0.8,"angle":6.97}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":-23.93,"y":3.22,"curve":[0.518,0.03,0.807,0.61]},{"time":0.1,"x":-23.93,"y":-9.24,"curve":[0.135,0.33,0.601,0.99]},{"time":0.2,"x":-23.93,"y":4.35,"curve":[0.204,0.68,0.75,1]},{"time":0.3,"x":-23.93,"y":2.38,"curve":[0.25,0,0.75,1]},{"time":0.4,"x":-23.93,"y":-2.5,"curve":[0.692,0.01,0.75,1]},{"time":0.5,"x":-23.93,"y":-10.32,"curve":[0.235,0.77,0.75,1]},{"time":0.6,"x":-23.93,"y":4.35,"curve":[0.287,0.37,0.718,0.76]},{"time":0.7,"x":-23.93,"y":10.34,"curve":[0.615,0,0.75,1]},{"time":0.8,"x":-23.93,"y":3.22}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_bracer":{"rotate":[{"time":0,"angle":0},{"time":0.4,"angle":20.59},{"time":0.8,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_foot":{"rotate":[{"time":0,"angle":12.49},{"time":0.1,"angle":-8.34},{"time":0.2,"angle":-6.17},{"time":0.3,"angle":-0.75},{"time":0.3333,"angle":3.89},{"time":0.4,"angle":10.22},{"time":0.5,"angle":11.44},{"time":0.6,"angle":-0.33},{"time":0.7,"angle":0.15},{"time":0.8,"angle":12.49}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"rear_bracer":{"rotate":[{"time":0,"angle":3.58},{"time":0.1,"angle":5.51},{"time":0.4,"angle":-22.77},{"time":0.5,"angle":-9.65},{"time":0.8,"angle":3.58}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"front_fist":{"rotate":[{"time":0,"angle":-15.22},{"time":0.1,"angle":-51.4},{"time":0.4,"angle":-39.4},{"time":0.5,"angle":19.26},{"time":0.8,"angle":-15.22}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]},"gun":{"rotate":[{"time":0,"angle":-24.06,"curve":[0.25,0,0.75,1]},{"time":0.1,"angle":-10.94,"curve":[0.381,0.54,0.742,1]},{"time":0.4,"angle":25.34,"curve":[0.25,0,0.75,1]},{"time":0.6666,"angle":-27.47,"curve":[0.25,0,0.75,1]},{"time":0.8,"angle":-24.06}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.8,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.8,"x":1,"y":1}]}}}}} \ No newline at end of file diff --git a/spine-turbulenz/example/data/spineboy.png b/spine-turbulenz/example/data/spineboy.png deleted file mode 100644 index 5606a0ce5..000000000 Binary files a/spine-turbulenz/example/data/spineboy.png and /dev/null differ diff --git a/spine-turbulenz/example/index.html b/spine-turbulenz/example/index.html deleted file mode 100644 index a02c9365d..000000000 --- a/spine-turbulenz/example/index.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - -spine-turbulenz - - - - - - - - - -
-
-
- - - -     Click to change the animation or skin. - - - - - \ No newline at end of file diff --git a/spine-turbulenz/spine-js/Place spine-js here.txt b/spine-turbulenz/spine-js/Place spine-js here.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/spine-turbulenz/turbulenz/draw2d.js b/spine-turbulenz/turbulenz/draw2d.js deleted file mode 100644 index 77a09c6ac..000000000 --- a/spine-turbulenz/turbulenz/draw2d.js +++ /dev/null @@ -1,2380 +0,0 @@ -// Copyright (c) 2012 Turbulenz Limited - -/*global -Draw2D: false -Float32Array: false -*/ - -// -// Draw2DGroup. Wraps vertex buffer data with pairings of indices and textures -// representing subsets of buffer relating to a set of equal-texture quads. -// -// [ sprite1 sprite2 sprite3 sprite4 sprite5 ] -// \---------------/ \------/ \--------------/ -// texture 1 texture 2 texture 3 -// 12 indices 6 indices 12 indices -// -function Draw2DGroup() {} -Draw2DGroup.create = function draw2DGroupFn() -{ - var group = new Draw2DGroup(); - - // pairs of index counts + associated texture for subset of group. - group.indices = []; - group.textures = []; - group.numSets = 0; - - // vertex buffer for group. - group.vertexBufferData = new Draw2D.prototype.floatArray(1024); - group.numVertices = 0; - - return group; -}; - -function Draw2DSprite() {} -Draw2DSprite.prototype = { - - version : 1, - - // - // Assumption is that user will not be performing these actions frequently. - // To that end, we provide a function which performs the ssary side effects - // on call, to prevent an overhead for lazy evaluation. - // - getTextureRectangle : function getTextureRectangleFn(dst) - { - if (dst === undefined) - { - dst = new Draw2D.prototype.floatArray(4); - } - var data = this.data; - var texture = this._texture; - if (texture) - { - dst[0] = data[12] * texture.width; - dst[1] = data[13] * texture.height; - dst[2] = data[14] * texture.width; - dst[3] = data[15] * texture.height; - } - else - { - dst[0] = data[12]; - dst[1] = data[13]; - dst[2] = data[14]; - dst[3] = data[15]; - } - return dst; - }, - setTextureRectangle : function setTextureRectangleFn(uvRect) - { - var data = this.data; - var texture = this._texture; - if (texture) - { - var iwidth = 1 / texture.width; - var iheight = 1 / texture.height; - data[12] = uvRect[0] * iwidth; - data[13] = uvRect[1] * iheight; - data[14] = uvRect[2] * iwidth; - data[15] = uvRect[3] * iheight; - } - else - { - data[12] = uvRect[0]; - data[13] = uvRect[1]; - data[14] = uvRect[2]; - data[15] = uvRect[3]; - } - }, - - getColor : function getColorFn(dst) - { - if (dst === undefined) - { - dst = new Draw2D.prototype.floatArray(4); - } - var data = this.data; - dst[0] = data[8]; - dst[1] = data[9]; - dst[2] = data[10]; - dst[3] = data[11]; - return dst; - }, - setColor : function setColorFn(color) - { - var data = this.data; - data[8] = color[0]; - data[9] = color[1]; - data[10] = color[2]; - data[11] = color[3]; - }, - - getTexture : function getTextureFn() - { - return this._texture; - }, - setTexture : function setTextureFn(texture) - { - if (this._texture !== texture) - { - var su = (this._texture ? this._texture.width : 1.0) / (texture ? texture.width : 1.0); - var sv = (this._texture ? this._texture.height : 1.0) / (texture ? texture.height : 1.0); - this._texture = texture || null; - - // re-normalise texture coordinates. - var data = this.data; - data[12] *= su; - data[13] *= sv; - data[14] *= su; - data[15] *= sv; - } - }, - - getWidth : function getWidthFn() - { - return this.data[17] * 2; - }, - setWidth : function setWidthFn(width) - { - width *= 0.5; - var data = this.data; - if (data[17] !== width) - { - data[17] = width; - this._invalidate(); - } - }, - - getHeight : function getHeightFn() - { - return this.data[18] * 2; - }, - setHeight : function setHeightFn(height) - { - height *= 0.5; - var data = this.data; - if (data[18] !== height) - { - data[18] = height; - this._invalidate(); - } - }, - - getScale : function getScaleFn(dst) - { - if (dst === undefined) - { - dst = new Draw2D.prototype.floatArray(2); - } - var data = this.data; - dst[0] = data[19]; - dst[1] = data[20]; - return dst; - }, - setScale : function setScaleFn(scale) - { - var scaleX = scale[0]; - var scaleY = scale[1]; - var data = this.data; - if (data[19] !== scaleX || data[20] !== scaleY) - { - data[19] = scaleX; - data[20] = scaleY; - this._invalidate(); - } - }, - - getShear : function getShearFn(dst) - { - if (dst === undefined) - { - dst = new Draw2D.prototype.floatArray(2); - } - var data = this.data; - dst[0] = data[21]; - dst[1] = data[22]; - return dst; - }, - setShear : function setShearFn(shear) - { - var shearX = shear[0]; - var shearY = shear[1]; - var data = this.data; - if (data[21] !== shearX || data[22] !== shearY) - { - data[21] = shearX; - data[22] = shearY; - this._invalidate(); - } - }, - - getOrigin : function getOriginFn(dst) - { - if (dst === undefined) - { - dst = new Draw2D.prototype.floatArray(2); - } - var data = this.data; - dst[0] = data[23]; - dst[1] = data[24]; - return dst; - }, - setOrigin : function setOriginFn(origin) - { - var originX = origin[0]; - var originY = origin[1]; - var data = this.data; - if (data[23] !== originX || data[24] !== originY) - { - data[23] = originX; - data[24] = originY; - this._invalidate(); - } - }, - - // Method for internal use only. - // - // Recompute locally defined vectors. - _invalidate : function invalidateFn() - { - var data = this.data; - // [ T1 T2 ] = [ scaleX 0 ] [ 1 shearX ] - // [ T3 T4 ] [ 0 scaleY ] [ shearY 1 ] - var T1 = data[19]; - var T2 = data[19] * data[21]; - var T3 = data[20] * data[22]; - var T4 = data[20]; - - // Recompute locally defined position of true center of sprite. - var x = data[17] - data[23]; // x = width/2 - originX - var y = data[18] - data[24]; // y = height/2 - originY - var cx = data[25] = (T1 * x + T2 * y); // (cx) = T (x) - var cy = data[26] = (T3 * x + T4 * y); // (cy) (y) - - // Recompute locally defined position of top-left vertex relative to center of sprite. - x = -data[17]; // x = -width/2 - y = -data[18]; // y = -height/2 - var ux = data[27] = (T1 * x + T2 * y); // (ux) = T (x) - var uy = data[28] = (T3 * x + T4 * y); // (uy) (y) - - // Recompute locally defined position of top-right vertex relative to center of sprite. - x = -x; // x = width / 2 - var vx = data[29] = (T1 * x + T2 * y); // (vx) = T (x) - var vy = data[30] = (T3 * x + T4 * y); // (vy) (y) - - // Rotate vectors to screen space so that in the case that rotation is not performed - // These vectors are still valid. - var rotation = data[16] = this.rotation; - var cos = Math.cos(rotation); - var sin = Math.sin(rotation); - - data[31] = ((cos * cx) - (sin * cy)); - data[32] = ((sin * cx) + (cos * cy)); - data[33] = ((cos * ux) - (sin * uy)); - data[34] = ((sin * ux) + (cos * uy)); - data[35] = ((cos * vx) - (sin * vy)); - data[36] = ((sin * vx) + (cos * vy)); - - // Compute suitable epsilon to consider rotations equals. - // We do this by finding the vertex furthest from defined center of rotation. - // And using its distance to compute what rotation constitutes a 'visible' rotation. - // - // Positions of vertices relative to origin are given by: - // v1 = c + u, v2 = c + v, v3 = c - v, v4 = c - u. - // |v1|^2 = |c|^2 + |u|^2 + 2c.u - // |v4|^2 = |c|^2 + |u|^2 - 2c.u - // |v2|^2 = |c|^2 + |v|^2 + 2c.v - // |v3|^2 = |c|^2 + |v|^2 - 2c.v - // - // Compute r1 = |u|^2 + abs(2c.u) - // Compute r2 = |v|^2 + abs(2c.v) - // - // Finally max(|vi|^2) = |c|^2 + max(r1, r2) - // - var dot = 2 * ((cx * ux) + (cy * uy)); - if (dot < 0) - { - dot = -dot; - } - var r1 = (ux * ux) + (uy * uy) + dot; - - dot = 2 * ((cx * vx) + (cy * vy)); - if (dot < 0) - { - dot = -dot; - } - var r2 = (vx * vx) + (vy * vy) + dot; - - if (r2 > r1) - { - r1 = r2; - } - - r1 += ((cx * cx) + (cy * cy)); - // r1 is the squared distance to furthest vertex. - // - // We permit a half pixel movement to be considered a 'true' movement. - // Squared rotation required to impart this movement on furthest vertex is - data[37] = (0.25 / r1); // squared epsilon - }, - - // Method for internal use only. - // - // Recompute draw2d coordinate space vertices and vectors. - _update : function _updateFn(angleScaleFactor) - { - var data = this.data; - var x, y, u, v; - - // Check if rotation has been modified - x = this.rotation; - y = x - data[16]; // y = rotation - previousRotation - if ((y * y) > (data[37] * angleScaleFactor)) // if |y| > epsilon - { - data[16] = x; //previousRotation = rotation - u = Math.cos(x); - v = Math.sin(x); - - // rotate locally defined vectors. - x = data[25]; - y = data[26]; - data[31] = (u * x - v * y); // (px) = [cos -sin] (cx) - data[32] = (v * x + u * y); // (py) = [sin cos] (cy) - - x = data[27]; - y = data[28]; - data[33] = (u * x - v * y); // (x1) = [cos -sin] (ux) - data[34] = (v * x + u * y); // (y1) = [sin cos] (uy) - - x = data[29]; - y = data[30]; - data[35] = (u * x - v * y); // (x2) = [cos -sin] (vx) - data[36] = (v * x + u * y); // (y2) = [sin cos] (vy) - } - - // Compute center of this sprite in screen space. - u = this.x + data[31]; // u = centerX = positionX + px - v = this.y + data[32]; // v = centerY = positionY + py - - // Compute vertex positions in screen space. - x = data[33]; - y = data[34]; - data[0] = u + x; // v1x = centerX + x1 - data[1] = v + y; // v1y = centerY + y1 - data[6] = u - x; // v4x = centerX - x1 - data[7] = v - y; // v4y = centerY - y1 - - x = data[35]; - y = data[36]; - data[2] = u + x; // v2x = centerX + x2 - data[3] = v + y; // v2y = centerY + y2 - data[4] = u - x; // v3x = centerX - x2 - data[5] = v - y; // v3y = centerY - y2 - } -}; - -Draw2DSprite.create = function draw2DSpriteCreateFn(params) -{ - if ((params.width === undefined || params.height === undefined) && !params.texture) - { - return null; - } - - // data: - // --- - // First 16 values reserved for Draw2DSpriteData. - // includes colour and texture coordinates. - // - // 16 : old_rotation (for lazy evaluation) - // 17,18 : width/2, height/2 (changed by user via function) - // 19,20 : scaleX, scaleY (changed by user via function) - // 21,22 : shearX, shearY (changed by user via function) - // 23,24 : originX, originY (changed by user via function) - // 25,26 : cx, cy // locally defined position of true center of sprite relative to origin - // (dependant on scale/shear/center/dimension) - // 27,28 : u1, v1 // locally defined position of top-left vertex relative to center of sprite. - // (dependant on scale/shear/dimension) - // 29,30 : u2, v2 // locally defined position of top-right vertex relative to center of sprite. - // (dependant on scale/shear/dimension) - // 31,32 : px, py // relative defined position of true center of sprite relative to origin - // (dependant on rotation and cx,cy) - // 33,34 : x1, y1 // relative defined position of top-left vertex relative to center of sprite. - // (dependant on rotation and u1,v1) - // 35,36 : x2, y2 // relative defined position of top-right vertex relative to center of sprite. - // (dependant on rotation and u2,v2) - // 37 : Squared epsilon to consider rotations equal based on dimensions. - var s = new Draw2DSprite(); - var data = s.data = new Draw2D.prototype.floatArray(38); - - // texture (not optional) - var texture = s._texture = params.texture || null; - - // position (optional, default 0,0) - s.x = (params.x || 0.0); - s.y = (params.y || 0.0); - - // rotation (optional, default 0) - s.rotation = data[16] = (params.rotation || 0.0); - - // colour (optional, default [1,1,1,1]) - var color = params.color; - data[8] = (color ? color[0] : 1.0); - data[9] = (color ? color[1] : 1.0); - data[10] = (color ? color[2] : 1.0); - data[11] = (color ? color[3] : 1.0); - - // uvRect (optional, default texture rectangle) - var uvRect = params.textureRectangle; - var iwidth = (texture ? 1 / texture.width : 1); - var iheight = (texture ? 1 / texture.height : 1); - data[12] = (uvRect ? (uvRect[0] * iwidth) : 0.0); - data[13] = (uvRect ? (uvRect[1] * iheight) : 0.0); - data[14] = (uvRect ? (uvRect[2] * iwidth) : 1.0); - data[15] = (uvRect ? (uvRect[3] * iheight) : 1.0); - - // dimensions / 2 (default texture dimensions) - data[17] = ((params.width !== undefined) ? params.width : texture.width) * 0.5; - data[18] = ((params.height !== undefined) ? params.height : texture.height) * 0.5; - - // scale (default [1,1]) - var scale = params.scale; - data[19] = (scale ? scale[0] : 1.0); - data[20] = (scale ? scale[1] : 1.0); - - // shear (default [0,0]) - var shear = params.shear; - data[21] = (shear ? shear[0] : 0.0); - data[22] = (shear ? shear[1] : 0.0); - - // origin (default dimensions / 2) - var origin = params.origin; - data[23] = (origin ? origin[0] : data[17]); - data[24] = (origin ? origin[1] : data[18]); - - s._invalidate(); - return s; -}; - -// -// Used in rectangle draw routines to compute data to be pushed into vertex buffers. -// -function Draw2DSpriteData() {} -Draw2DSpriteData.setFromRotatedRectangle = function setFromRotatedRectangleFn(sprite, texture, rect, uvrect, color, rotation, origin) -{ - var x1 = rect[0]; - var y1 = rect[1]; - var x2 = rect[2]; - var y2 = rect[3]; - - if (!rotation) - { - sprite[0] = x1; - sprite[1] = y1; - sprite[2] = x2; - sprite[3] = y1; - sprite[4] = x1; - sprite[5] = y2; - sprite[6] = x2; - sprite[7] = y2; - } - else - { - var cx, cy; - if (origin) - { - cx = x1 + origin[0]; - cy = y1 + origin[1]; - } - else - { - cx = 0.5 * (x1 + x2); - cy = 0.5 * (y1 + y2); - } - - var dx = x1 - cx; - var dy = y1 - cy; - - var cos = Math.cos(rotation); - var sin = Math.sin(rotation); - var w = (x2 - x1); - var h = (y2 - y1); - - sprite[0] = x1 = cx + (cos * dx - sin * dy); - sprite[1] = y1 = cy + (sin * dx + cos * dy); - sprite[2] = x1 + (cos * w); - sprite[3] = y1 + (sin * w); - sprite[4] = x1 - (sin * h); - sprite[5] = y1 + (cos * h); - sprite[6] = x1 + (cos * w - sin * h); - sprite[7] = y1 + (sin * w + cos * h); - } - - if (color) - { - sprite[8] = color[0]; - sprite[9] = color[1]; - sprite[10] = color[2]; - sprite[11] = color[3]; - } - else - { - sprite[8] = sprite[9] = sprite[10] = sprite[11] = 1.0; - } - - if (uvrect && texture) - { - var iwidth = 1 / texture.width; - var iheight = 1 / texture.height; - sprite[12] = uvrect[0] * iwidth; - sprite[13] = uvrect[1] * iheight; - sprite[14] = uvrect[2] * iwidth; - sprite[15] = uvrect[3] * iheight; - } - else - { - sprite[12] = sprite[13] = 0; - sprite[14] = sprite[15] = 1; - } -}; - -Draw2DSpriteData.create = function draw2DSpriteFn() -{ - // x1 y1 x2 y2 x3 y3 x4 y4 - vertices [0,8) - // cr cg cb ca u1 v1 u2 v2 - normalized color + texture [8,16) - return new Draw2D.prototype.floatArray(16); -}; - -function Draw2D() {} - -Draw2D.prototype = { - - version : 7, - - forceUpdate : false, - clearBackBuffer : false, - - // supported sort modes. - sort : { - deferred : 'deferred', - immediate : 'immediate', - texture : 'texture' - }, - - // supported scale modes. - scale : { - scale : 'scale', - none : 'none' - }, - - drawStates: { - uninit: 0, - ready : 1, - draw : 2 - }, - - defaultClearColor: [0, 0, 0, 1], - - clear: function clearFn(clearColor) - { - if (this.state !== this.drawStates.ready) - { - return false; - } - - var gd = this.graphicsDevice; - if (this.currentRenderTarget) - { - if (!gd.beginRenderTarget(this.currentRenderTarget.renderTarget)) - { - return false; - } - - gd.clear(clearColor || this.defaultClearColor); - gd.endRenderTarget(); - } - else - { - gd.clear(clearColor || this.defaultClearColor); - } - - return true; - }, - - clearBatch: function clearFn() - { - for (var name in this.texLists) - { - if (this.texLists.hasOwnProperty(name)) - { - delete this.texLists[name]; - } - } - this.currentTextureGroup = undefined; - this.numGroups = 0; - }, - - bufferSprite : function bufferSpriteFn(buffer, sprite, index) - { - sprite._update(0); - /*jshint bitwise: false*/ - index <<= 4; - /*jshint bitwise: true*/ - - var data = sprite.data; - buffer[index] = data[0]; - buffer[index + 1] = data[1]; - buffer[index + 2] = data[2]; - buffer[index + 3] = data[3]; - buffer[index + 4] = data[4]; - buffer[index + 5] = data[5]; - buffer[index + 6] = data[6]; - buffer[index + 7] = data[7]; - buffer[index + 8] = data[8]; - buffer[index + 9] = data[9]; - buffer[index + 10] = data[10]; - buffer[index + 11] = data[11]; - buffer[index + 12] = data[12]; - buffer[index + 13] = data[13]; - buffer[index + 14] = data[14]; - buffer[index + 15] = data[15]; - }, - - update: function updateFn() - { - var graphicsDevice = this.graphicsDevice; - var width = this.width; - var height = this.height; - - var graphicsDeviceWidth = graphicsDevice.width; - var graphicsDeviceHeight = graphicsDevice.height; - - if (width !== graphicsDeviceWidth || height !== graphicsDeviceHeight || this.forceUpdate) - { - var viewWidth, viewHeight, viewX, viewY; - var viewportRectangle = this.viewportRectangle; - - if (viewportRectangle) - { - viewX = viewportRectangle[0]; - viewY = viewportRectangle[1]; - viewWidth = viewportRectangle[2] - viewX; - viewHeight = viewportRectangle[3] - viewY; - } - else - { - viewX = 0; - viewY = 0; - viewWidth = graphicsDeviceWidth; - viewHeight = graphicsDeviceHeight; - } - - if ((viewWidth === graphicsDeviceWidth) && (viewHeight === graphicsDeviceHeight)) - { - this.clearBackBuffer = false; - } - else - { - this.clearBackBuffer = true; - } - - var target = this.currentRenderTarget; - - if (this.scaleMode === 'scale') - { - var viewAspectRatio = viewWidth / viewHeight; - var graphicsDeviceAspectRatio = graphicsDeviceWidth / graphicsDeviceHeight; - var calcViewWidth, calcViewHeight, diffWidth, diffHeight, halfDiffWidth, halfDiffHeight; - - if (graphicsDeviceAspectRatio > viewAspectRatio) - { - calcViewWidth = Math.ceil((graphicsDeviceHeight / viewHeight) * viewWidth); - diffWidth = graphicsDeviceWidth - calcViewWidth; - halfDiffWidth = Math.floor(diffWidth * 0.5); - - this.scissorX = halfDiffWidth; - this.scissorY = 0; - this.scissorWidth = calcViewWidth; - this.scissorHeight = graphicsDeviceHeight; - - this.viewScaleX = viewWidth / calcViewWidth; - this.viewScaleY = viewHeight / graphicsDeviceHeight; - - if (!target) - { - this.clipOffsetX = (halfDiffWidth / graphicsDeviceWidth * 2.0) - 1.0; - this.clipOffsetY = 1; - this.clipScaleX = (calcViewWidth / graphicsDeviceWidth * 2.0) / viewWidth; - this.clipScaleY = -2.0 / viewHeight; - } - } - else - { - calcViewHeight = Math.ceil((graphicsDeviceWidth / viewWidth) * viewHeight); - diffHeight = graphicsDeviceHeight - calcViewHeight; - halfDiffHeight = Math.floor(diffHeight * 0.5); - - this.scissorX = 0; - this.scissorY = halfDiffHeight; - this.scissorWidth = graphicsDeviceWidth; - this.scissorHeight = calcViewHeight; - - this.viewScaleX = viewWidth / graphicsDeviceWidth; - this.viewScaleY = viewHeight / calcViewHeight; - - if (!target) - { - this.clipOffsetX = -1.0; - this.clipOffsetY = 1 - ((halfDiffHeight / graphicsDeviceHeight) * 2.0); - this.clipScaleX = 2.0 / viewWidth; - this.clipScaleY = ((calcViewHeight / graphicsDeviceHeight) * -2.0) / viewHeight; - } - } - } - else - { - this.viewScaleX = 1; - this.viewScaleY = 1; - - if (!target) - { - this.clipOffsetX = -1.0; - this.clipOffsetY = 1.0; - this.clipScaleX = 2.0 / graphicsDeviceWidth; - this.clipScaleY = -2.0 / graphicsDeviceHeight; - } - - this.scissorX = 0; - this.scissorY = (graphicsDeviceHeight - viewHeight); - this.scissorWidth = viewWidth; - this.scissorHeight = viewHeight; - } - - this.spriteAngleFactor = Math.min(this.viewScaleX, this.viewScaleY); - this.spriteAngleFactor *= this.spriteAngleFactor; - - this.width = graphicsDeviceWidth; - this.height = graphicsDeviceHeight; - - var i = 0; - var renderTargets = this.renderTargetStructs; - var limit = renderTargets.length; - for (i = 0; i < limit; i += 1) - { - this.validateTarget(renderTargets[i], this.scissorWidth, this.scissorHeight); - } - - if (target) - { - this.clipOffsetX = -1.0; - this.clipOffsetY = -1.0; - this.clipScaleX = 2.0 * target.actualWidth / target.texture.width / viewWidth; - this.clipScaleY = 2.0 * target.actualHeight / target.texture.height / viewHeight; - } - - // Deal with viewports that are not started at (0,0) - this.clipOffsetX -= viewX * this.clipScaleX; - this.clipOffsetY -= viewY * this.clipScaleY; - - var clipSpace = this.techniqueParameters.clipSpace; - clipSpace[0] = this.clipScaleX; - clipSpace[1] = this.clipScaleY; - clipSpace[2] = this.clipOffsetX; - clipSpace[3] = this.clipOffsetY; - - this.updateRenderTargetVbo(this.scissorX, this.scissorY, this.scissorWidth, this.scissorHeight); - this.forceUpdate = false; - } - }, - - getViewport: function getViewportFn(dst) - { - if (!dst) - { - dst = new Draw2D.prototype.floatArray(4); - } - var viewport = this.viewportRectangle; - if (viewport) - { - dst[0] = viewport[0]; - dst[1] = viewport[1]; - dst[2] = viewport[2]; - dst[3] = viewport[3]; - } - else - { - dst[0] = dst[1] = 0; - dst[2] = this.graphicsDevice.width; - dst[3] = this.graphicsDevice.height; - } - return dst; - }, - getScreenSpaceViewport: function screenSpaceViewportFn(dst) - { - if (!dst) - { - dst = new Draw2D.prototype.floatArray(4); - } - // ensure mapping is correct. - this.update(); - - dst[0] = this.scissorX; - dst[1] = this.height - (this.scissorY + this.scissorHeight); - dst[2] = dst[0] + this.scissorWidth; - dst[3] = dst[1] + this.scissorHeight; - return dst; - }, - - viewportMap: function viewportMapFn(screenX, screenY, dst) - { - if (!dst) - { - dst = new Draw2D.prototype.floatArray(2); - } - // ensure mapping is correct. - this.update(); - - // webgl coordinates have flipped y. - var scissorY = (this.height - this.scissorHeight - this.scissorY); - - dst[0] = (screenX - this.scissorX) * this.viewScaleX; - dst[1] = (screenY - scissorY) * this.viewScaleY; - - var viewport = this.viewportRectangle; - if (viewport) - { - dst[0] += viewport[0]; - dst[1] += viewport[1]; - } - - return dst; - }, - viewportUnmap: function screenMapFn(x, y, dst) - { - if (!dst) - { - dst = new Draw2D.prototype.floatArray(2); - } - // ensure mapping is correct. - this.update(); - - var viewport = this.viewportRectangle; - if (viewport) - { - x -= viewport[0]; - y -= viewport[1]; - } - - // webgl coordinates have flipped y. - var scissorY = (this.height - this.scissorHeight - this.scissorY); - - dst[0] = (x / this.viewScaleX) + this.scissorX; - dst[1] = (y / this.viewScaleY) + scissorY; - return dst; - }, - - viewportClamp: function viewportClampFn(point) - { - if (point) - { - var x = point[0]; - var y = point[1]; - - var minX, minY, maxX, maxY; - var viewport = this.viewportRectangle; - if (viewport) - { - minX = viewport[0]; - minY = viewport[1]; - maxX = viewport[2]; - maxY = viewport[3]; - } - else - { - minX = 0; - minY = 0; - maxX = this.graphicsDevice.width; - maxY = this.graphicsDevice.height; - } - - if (x < minX) - { - x = minX; - } - else if (x > maxX) - { - x = maxX; - } - - if (y < minY) - { - y = minY; - } - else if (y > maxY) - { - y = maxY; - } - - point[0] = x; - point[1] = y; - } - - return point; - }, - - configure: function configureFn(params) - { - if (this.state !== this.drawStates.ready) - { - return false; - } - - var viewportRectangle = ("viewportRectangle" in params) ? params.viewportRectangle : this.viewportRectangle; - - var scaleMode = params.scaleMode; - if (scaleMode !== undefined) - { - // check scaleMode is supported. - if (!(scaleMode in this.scale)) - { - return false; - } - if (scaleMode === 'scale' && !viewportRectangle) - { - return false; - } - this.scaleMode = scaleMode; - } - - this.viewportRectangle = viewportRectangle; - - this.forceUpdate = true; - this.update(); - - return true; - }, - - destroy: function destroyFn() - { - this.texLists = null; - this.state = this.drawStates.uninit; - - delete this.graphicsDevice; - - if (this.vertexBuffer) - { - this.vertexBuffer.destroy(); - } - if (this.indexBuffer) - { - this.indexBuffer.destroy(); - } - - this.copyVertexBuffer.destroy(); - - var renderTargets = this.renderTargetStructs; - while (renderTargets.length > 0) - { - var target = renderTargets.pop(); - target.texture.destroy(); - target.renderTarget.destroy(); - delete target.texture; - delete target.renderTarget; - } - }, - - begin: function beginFn(blendMode, sortMode) - { - // Check sort mode is well defined (or undefined signifying default) - if (sortMode && !(sortMode in this.sort)) - { - return false; - } - - // Check blend mode is well defined (or undefined signifying default) - if (blendMode && !(blendMode in this.blend)) - { - return false; - } - - //if there are render states left in the stack - //and begin has been called without an end - //draw previous data with current render state - var firstTime = !this.sortMode; - if (this.dispatch()) - { - this.clearBatch(); - } - - if (firstTime) - { - if (this.state !== this.drawStates.ready) - { - return false; - } - - // Check the buffers are correct before we render - this.update(); - - if (!this.currentRenderTarget) - { - this.graphicsDevice.setScissor(this.scissorX, this.scissorY, this.scissorWidth, this.scissorHeight); - } - } - - this.state = this.drawStates.draw; - - sortMode = (sortMode) ? sortMode : (firstTime ? 'deferred' : this.sortMode); - blendMode = (blendMode) ? blendMode : (firstTime ? 'opaque' : this.blendMode); - - - if (!firstTime) - { - this.sortModeStack.push(this.sortMode); - this.blendModeStack.push(this.blendMode); - } - this.sortMode = sortMode; - this.blendMode = blendMode; - - this.prepareSortMode(sortMode); - this.graphicsDevice.setTechnique(this.blendModeTechniques[blendMode]); - - return true; - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - // append sprite data to group buffer. - _bufferSprite : function bufferSpriteFn(group, sprite) - { - var vertexData = group.vertexBufferData; - var vertexBuffer = this.vertexBuffer; - - var index = group.numVertices * vertexBuffer.stride; - var total = index + (4 * vertexBuffer.stride); - if (total >= vertexData.length) - { - // allocate new vertex buffer data array. - var size = this.bufferSizeAlgorithm(total, this.cpuStride); - var newData = new Draw2D.prototype.floatArray(size); - - // copy data from existing buffer. - var i; - for (i = 0; i < index; i += 1) - { - newData[i] = vertexData[i]; - } - - group.vertexBufferData = vertexData = newData; - } - - var c1 = sprite[8]; - var c2 = sprite[9]; - var c3 = sprite[10]; - var c4 = sprite[11]; - var u1 = sprite[12]; - var v1 = sprite[13]; - var u2 = sprite[14]; - var v2 = sprite[15]; - - vertexData[index] = sprite[0]; - vertexData[index + 1] = sprite[1]; - vertexData[index + 2] = c1; - vertexData[index + 3] = c2; - vertexData[index + 4] = c3; - vertexData[index + 5] = c4; - vertexData[index + 6] = u1; - vertexData[index + 7] = v1; - - vertexData[index + 8] = sprite[2]; - vertexData[index + 9] = sprite[3]; - vertexData[index + 10] = c1; - vertexData[index + 11] = c2; - vertexData[index + 12] = c3; - vertexData[index + 13] = c4; - vertexData[index + 14] = u2; - vertexData[index + 15] = v1; - - vertexData[index + 16] = sprite[4]; - vertexData[index + 17] = sprite[5]; - vertexData[index + 18] = c1; - vertexData[index + 19] = c2; - vertexData[index + 20] = c3; - vertexData[index + 21] = c4; - vertexData[index + 22] = u1; - vertexData[index + 23] = v2; - - vertexData[index + 24] = sprite[6]; - vertexData[index + 25] = sprite[7]; - vertexData[index + 26] = c1; - vertexData[index + 27] = c2; - vertexData[index + 28] = c3; - vertexData[index + 29] = c4; - vertexData[index + 30] = u2; - vertexData[index + 31] = v2; - - group.numVertices += 4; - - // increment number of indices in present subset. - group.indices[group.numSets - 1] += 6; - }, - - bufferMultiSprite : function bufferMultiSprite(group, buffer, count, offset) - { - var vertexData = group.vertexBufferData; - var vertexBuffer = this.vertexBuffer; - - var numSprites = (count === undefined) ? Math.floor(buffer.length / 16) : count; - count = numSprites * 16; - - offset = (offset !== undefined ? offset : 0) * 16; - - var i; - var index = (group.numVertices * vertexBuffer.stride); - var total = index + (numSprites * 4 * vertexBuffer.stride); - if (total >= vertexData.length) - { - // allocate new vertex buffer data array. - var size = this.bufferSizeAlgorithm(total, this.cpuStride); - var newData = new Draw2D.prototype.floatArray(size); - - // copy data from existing buffer. - for (i = 0; i < index; i += 1) - { - newData[i] = vertexData[i]; - } - - group.vertexBufferData = vertexData = newData; - } - - var limit = offset + count; - for (i = offset; i < limit; i += 16) - { - var c1 = buffer[i + 8]; - var c2 = buffer[i + 9]; - var c3 = buffer[i + 10]; - var c4 = buffer[i + 11]; - var u1 = buffer[i + 12]; - var v1 = buffer[i + 13]; - var u2 = buffer[i + 14]; - var v2 = buffer[i + 15]; - - vertexData[index] = buffer[i]; - vertexData[index + 1] = buffer[i + 1]; - vertexData[index + 2] = c1; - vertexData[index + 3] = c2; - vertexData[index + 4] = c3; - vertexData[index + 5] = c4; - vertexData[index + 6] = u1; - vertexData[index + 7] = v1; - - vertexData[index + 8] = buffer[i + 2]; - vertexData[index + 9] = buffer[i + 3]; - vertexData[index + 10] = c1; - vertexData[index + 11] = c2; - vertexData[index + 12] = c3; - vertexData[index + 13] = c4; - vertexData[index + 14] = u2; - vertexData[index + 15] = v1; - - vertexData[index + 16] = buffer[i + 4]; - vertexData[index + 17] = buffer[i + 5]; - vertexData[index + 18] = c1; - vertexData[index + 19] = c2; - vertexData[index + 20] = c3; - vertexData[index + 21] = c4; - vertexData[index + 22] = u1; - vertexData[index + 23] = v2; - - vertexData[index + 24] = buffer[i + 6]; - vertexData[index + 25] = buffer[i + 7]; - vertexData[index + 26] = c1; - vertexData[index + 27] = c2; - vertexData[index + 28] = c3; - vertexData[index + 29] = c4; - vertexData[index + 30] = u2; - vertexData[index + 31] = v2; - - index += 32; - } - - group.numVertices += (numSprites * 4); - // increment number of indices in present subset. - group.indices[group.numSets - 1] += (numSprites * 6); - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - indexData : function indexDataFn(count) - { - var indexData = new Draw2D.prototype.uint16Array(count); - var i; - var vertexIndex = 0; - for (i = 0; i < count; i += 6) - { - indexData[i] = vertexIndex; - indexData[i + 1] = vertexIndex + 1; - indexData[i + 2] = vertexIndex + 2; - indexData[i + 3] = vertexIndex + 1; - indexData[i + 4] = vertexIndex + 2; - indexData[i + 5] = vertexIndex + 3; - vertexIndex += 4; - } - return indexData; - }, - - // upload group buffer to graphics device vertexBuffer. - uploadBuffer : function uploadBufferFn(group, count, offset) - { - var vertexBuffer = this.vertexBuffer; - var vertexBufferParameters = this.vertexBufferParameters; - var graphicsDevice = this.graphicsDevice; - var vertexData = group.vertexBufferData; - - var performanceData = this.performanceData; - - // Resize buffers. - if (count > vertexBufferParameters.numVertices) - { - var newSize = this.bufferSizeAlgorithm(count, this.gpuStride); - if (newSize > this.maxVertices) - { - newSize = this.maxVertices; - } - - vertexBufferParameters.numVertices = newSize; - this.vertexBuffer.destroy(); - this.vertexBuffer = vertexBuffer = graphicsDevice.createVertexBuffer(vertexBufferParameters); - - // 32 bytes per vertex. - // 2 bytes per index, 1.5 indices per vertex. - performanceData.gpuMemoryUsage = newSize * 35; // 32 + (1.5 * 2) - - newSize *= 1.5; - - // Set indices. - var indexBufferParameters = this.indexBufferParameters; - indexBufferParameters.data = this.indexData(newSize); - indexBufferParameters.numIndices = newSize; - this.indexBuffer.destroy(); - this.indexBuffer = graphicsDevice.createIndexBuffer(indexBufferParameters); - graphicsDevice.setIndexBuffer(this.indexBuffer); - } - - performanceData.dataTransfers += 1; - - // Upload data. - if (offset === 0) - { - vertexBuffer.setData(vertexData, 0, count); - } - else - { - var stride = vertexBuffer.stride; - vertexBuffer.setData(vertexData.subarray(offset * stride, (offset + count) * stride), 0, count); - } - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - drawRawImmediate : function drawRawImmediateFn(texture, multiSprite, count, offset) - { - var group = this.drawGroups[0]; - group.textures[0] = texture || this.defaultTexture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups = 1; - - this.bufferMultiSprite(group, multiSprite, count, offset); - - // Draw render group immediately. - this.dispatch(); - }, - - drawSpriteImmediate : function drawSpriteImmediateFn(sprite) - { - var group = this.drawGroups[0]; - group.textures[0] = sprite._texture || this.defaultTexture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups = 1; - - sprite._update(this.spriteAngleFactor); - this._bufferSprite(group, sprite.data); - - // Draw render group immediately. - this.dispatch(); - }, - - drawImmediate : function drawImmediateFn(params) - { - var texture = params.texture || this.defaultTexture; - var destRect = params.destinationRectangle; - var srcRect = params.sourceRectangle; - var color = params.color; - var rotation = params.rotation; - - var group = this.drawGroups[0]; - group.textures[0] = texture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups = 1; - - var drawSprite = this.drawSprite; - Draw2DSpriteData.setFromRotatedRectangle(drawSprite, texture, destRect, srcRect, color, rotation, params.origin); - this._bufferSprite(group, drawSprite); - - // Draw render group immediately. - this.dispatch(); - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - drawRawDeferred : function drawRawDeferredFn(texture, multiSprite, count, offset) - { - texture = texture || this.defaultTexture; - var group = this.drawGroups[0]; - this.numGroups = 1; - // If present group draw list uses a different texture - // We must start a new draw list. - var numSets = group.numSets; - if (numSets === 0 || group.textures[numSets - 1] !== texture) - { - group.textures[numSets] = texture; - group.indices[numSets] = 0; - group.numSets += 1; - } - - this.bufferMultiSprite(group, multiSprite, count, offset); - }, - - drawSpriteDeferred : function drawSpriteDeferredFn(sprite) - { - var texture = sprite._texture || this.defaultTexture; - - var group = this.drawGroups[0]; - this.numGroups = 1; - // If present group draw list uses a different texture - // We must start a new draw list. - var numSets = group.numSets; - if (numSets === 0 || group.textures[numSets - 1] !== texture) - { - group.textures[numSets] = texture; - group.indices[numSets] = 0; - group.numSets += 1; - } - - sprite._update(this.spriteAngleFactor); - this._bufferSprite(group, sprite.data); - }, - - drawDeferred : function drawDeferredFn(params) - { - var texture = params.texture || this.defaultTexture; - - var group = this.drawGroups[0]; - this.numGroups = 1; - // If present group draw list uses a different texture - // We must start a new draw list. - var numSets = group.numSets; - if (numSets === 0 || group.textures[numSets - 1] !== texture) - { - group.textures[numSets] = texture; - group.indices[numSets] = 0; - group.numSets += 1; - } - - var destRect = params.destinationRectangle; - var srcRect = params.sourceRectangle; - var color = params.color; - var rotation = params.rotation; - - var drawSprite = this.drawSprite; - Draw2DSpriteData.setFromRotatedRectangle(drawSprite, texture, destRect, srcRect, color, rotation, params.origin); - - this._bufferSprite(group, drawSprite); - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - drawRawTextured : function drawRawTexturedFn(texture, multiSprite, count, offset) - { - texture = texture || this.defaultTexture; - var group; - // If last call to drawTextured used the same texture, then we need not look up render group. - if (this.currentTextureGroup !== undefined && this.currentTextureGroup.textures[0] === texture) - { - group = this.currentTextureGroup; - } - else - { - // Look up render group in texLists. - var name = texture.name; - var texLists = this.texLists; - group = texLists[name]; - if (!group) - { - // Create new render group. - group = this.drawGroups[this.numGroups]; - if (!group) - { - group = Draw2DGroup.create(); - } - this.drawGroups[this.numGroups] = texLists[name] = group; - group.textures[0] = texture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups += 1; - } - this.currentTextureGroup = group; - } - - this.bufferMultiSprite(group, multiSprite, count, offset); - }, - - drawSpriteTextured : function drawSpriteTexturedFn(sprite) - { - var texture = sprite._texture || this.defaultTexture; - - var group; - // If last call to drawTextured used the same texture, then we need not look up render group. - if (this.currentTextureGroup !== undefined && this.currentTextureGroup.textures[0] === texture) - { - group = this.currentTextureGroup; - } - else - { - // Look up render group in texLists. - var name = texture.name; - var texLists = this.texLists; - group = texLists[name]; - if (!group) - { - // Create new render group. - group = this.drawGroups[this.numGroups]; - if (!group) - { - group = Draw2DGroup.create(); - } - this.drawGroups[this.numGroups] = texLists[name] = group; - group.textures[0] = texture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups += 1; - } - this.currentTextureGroup = group; - } - - sprite._update(this.spriteAngleFactor); - this._bufferSprite(group, sprite.data); - }, - - drawTextured : function drawTexturedFn(params) - { - var texture = params.texture || this.defaultTexture; - - var group; - // If last call to drawTextured used the same texture, then we need not look up render group. - if (this.currentTextureGroup !== undefined && this.currentTextureGroup.textures[0] === texture) - { - group = this.currentTextureGroup; - } - else - { - // Look up render group in texLists. - var name = texture.name; - var texLists = this.texLists; - group = texLists[name]; - if (!group) - { - // Create new render group. - group = this.drawGroups[this.numGroups]; - if (!group) - { - group = Draw2DGroup.create(); - } - this.drawGroups[this.numGroups] = texLists[name] = group; - group.textures[0] = texture; - group.indices[0] = 0; - group.numSets = 1; - this.numGroups += 1; - } - this.currentTextureGroup = group; - } - - var destRect = params.destinationRectangle; - var srcRect = params.sourceRectangle; - var color = params.color; - var rotation = params.rotation; - - var drawSprite = this.drawSprite; - Draw2DSpriteData.setFromRotatedRectangle(drawSprite, texture, destRect, srcRect, color, rotation, params.origin); - - this._bufferSprite(group, drawSprite); - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - prepareSortMode : function refreshSortModeFn(sortMode) - { - if (sortMode === 'deferred') - { - this.draw = this.drawDeferred; - this.drawSprite = this.drawSpriteDeferred; - this.drawRaw = this.drawRawDeferred; - } - else if (sortMode === 'immediate') - { - this.draw = this.drawImmediate; - this.drawSprite = this.drawSpriteImmediate; - this.drawRaw = this.drawRawImmediate; - } - else - { - this.draw = this.drawTextured; - this.drawSprite = this.drawSpriteTextured; - this.drawRaw = this.drawRawTextured; - } - }, - - /////////////////////////////////////////////////////////////////////////////////////////////// - - end: function endFn() - { - if (this.state !== this.drawStates.draw) - { - return false; - } - - //dispatch objects to the graphics card - if (this.dispatch()) - { - this.clearBatch(); - } - - if (this.blendModeStack.length !== 0) - { - this.blendMode = this.blendModeStack.pop(); - this.sortMode = this.sortModeStack.pop(); - this.prepareSortMode(this.sortMode); - this.graphicsDevice.setTechnique(this.blendModeTechniques[this.blendMode]); - } - else - { - this.blendMode = undefined; - this.sortMode = undefined; - this.state = this.drawStates.ready; - } - - return true; - }, - - dispatch: function dispatchFn() - { - // Nothing to dispatch. - var numGroups = this.numGroups; - if (numGroups === 0) - { - return false; - } - - var graphicsDevice = this.graphicsDevice; - var techniqueParameters = this.techniqueParameters; - graphicsDevice.setIndexBuffer(this.indexBuffer); - - var drawGroups = this.drawGroups; - var renderTargetUsed = false; - if (this.currentRenderTarget) - { - renderTargetUsed = graphicsDevice.beginRenderTarget(this.currentRenderTarget.renderTarget); - } - - var performanceData = this.performanceData; - - var i; - for (i = 0; i < numGroups; i += 1) - { - var group = drawGroups[i]; - - var textures = group.textures; - var indices = group.indices; - var setIndex = 0; - - var vindex = 0; - var vlimit = group.numVertices; - while (vindex < vlimit) - { - // number of vertices remaining. - var vcount = vlimit - vindex; - if (vcount > this.maxVertices) - { - vcount = this.maxVertices; - } - - // Upload group vertex sub-buffer to graphics device. - this.uploadBuffer(group, vcount, vindex); - graphicsDevice.setStream(this.vertexBuffer, this.semantics); - - // sprite uses 4 vertices, and 6 indices - // so for 'vcount' number of vertices, we have vcount * 1.5 indices - var ilimit = vcount * 1.5; - var iindex = 0; - while (iindex < ilimit) { - techniqueParameters.texture = textures[setIndex]; - - // number of indices remaining to render. - var icount = ilimit - iindex; - if (icount >= indices[setIndex]) - { - // finish rendering sub list. - icount = indices[setIndex]; - setIndex += 1; - } - else - { - // sub list still has remaining indices to render. - indices[setIndex] -= icount; - } - - var batchSize = icount / 6; - if (performanceData.batchCount === 0) - { - performanceData.minBatchSize = batchSize; - performanceData.maxBatchSize = batchSize; - performanceData.avgBatchSize = batchSize; - performanceData.batchCount = 1; - } - else - { - if (batchSize < performanceData.minBatchSize) - { - performanceData.minBatchSize = batchSize; - } - if (batchSize > performanceData.maxBatchSize) - { - performanceData.maxBatchSize = batchSize; - } - performanceData.avgBatchSize *= performanceData.batchCount; - performanceData.avgBatchSize += batchSize; - performanceData.batchCount += 1; - performanceData.avgBatchSize /= performanceData.batchCount; - } - - graphicsDevice.setTechniqueParameters(techniqueParameters); - graphicsDevice.drawIndexed(graphicsDevice.PRIMITIVE_TRIANGLES, icount, iindex); - - iindex += icount; - } - - vindex += vcount; - } - - group.numSets = 0; - group.numVertices = 0; - } - - if (this.currentRenderTarget && renderTargetUsed) - { - graphicsDevice.endRenderTarget(); - } - - return true; - }, - - bufferSizeAlgorithm : function bufferSizeAlgorithmFn(target, stride) - { - // scale factor of 2 is asymtopically optimal in terms of number of resizes - // performed and copies performed, but we want to try and conserve memory - // and so choose a less optimal 1.25 so that buffer will never be too much - // larger than necessary. - var factor = 1.25; - - // We size buffer to the next power of the factor which is >= target - var logf = Math.ceil(Math.log(target) / Math.log(factor)); - var size = Math.floor(Math.pow(factor, logf)); - - // Additionally ensure that we always take a multiple of of the stride - // to avoid wasted bytes that could never be used. - return (stride * Math.ceil(size / stride)); - }, - - updateRenderTargetVbo : function updateRenderTargetVboFn(viewX, viewY, viewWidth, viewHeight) - { - var graphicsDevice = this.graphicsDevice; - var halfGraphicsDeviceWidth = 0.5 * graphicsDevice.width; - var halfGraphicsDeviceHeight = 0.5 * graphicsDevice.height; - - // - // Update the VBO for the presentRenderTarget - // - var vertexBuffer = this.copyVertexBuffer; - - var left = (viewX - halfGraphicsDeviceWidth) / halfGraphicsDeviceWidth; - var right = (viewX + viewWidth - halfGraphicsDeviceWidth) / halfGraphicsDeviceWidth; - var topv = (viewY - halfGraphicsDeviceHeight) / halfGraphicsDeviceHeight; - var bottom = (viewY + viewHeight - halfGraphicsDeviceHeight) / halfGraphicsDeviceHeight; - - var vertexData = this.vertexBufferData; - vertexData[0] = left; - vertexData[1] = bottom; - vertexData[2] = 0.0; - vertexData[3] = 1.0; - - vertexData[4] = left; - vertexData[5] = topv; - vertexData[6] = 0.0; - vertexData[7] = 0.0; - - vertexData[8] = right; - vertexData[9] = bottom; - vertexData[10] = 1.0; - vertexData[11] = 1.0; - - vertexData[12] = right; - vertexData[13] = topv; - vertexData[14] = 1.0; - vertexData[15] = 0.0; - - vertexBuffer.setData(vertexData, 0, 4); - }, - - // always overallocate. - /*jshint bitwise: false*/ - makePow2 : function makePow2Fn(dim) - { - var index = Math.log(dim) / Math.log(2); - return (1 << Math.ceil(index)); - }, - /*jshint bitwise: true*/ - - createRenderTarget : function createRenderTargetFn(params) - { - var gd = this.graphicsDevice; - var renderTargets = this.renderTargetStructs; - var index = renderTargets.length; - - var name = (params && params.name) ? params.name : ("RenderTarget#" + index); - var backBuffer = (params && params.backBuffer !== undefined) ? params.backBuffer : true; - var matchScreen = (params.width === undefined || params.height === undefined); - - var texParams = this.renderTargetTextureParameters; - texParams.name = name; - - var width = (matchScreen) ? gd.width : params.width; - var height = (matchScreen) ? gd.height : params.height; - texParams.width = this.makePow2(width); - texParams.height = this.makePow2(height); - - var texture = gd.createTexture(texParams); - var targetParams = this.renderTargetParams; - targetParams.colorTexture0 = texture; - var renderTarget = gd.createRenderTarget(targetParams); - - renderTargets.push({ - managed : matchScreen, - renderTarget : renderTarget, - texture : texture, - backBuffer : backBuffer, - actualWidth : (backBuffer ? width : texture.width), - actualHeight : (backBuffer ? height : texture.height) - }); - - return index; - }, - - validateTarget : function validateTargetFn(target, viewWidth, viewHeight) - { - if (target.managed) - { - var tex = target.texture; - if (target.backBuffer) - { - target.actualWidth = viewWidth; - target.actualHeight = viewHeight; - } - viewWidth = this.makePow2(viewWidth); - viewHeight = this.makePow2(viewHeight); - if (!target.backBuffer) - { - target.actualWidth = viewWidth; - target.actualHeight = viewHeight; - } - if (tex.width !== viewWidth || tex.height !== viewHeight) - { - var texParams = this.renderTargetTextureParameters; - var targetParams = this.renderTargetParams; - - texParams.name = tex.name; - texParams.width = viewWidth; - texParams.height = viewHeight; - - tex.destroy(); - target.renderTarget.destroy(); - - var graphicsDevice = this.graphicsDevice; - target.texture = graphicsDevice.createTexture(texParams); - targetParams.colorTexture0 = target.texture; - target.renderTarget = graphicsDevice.createRenderTarget(targetParams); - } - } - }, - - setBackBuffer : function setBackBufferFn() - { - if (this.state !== this.drawStates.ready) - { - return false; - } - - this.currentRenderTarget = null; - this.forceUpdate = true; - - return true; - }, - - getRenderTargetTexture : function getRenderTargetTextureFn(renderTargetIndex) - { - var renderTargets = this.renderTargetStructs; - if (renderTargetIndex < 0 || renderTargetIndex >= renderTargets.length) - { - return null; - } - - return renderTargets[renderTargetIndex].texture; - }, - - getRenderTarget : function getRenderTargetFn(renderTargetIndex) - { - var renderTargets = this.renderTargetStructs; - if (renderTargetIndex < 0 || renderTargetIndex >= renderTargets.length) - { - return null; - } - - return renderTargets[renderTargetIndex].renderTarget; - }, - - setRenderTarget : function setRenderTargetFn(renderTargetIndex) - { - var renderTargets = this.renderTargetStructs; - if (renderTargetIndex < 0 || renderTargetIndex >= renderTargets.length) - { - return false; - } - - if (this.state !== this.drawStates.ready) - { - return false; - } - - this.currentRenderTarget = renderTargets[renderTargetIndex]; - this.forceUpdate = true; - - return true; - }, - - copyRenderTarget: function copyRenderTargetFn(renderTargetIndex) - { - if (this.state !== this.drawStates.ready) - { - return false; - } - - var renderTargets = this.renderTargetStructs; - if (renderTargetIndex < 0 || renderTargetIndex >= renderTargets.length) - { - return false; - } - - // Check the buffers are correct before we render. - this.update(); - - if (!this.currentRenderTarget) - { - this.graphicsDevice.setScissor(this.scissorX, this.scissorY, this.scissorWidth, this.scissorHeight); - } - - var graphicsDevice = this.graphicsDevice; - var target = renderTargets[renderTargetIndex]; - var tex = target.texture; - - var technique = this.copyTechnique; - var params = this.copyTechniqueParameters; - var copyUVScale = params.copyUVScale; - copyUVScale[0] = target.actualWidth / tex.width; - copyUVScale[1] = target.actualHeight / tex.height; - params.copyFlip = (!this.currentRenderTarget ? -1.0 : 1.0); - params.inputTexture0 = tex; - - var renderTargetUsed = false; - var currentTarget = this.currentRenderTarget; - var vbo = this.copyVertexBuffer; - if (currentTarget) - { - renderTargetUsed = graphicsDevice.beginRenderTarget(currentTarget.renderTarget); - } - - graphicsDevice.setTechnique(technique); - graphicsDevice.setTechniqueParameters(params); - - graphicsDevice.setStream(vbo, this.quadSemantics); - graphicsDevice.draw(this.quadPrimitive, 4, 0); - - if (currentTarget && renderTargetUsed) - { - graphicsDevice.endRenderTarget(); - } - - return true; - }, - - resetPerformanceData : function resetPerformanceDataFn() - { - var data = this.performanceData; - data.minBatchSize = data.maxBatchSize = data.avgBatchSize = undefined; - data.batchCount = 0; - data.dataTransfers = 0; - } -}; - -// Constructor function -// -// params : { -// graphicsDevice : gd, -// blendModes : { // optional -// name : Technique, -// **repeated** -// } -// } -Draw2D.create = function draw2DCreateFn(params) -{ - var o = new Draw2D(); - var gd = o.graphicsDevice = params.graphicsDevice; - - // Current sort and blend mode. - o.sortMode = undefined; - o.blendMode = undefined; - // Disjoint stack of modes for nested begins. - o.sortModeStack = []; - o.blendModeStack = []; - - // Set of render groups to be dispatched. - o.drawGroups = [Draw2DGroup.create()]; - o.numGroups = 0; - - // Set of render groups for texture sort mode. - // dictionary on texture name. - o.texLists = []; - // Cached reference to last retrieved group to accelerate - // texture sort mode draw calls. - o.texGroup = undefined; - - // Sprite data instance used for rectangle draw calls. - o.drawSprite = Draw2DSpriteData.create(); - - // Solid fill texture for draw calls that do not specify a texture. - o.defaultTexture = gd.createTexture({ - name : "DefaultDraw2DTexture", - width : 1, - height : 1, - depth : 1, - format : "L8", - cubemap : false, - mipmaps : true, - renderable : false, - dynamic : false, - data : [0xff] - }); - - // Draw call methods. - // These are set based on current sort mode. - o.draw = undefined; - o.drawSprite = undefined; - o.drawRaw = undefined; - - // Load embedded default shader and techniques - /*jshint white: false*/ - var shader = gd.createShader( -{ - "version": 1, - "name": "draw2D.cgfx", - "samplers": - { - "texture": - { - "MinFilter": 9985, - "MagFilter": 9729, - "WrapS": 33071, - "WrapT": 33071 - }, - "inputTexture0": - { - "MinFilter": 9728, - "MagFilter": 9729, - "WrapS": 33071, - "WrapT": 33071 - } - }, - "parameters": - { - "clipSpace": - { - "type": "float", - "columns": 4 - }, - "copyUVScale": - { - "type": "float", - "columns": 2 - }, - "copyFlip": - { - "type": "float" - }, - "texture": - { - "type": "sampler2D" - }, - "inputTexture0": - { - "type": "sampler2D" - } - }, - "techniques": - { - "opaque": - [ - { - "parameters": ["clipSpace","texture"], - "semantics": ["POSITION","COLOR","TEXCOORD0"], - "states": - { - "DepthTestEnable": false, - "DepthMask": false, - "CullFaceEnable": false, - "BlendEnable": false - }, - "programs": ["vp_draw2D","fp_draw2D"] - } - ], - "alpha": - [ - { - "parameters": ["clipSpace","texture"], - "semantics": ["POSITION","COLOR","TEXCOORD0"], - "states": - { - "DepthTestEnable": false, - "DepthMask": false, - "CullFaceEnable": false, - "BlendEnable": true, - "BlendFunc": [770,771] - }, - "programs": ["vp_draw2D","fp_draw2D"] - } - ], - "additive": - [ - { - "parameters": ["clipSpace","texture"], - "semantics": ["POSITION","COLOR","TEXCOORD0"], - "states": - { - "DepthTestEnable": false, - "DepthMask": false, - "CullFaceEnable": false, - "BlendEnable": true, - "BlendFunc": [770,1] - }, - "programs": ["vp_draw2D","fp_draw2D"] - } - ], - "copy": - [ - { - "parameters": ["copyUVScale","copyFlip","inputTexture0"], - "semantics": ["POSITION","TEXCOORD0"], - "states": - { - "DepthTestEnable": false, - "DepthMask": false, - "CullFaceEnable": false, - "BlendEnable": false - }, - "programs": ["vp_copy","fp_copy"] - } - ] - }, - "programs": - { - "fp_copy": - { - "type": "fragment", - "code": "#ifdef GL_ES\n#define TZ_LOWP lowp\nprecision mediump float;\nprecision mediump int;\n#else\n#define TZ_LOWP\n#endif\nvarying vec4 tz_TexCoord[8];\nvec4 _ret_0;uniform sampler2D inputTexture0;void main()\n{_ret_0=texture2D(inputTexture0,tz_TexCoord[0].xy);gl_FragColor=_ret_0;}" - }, - "vp_copy": - { - "type": "vertex", - "code": "#ifdef GL_ES\n#define TZ_LOWP lowp\nprecision mediump float;\nprecision mediump int;\n#else\n#define TZ_LOWP\n#endif\nvarying vec4 tz_TexCoord[8];attribute vec4 ATTR8;attribute vec4 ATTR0;\nvec4 _OutPosition1;vec2 _OutUV1;uniform vec2 copyUVScale;uniform float copyFlip;void main()\n{_OutPosition1.x=ATTR0.x;_OutPosition1.y=ATTR0.y*copyFlip;_OutPosition1.zw=ATTR0.zw;_OutUV1=ATTR8.xy*copyUVScale;tz_TexCoord[0].xy=_OutUV1;gl_Position=_OutPosition1;}" - }, - "fp_draw2D": - { - "type": "fragment", - "code": "#ifdef GL_ES\n#define TZ_LOWP lowp\nprecision mediump float;\nprecision mediump int;\n#else\n#define TZ_LOWP\n#endif\nvarying TZ_LOWP vec4 tz_Color;varying vec4 tz_TexCoord[8];\nvec4 _ret_0;vec4 _TMP0;uniform sampler2D texture;void main()\n{_TMP0=texture2D(texture,tz_TexCoord[0].xy);_ret_0=tz_Color*_TMP0;gl_FragColor=_ret_0;}" - }, - "vp_draw2D": - { - "type": "vertex", - "code": "#ifdef GL_ES\n#define TZ_LOWP lowp\nprecision mediump float;\nprecision mediump int;\n#else\n#define TZ_LOWP\n#endif\nvarying TZ_LOWP vec4 tz_Color;varying vec4 tz_TexCoord[8];attribute vec4 ATTR8;attribute vec4 ATTR3;attribute vec4 ATTR0;\nvec4 _OUTPosition1;vec4 _OUTColor1;vec2 _OUTTexCoord01;uniform vec4 clipSpace;void main()\n{vec2 _position;_position=ATTR0.xy*clipSpace.xy+clipSpace.zw;_OUTPosition1.x=_position.x;_OUTPosition1.y=_position.y;_OUTPosition1.z=0.0;_OUTPosition1.w=1.0;_OUTColor1=ATTR3;_OUTTexCoord01=ATTR8.xy;tz_TexCoord[0].xy=ATTR8.xy;tz_Color=ATTR3;gl_Position=_OUTPosition1;}" - } - } -} - ); - /*jshint white: true*/ - - // supported blend modes. - o.blend = { - additive : 'additive', - alpha : 'alpha', - opaque : 'opaque' - }, - - // Mapping from blend mode name to Technique object. - o.blendModeTechniques = {}; - o.blendModeTechniques.additive = shader.getTechnique("additive"); - o.blendModeTechniques.alpha = shader.getTechnique("alpha"); - o.blendModeTechniques.opaque = shader.getTechnique("opaque"); - - // Append techniques and supported blend modes with user supplied techniques. - if (params.blendModes) - { - for (var name in params.blendModes) - { - if (params.blendModes.hasOwnProperty(name)) - { - o.blend[name] = name; - o.blendModeTechniques[name] = params.blendModes[name]; - } - } - } - - // Blending techniques. - o.techniqueParameters = gd.createTechniqueParameters({ - clipSpace: new Draw2D.prototype.floatArray(4), - texture: null - }); - - // Current render target - o.currentRenderTarget = null; - o.renderTargetStructs = []; - - o.state = o.drawStates.ready; - - o.scaleMode = 'none'; - o.blendMode = 'opaque'; - - // View port, back buffer and managed render target values. - o.width = 0; - o.height = 0; - - o.scissorX = 0; - o.scissorY = 0; - o.scissorWidth = o.graphicsDevice.width; - o.scissorHeight = o.graphicsDevice.height; - - o.clipOffsetX = -1.0; - o.clipOffsetY = 1; - o.clipScaleX = 2.0 / o.graphicsDevice.width; - o.clipScaleY = -2.0 / o.graphicsDevice.height; - - o.viewScaleX = 1; - o.viewScaleY = 1; - - // GPU Memory. - // ----------- - - var initial = (params.initialGpuMemory ? params.initialGpuMemory : 0); - if (initial < 140) - { - // 140 = minimum that can be used to draw a single sprite. - initial = 140; - } - if (initial > 2293760) - { - // 2293760 = maximum that can ever be used in 16bit indices. - initial = 2293760; - } - - o.performanceData = { - gpuMemoryUsage : initial, - minBatchSize : 0, - maxBatchSize : 0, - avgBatchSize : 0, - batchCount : 0, - dataTransfers : 0 - }; - - o.maxGpuMemory = (params.maxGpuMemory ? params.maxGpuMemory : 2293760); - if (o.maxGpuMemory < initial) - { - o.maxGpuMemory = initial; - } - - var initialVertices = Math.floor(initial / 140) * 4; - o.maxVertices = Math.floor(o.maxGpuMemory / 140) * 4; - if (o.maxVertices > 65536) - { - o.maxVertices = 65536; - } - - // number of bytes used per-sprite on cpu vertex buffers. - o.cpuStride = 64; - - // vertex buffer is in terms of number of vertices. - // so we have a stride of 4 rather than 128. - o.gpuStride = 4; - - // Index and vertex buffer setup. - o.vertexBufferParameters = { - numVertices: initialVertices, - attributes: [gd.VERTEXFORMAT_FLOAT2, gd.VERTEXFORMAT_FLOAT4, gd.VERTEXFORMAT_FLOAT2], - 'transient': true - }; - o.vertexBuffer = gd.createVertexBuffer(o.vertexBufferParameters); - - o.semantics = gd.createSemantics([gd.SEMANTIC_POSITION, gd.SEMANTIC_COLOR, gd.SEMANTIC_TEXCOORD0]); - o.indexBufferParameters = { - numIndices: (initialVertices * 1.5), - format: gd.INDEXFORMAT_USHORT, - dynamic: false, - data : o.indexData((initialVertices * 1.5)) - }; - o.indexBuffer = gd.createIndexBuffer(o.indexBufferParameters); - - // Render Target API - // ----------------- - - // Objects and values used in render target management. - o.renderTargetIndex = 0; - o.renderTargetCount = 0; - - o.renderTargetTextureParameters = { - name : '', - width : 0, - height : 0, - depth : 1, - format : "R8G8B8A8", - cubemap : false, - mipmaps : true, - renderable : true, - dynamic : true - }; - - o.renderTargetParams = { - colorTexture0 : null - }; - - // Render Target copying. - // ---------------------- - - // Copy technique for copyRenderTarget - o.copyTechnique = shader.getTechnique("copy"); - o.copyTechniqueParameters = gd.createTechniqueParameters({ - inputTexture0 : null, - copyFlip : 1, - copyUVScale : new Draw2D.prototype.floatArray([1, 1]) - }); - - // Objects used in copyRenderTarget method. - o.quadSemantics = gd.createSemantics([gd.SEMANTIC_POSITION, gd.SEMANTIC_TEXCOORD0]); - o.quadPrimitive = gd.PRIMITIVE_TRIANGLE_STRIP; - - o.copyVertexBufferParams = { - numVertices: 4, - attributes: [gd.VERTEXFORMAT_FLOAT2, gd.VERTEXFORMAT_FLOAT2], - 'transient': true - }; - o.copyVertexBuffer = gd.createVertexBuffer(o.copyVertexBufferParams); - - // updateRenderTargetVBO - // --------------------- - - /*jshint white: false*/ - o.vertexBufferData = new Draw2D.prototype.floatArray([-1.0, -1.0, 0.0, 0.0, - 1.0, -1.0, 1.0, 0.0, - -1.0, 1.0, 0.0, 1.0, - 1.0, 1.0, 1.0, 1.0]); - /*jshint white: true*/ - - return o; -}; - -// Detect correct typed arrays -(function () { - Draw2D.prototype.uint16Array = function (arg) { - if (arguments.length === 0) - { - return []; - } - - var i, ret; - if (typeof arg === "number") - { - ret = new Array(arg); - } - else - { - ret = []; - for (i = 0; i < arg.length; i += 1) - { - ret[i] = arg[i]; - } - } - return ret; - }; - - var testArray; - var textDescriptor; - - if (typeof Uint16Array !== "undefined") - { - testArray = new Uint16Array(4); - textDescriptor = Object.prototype.toString.call(testArray); - if (textDescriptor === '[object Uint16Array]') - { - Draw2D.prototype.uint16Array = Uint16Array; - } - } - - Draw2D.prototype.floatArray = function (arg) { - if (arguments.length === 0) - { - return []; - } - - var i, ret; - if (typeof arg === "number") - { - ret = new Array(arg); - } - else - { - ret = []; - for (i = 0; i < arg.length; i += 1) - { - ret[i] = arg[i]; - } - } - return ret; - }; - - if (typeof Float32Array !== "undefined") - { - testArray = new Float32Array(4); - textDescriptor = Object.prototype.toString.call(testArray); - if (textDescriptor === '[object Float32Array]') - { - Draw2D.prototype.floatArray = Float32Array; - Draw2D.prototype.defaultClearColor = new Float32Array(Draw2D.prototype.defaultClearColor); - } - } -}()); diff --git a/spine-turbulenz/turbulenz/graphicsdevice.js b/spine-turbulenz/turbulenz/graphicsdevice.js deleted file mode 100644 index 43d8470ae..000000000 --- a/spine-turbulenz/turbulenz/graphicsdevice.js +++ /dev/null @@ -1,6208 +0,0 @@ -// Copyright (c) 2011-2012 Turbulenz Limited -/*global TurbulenzEngine*/ -/*global TGALoader*/ -/*global DDSLoader*/ -/*global TARLoader*/ -/*global Int8Array*/ -/*global Int16Array*/ -/*global Int32Array*/ -/*global Uint8Array*/ -/*global Uint8ClampedArray*/ -/*global Uint16Array*/ -/*global Uint32Array*/ -/*global Float32Array*/ -/*global ArrayBuffer*/ -/*global DataView*/ -/*global window*/ -"use strict"; - -// -// WebGLTexture -// -function WebGLTexture() {} -WebGLTexture.prototype = -{ - version : 1, - - setData : function textureSetDataFn(data) - { - var gd = this.gd; - var target = this.target; - gd.bindTexture(target, this.glTexture); - this.updateData(data); - gd.bindTexture(target, null); - }, - - // Internal - createGLTexture : function createGLTextureFn(data) - { - var gd = this.gd; - var gl = gd.gl; - - var target; - if (this.cubemap) - { - target = gl.TEXTURE_CUBE_MAP; - } - else if (this.depth > 1) - { - //target = gl.TEXTURE_3D; - // 3D textures are not supported yet - return false; - } - else - { - target = gl.TEXTURE_2D; - } - this.target = target; - - var gltex = gl.createTexture(); - this.glTexture = gltex; - - gd.bindTexture(target, gltex); - - gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - - if (this.mipmaps || 1 < this.numDataLevels) - { - gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); - } - else - { - gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - } - - this.updateData(data); - - gd.bindTexture(target, null); - - return true; - }, - - updateData : function updateDataFn(data) - { - var gd = this.gd; - var gl = gd.gl; - - function log2(a) - { - return Math.floor(Math.log(a) / Math.log(2)); - } - - var generateMipMaps = this.mipmaps && (this.numDataLevels !== (1 + Math.max(log2(this.width), log2(this.height)))); - var format = this.format; - var internalFormat, gltype, srcStep, bufferData = null; - var compressedTexturesExtension; - - if (format === gd.PIXELFORMAT_A8) - { - internalFormat = gl.ALPHA; - gltype = gl.UNSIGNED_BYTE; - srcStep = 1; - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - bufferData = data; - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_L8) - { - internalFormat = gl.LUMINANCE; - gltype = gl.UNSIGNED_BYTE; - srcStep = 1; - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - bufferData = data; - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_L8A8) - { - internalFormat = gl.LUMINANCE_ALPHA; - gltype = gl.UNSIGNED_BYTE; - srcStep = 2; - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - bufferData = data; - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_R5G5B5A1) - { - internalFormat = gl.RGBA; - gltype = gl.UNSIGNED_SHORT_5_5_5_1; - srcStep = 1; - if (data && !data.src) - { - if (data instanceof Uint16Array) - { - bufferData = data; - } - else - { - bufferData = new Uint16Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_R5G6B5) - { - internalFormat = gl.RGB; - gltype = gl.UNSIGNED_SHORT_5_6_5; - srcStep = 1; - if (data && !data.src) - { - if (data instanceof Uint16Array) - { - bufferData = data; - } - else - { - bufferData = new Uint16Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_R8G8B8A8) - { - internalFormat = gl.RGBA; - gltype = gl.UNSIGNED_BYTE; - srcStep = 4; - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - // Some browsers consider Uint8ClampedArray to be - // an instance of Uint8Array (which is correct as - // per the spec), yet won't accept a - // Uint8ClampedArray as pixel data for a - // gl.UNSIGNED_BYTE Texture. If we have a - // Uint8ClampedArray then we can just reuse the - // underlying data. - - if (typeof Uint8ClampedArray !== "undefined" && - data instanceof Uint8ClampedArray) - { - bufferData = new Uint8Array(data.buffer); - } - else - { - bufferData = data; - } - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_R8G8B8) - { - internalFormat = gl.RGB; - gltype = gl.UNSIGNED_BYTE; - srcStep = 3; - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - // See comment above about Uint8ClampedArray - - if (typeof Uint8ClampedArray !== "undefined" && - data instanceof Uint8ClampedArray) - { - bufferData = new Uint8Array(data.buffer); - } - else - { - bufferData = data; - } - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else if (format === gd.PIXELFORMAT_D24S8) - { - //internalFormat = gl.DEPTH24_STENCIL8_EXT; - //gltype = gl.UNSIGNED_INT_24_8_EXT; - //internalFormat = gl.DEPTH_COMPONENT; - internalFormat = gl.DEPTH_STENCIL; - gltype = gl.UNSIGNED_INT; - srcStep = 1; - if (data && !data.src) - { - bufferData = new Uint32Array(data); - } - } - else if (format === gd.PIXELFORMAT_DXT1 || - format === gd.PIXELFORMAT_DXT3 || - format === gd.PIXELFORMAT_DXT5) - { - compressedTexturesExtension = gd.compressedTexturesExtension; - if (compressedTexturesExtension) - { - if (format === gd.PIXELFORMAT_DXT1) - { - internalFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT1_EXT; - srcStep = 8; - } - else if (format === gd.PIXELFORMAT_DXT3) - { - internalFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT3_EXT; - srcStep = 16; - } - else //if (format === gd.PIXELFORMAT_DXT5) - { - internalFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT5_EXT; - srcStep = 16; - } - - if (internalFormat === undefined) - { - return; // Unsupported format - } - - if (data && !data.src) - { - if (data instanceof Uint8Array) - { - bufferData = data; - } - else - { - bufferData = new Uint8Array(data); - } - } - } - else - { - return; // Unsupported format - } - } - else - { - return; //unknown/unsupported format - } - - var numLevels = (data && 0 < this.numDataLevels ? this.numDataLevels : 1); - var w = this.width, h = this.height, offset = 0, target, n, levelSize, levelData; - if (this.cubemap) - { - target = gl.TEXTURE_CUBE_MAP; - gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - - for (var f = 0; f < 6; f += 1) - { - var faceTarget = (gl.TEXTURE_CUBE_MAP_POSITIVE_X + f); - for (n = 0; n < numLevels; n += 1) - { - if (compressedTexturesExtension) - { - levelSize = (Math.floor((w + 3) / 4) * Math.floor((h + 3) / 4) * srcStep); - if (bufferData) - { - if (numLevels === 1) - { - levelData = bufferData; - } - else - { - levelData = bufferData.subarray(offset, (offset + levelSize)); - } - } - else - { - levelData = new Uint8Array(levelSize); - } - if (gd.WEBGL_compressed_texture_s3tc) - { - gl.compressedTexImage2D(faceTarget, n, internalFormat, w, h, 0, - levelData); - } - else - { - compressedTexturesExtension.compressedTexImage2D(faceTarget, n, internalFormat, w, h, 0, - levelData); - } - } - else - { - levelSize = (w * h * srcStep); - if (bufferData) - { - if (numLevels === 1) - { - levelData = bufferData; - } - else - { - levelData = bufferData.subarray(offset, (offset + levelSize)); - } - gl.texImage2D(faceTarget, n, internalFormat, w, h, 0, internalFormat, gltype, levelData); - } - else if (data) - { - gl.texImage2D(faceTarget, n, internalFormat, internalFormat, gltype, data); - } - else - { - gl.texImage2D(faceTarget, n, internalFormat, w, h, 0, internalFormat, gltype, - new Uint8Array(levelSize)); - } - } - offset += levelSize; - w = (w > 1 ? Math.floor(w / 2) : 1); - h = (h > 1 ? Math.floor(h / 2) : 1); - } - w = this.width; - h = this.height; - } - } - else - { - target = gl.TEXTURE_2D; - gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - - for (n = 0; n < numLevels; n += 1) - { - if (compressedTexturesExtension) - { - levelSize = (Math.floor((w + 3) / 4) * Math.floor((h + 3) / 4) * srcStep); - if (bufferData) - { - if (numLevels === 1) - { - levelData = bufferData; - } - else - { - levelData = bufferData.subarray(offset, (offset + levelSize)); - } - } - else - { - levelData = new Uint8Array(levelSize); - } - if (gd.WEBGL_compressed_texture_s3tc) - { - gl.compressedTexImage2D(target, n, internalFormat, w, h, 0, levelData); - } - else - { - compressedTexturesExtension.compressedTexImage2D(target, n, internalFormat, w, h, 0, levelData); - } - } - else - { - levelSize = (w * h * srcStep); - if (bufferData) - { - if (numLevels === 1) - { - levelData = bufferData; - } - else - { - levelData = bufferData.subarray(offset, (offset + levelSize)); - } - gl.texImage2D(target, n, internalFormat, w, h, 0, internalFormat, gltype, levelData); - } - else if (data) - { - gl.texImage2D(target, n, internalFormat, internalFormat, gltype, data); - } - else - { - gl.texImage2D(target, n, internalFormat, w, h, 0, internalFormat, gltype, - new Uint8Array(levelSize)); - } - } - offset += levelSize; - w = (w > 1 ? Math.floor(w / 2) : 1); - h = (h > 1 ? Math.floor(h / 2) : 1); - } - } - - if (generateMipMaps) - { - gl.generateMipmap(target); - } - }, - - updateMipmaps : function updateMipmapsFn(face) - { - if (this.mipmaps) - { - if (this.depth > 1) - { - TurbulenzEngine.callOnError( - "3D texture mipmap generation unsupported"); - return; - } - - if (this.cubemap && face !== 5) - { - return; - } - - var gd = this.gd; - var gl = gd.gl; - - var target = this.target; - gd.bindTexture(target, this.glTexture); - gl.generateMipmap(target); - gd.bindTexture(target, null); - } - }, - - destroy : function textureDestroyFn() - { - var gd = this.gd; - if (gd) - { - var glTexture = this.glTexture; - if (glTexture) - { - var gl = gd.gl; - if (gl) - { - gd.unbindTexture(glTexture); - gl.deleteTexture(glTexture); - } - delete this.glTexture; - } - - delete this.sampler; - delete this.gd; - } - }, - - typedArrayIsValid : function textureTypedArrayIsValidFn(typedArray) - { - var gd = this.gd; - var format = this.format; - - if (gd) - { - if ((format === gd.PIXELFORMAT_A8) || - (format === gd.PIXELFORMAT_L8) || - (format === gd.PIXELFORMAT_S8)) - { - return ((typedArray instanceof Uint8Array) || - (typeof Uint8ClampedArray !== "undefined" && - typedArray instanceof Uint8ClampedArray)) && - (typedArray.length === - this.width * this.height * this.depth); - } - if (format === gd.PIXELFORMAT_L8A8) - { - return ((typedArray instanceof Uint8Array) || - (typeof Uint8ClampedArray !== "undefined" && - typedArray instanceof Uint8ClampedArray)) && - (typedArray.length === - 2 * this.width * this.height * this.depth); - } - if (format === gd.PIXELFORMAT_R8G8B8) - { - return ((typedArray instanceof Uint8Array) || - (typeof Uint8ClampedArray !== "undefined" && - typedArray instanceof Uint8ClampedArray)) && - (typedArray.length === - 3 * this.width * this.height * this.depth); - } - if (format === gd.PIXELFORMAT_R8G8B8A8) - { - return ((typedArray instanceof Uint8Array) || - (typeof Uint8ClampedArray !== "undefined" && - typedArray instanceof Uint8ClampedArray)) && - (typedArray.length === - 4 * this.width * this.height * this.depth); - } - if ((format === gd.PIXELFORMAT_R5G5B5A1) || - (format === gd.PIXELFORMAT_R5G6B5)) - { - return (typedArray instanceof Uint16Array) && - (typedArray.length === - this.width * this.height * this.depth); - } - } - return false; - } -}; - -// Constructor function -WebGLTexture.create = function webGLTextureCreateFn(gd, params) -{ - var tex = new WebGLTexture(); - tex.gd = gd; - tex.mipmaps = params.mipmaps; - tex.dynamic = params.dynamic; - tex.renderable = params.renderable; - tex.numDataLevels = 0; - - var src = params.src; - if (src) - { - tex.name = params.name || src; - var extension; - var data = params.data; - if (data) - { - // do not trust file extensions if we got data... - if (data[0] === 137 && - data[1] === 80 && - data[2] === 78 && - data[3] === 71) - { - extension = '.png'; - } - else if (data[0] === 255 && - data[1] === 216 && - data[2] === 255 && - (data[3] === 224 || data[3] === 225)) - { - extension = '.jpg'; - } - else if (data[0] === 68 && - data[1] === 68 && - data[2] === 83 && - data[3] === 32) - { - extension = '.dds'; - } - else - { - extension = src.slice(-4); - } - } - else - { - extension = src.slice(-4); - } - - // DDS and TGA textures require out own image loaders - if (extension === '.dds' || - extension === '.tga') - { - if (extension === '.tga' && typeof TGALoader !== 'undefined') - { - var tgaParams = { - gd: gd, - onload : function tgaLoadedFn(data, width, height, format, status) - { - tex.width = width; - tex.height = height; - tex.depth = 1; - tex.format = format; - tex.cubemap = false; - var result = tex.createGLTexture(data); - if (params.onload) - { - params.onload(result ? tex : null, status); - } - }, - onerror : function tgaFailedFn() - { - tex.failed = true; - if (params.onload) - { - params.onload(null); - } - } - }; - if (data) - { - tgaParams.data = data; - } - else - { - tgaParams.src = src; - } - TGALoader.create(tgaParams); - return tex; - } - else if (extension === '.dds' && typeof DDSLoader !== 'undefined') - { - var ddsParams = { - gd: gd, - onload : function ddsLoadedFn(data, width, height, format, numLevels, cubemap, depth, status) - { - tex.width = width; - tex.height = height; - tex.format = format; - tex.cubemap = cubemap; - tex.depth = depth; - tex.numDataLevels = numLevels; - var result = tex.createGLTexture(data); - if (params.onload) - { - params.onload(result ? tex : null, status); - } - }, - onerror : function ddsFailedFn() - { - tex.failed = true; - if (params.onload) - { - params.onload(null); - } - } - }; - if (data) - { - ddsParams.data = data; - } - else - { - ddsParams.src = src; - } - DDSLoader.create(ddsParams); - return tex; - } - else - { - TurbulenzEngine.callOnError( - 'Missing image loader required for ' + src); - - tex = webGLTextureCreateFn(gd, { - name : (params.name || src), - width : 2, - height : 2, - depth : 1, - format : 'R8G8B8A8', - cubemap : false, - mipmaps : params.mipmaps, - dynamic : params.dynamic, - renderable : params.renderable, - data : [255, 20, 147, 255, - 255, 0, 0, 255, - 255, 255, 255, 255, - 255, 20, 147, 255] - }); - - if (params.onload) - { - if (TurbulenzEngine) - { - TurbulenzEngine.setTimeout(function () { - params.onload(tex, 200); - }, 0); - } - else - { - window.setTimeout(function () { - params.onload(tex, 200); - }, 0); - } - } - return tex; - } - } - - var img = new Image(); - img.onload = function imageLoadedFn() - { - tex.width = img.width; - tex.height = img.height; - tex.depth = 1; - tex.format = gd.PIXELFORMAT_R8G8B8A8; - tex.cubemap = false; - var result = tex.createGLTexture(img); - if (params.onload) - { - params.onload(result ? tex : null, 200); - } - }; - img.onerror = function imageFailedFn() - { - tex.failed = true; - if (params.onload) - { - params.onload(null); - } - }; - if (data) - { - if (extension === '.jpg' || extension === '.jpeg') - { - src = 'data:image/jpeg;base64,' + TurbulenzEngine.base64Encode(data); - } - else if (extension === '.png') - { - src = 'data:image/png;base64,' + TurbulenzEngine.base64Encode(data); - } - } - else - { - img.crossOrigin = 'anonymous'; - } - img.src = src; - } - else - { - // Invalid src values like "" fall through to here - if ("" === src && params.onload) - { - // Assume the caller intended to pass in a valid url. - return null; - } - - var format = params.format; - if (typeof format === 'string') - { - format = gd['PIXELFORMAT_' + format]; - } - - tex.width = params.width; - tex.height = params.height; - tex.depth = params.depth; - tex.format = format; - tex.cubemap = params.cubemap; - tex.name = params.name; - - var result = tex.createGLTexture(params.data); - if (!result) - { - tex = null; - } - - if (params.onload) - { - params.onload(tex, 200); - } - } - - return tex; -}; - - -// -// WebGLRenderBuffer -// -function WebGLRenderBuffer() {} -WebGLRenderBuffer.prototype = -{ - version : 1, - - destroy : function renderBufferDestroyFn() - { - var gd = this.gd; - if (gd) - { - var glBuffer = this.glBuffer; - if (glBuffer) - { - var gl = gd.gl; - if (gl) - { - gl.deleteRenderbuffer(glBuffer); - } - delete this.glBuffer; - } - - delete this.gd; - } - } -}; - -// Constructor function -WebGLRenderBuffer.create = function webGLRenderBufferFn(gd, params) -{ - var renderBuffer = new WebGLRenderBuffer(); - - var width = params.width; - var height = params.height; - var format = params.format; - if (typeof format === 'string') - { - format = gd['PIXELFORMAT_' + format]; - } - - if (format !== gd.PIXELFORMAT_D24S8) - { - return null; - } - - var gl = gd.gl; - - var glBuffer = gl.createRenderbuffer(); - - gl.bindRenderbuffer(gl.RENDERBUFFER, glBuffer); - - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); - - renderBuffer.width = gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH); - renderBuffer.height = gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT); - - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - - if (renderBuffer.width < width || - renderBuffer.height < height) - { - gl.deleteRenderbuffer(glBuffer); - return null; - } - - renderBuffer.gd = gd; - renderBuffer.format = format; - renderBuffer.glBuffer = glBuffer; - - return renderBuffer; -}; - - -// -// WebGLRenderTarget -// -function WebGLRenderTarget() {} -WebGLRenderTarget.prototype = -{ - version : 1, - - // Shared because there can only be one active at a time - oldViewportBox : [], - oldScissorBox : [], - - copyBox : function copyBoxFn(dst, src) - { - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - dst[3] = src[3]; - }, - - bind : function bindFn() - { - var gd = this.gd; - var gl = gd.gl; - - gd.unbindTexture(this.colorTexture0.glTexture); - if (this.depthTexture) - { - gd.unbindTexture(this.depthTexture.glTexture); - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glObject); - - var state = gd.state; - this.copyBox(this.oldViewportBox, state.viewportBox); - this.copyBox(this.oldScissorBox, state.scissorBox); - gd.setViewport(0, 0, this.width, this.height); - gd.setScissor(0, 0, this.width, this.height); - - return true; - }, - - unbind : function unbindFn() - { - var gd = this.gd; - var gl = gd.gl; - - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - - gd.setViewport.apply(gd, this.oldViewportBox); - gd.setScissor.apply(gd, this.oldScissorBox); - - this.colorTexture0.updateMipmaps(this.face); - if (this.depthTexture) - { - this.depthTexture.updateMipmaps(this.face); - } - }, - - destroy : function renderTargetDestroyFn() - { - var gd = this.gd; - if (gd) - { - var glObject = this.glObject; - if (glObject) - { - var gl = gd.gl; - if (gl) - { - gl.deleteFramebuffer(glObject); - } - delete this.glObject; - } - - delete this.colorTexture0; - delete this.colorTexture1; - delete this.colorTexture2; - delete this.colorTexture3; - delete this.depthBuffer; - delete this.depthTexture; - delete this.gd; - } - } -}; - -// Constructor function -WebGLRenderTarget.create = function webGLRenderTargetFn(gd, params) -{ - var renderTarget = new WebGLRenderTarget(); - - var colorTexture0 = params.colorTexture0; - var colorTexture1 = (colorTexture0 ? (params.colorTexture1 || null) : null); - var colorTexture2 = (colorTexture1 ? (params.colorTexture2 || null) : null); - var colorTexture3 = (colorTexture2 ? (params.colorTexture3 || null) : null); - var depthBuffer = params.depthBuffer || null; - var depthTexture = params.depthTexture || null; - var face = params.face; - - var maxSupported = gd.maxSupported("RENDERTARGET_COLOR_TEXTURES"); - if (colorTexture1 && maxSupported < 2) - { - return null; - } - if (colorTexture2 && maxSupported < 3) - { - return null; - } - if (colorTexture3 && maxSupported < 4) - { - return null; - } - - var gl = gd.gl; - - var glObject = gl.createFramebuffer(); - - gl.bindFramebuffer(gl.FRAMEBUFFER, glObject); - - var width, height; - if (colorTexture0) - { - width = colorTexture0.width; - height = colorTexture0.height; - - var glTexture = colorTexture0.glTexture; - if (glTexture === undefined) - { - TurbulenzEngine.callOnError("Color texture is not a Texture"); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.deleteFramebuffer(glObject); - return null; - } - - var colorAttachment0 = gl.COLOR_ATTACHMENT0; - if (colorTexture0.cubemap) - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, colorAttachment0, (gl.TEXTURE_CUBE_MAP_POSITIVE_X + face), glTexture, 0); - } - else - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, colorAttachment0, gl.TEXTURE_2D, glTexture, 0); - } - - if (colorTexture1) - { - glTexture = colorTexture1.glTexture; - if (colorTexture1.cubemap) - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 1), (gl.TEXTURE_CUBE_MAP_POSITIVE_X + face), glTexture, 0); - } - else - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 1), gl.TEXTURE_2D, glTexture, 0); - } - - if (colorTexture2) - { - glTexture = colorTexture2.glTexture; - if (colorTexture1.cubemap) - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 2), (gl.TEXTURE_CUBE_MAP_POSITIVE_X + face), glTexture, 0); - } - else - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 2), gl.TEXTURE_2D, glTexture, 0); - } - - if (colorTexture3) - { - glTexture = colorTexture3.glTexture; - if (colorTexture1.cubemap) - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 3), (gl.TEXTURE_CUBE_MAP_POSITIVE_X + face), glTexture, 0); - } - else - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, (colorAttachment0 + 3), gl.TEXTURE_2D, glTexture, 0); - } - } - } - } - } - else if (depthTexture) - { - width = depthTexture.width; - height = depthTexture.height; - } - else if (depthBuffer) - { - width = depthBuffer.width; - height = depthBuffer.height; - } - else - { - TurbulenzEngine.callOnError( - "No RenderBuffers or Textures specified for this RenderTarget"); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.deleteFramebuffer(glObject); - return null; - } - - if (depthTexture) - { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, - gl.TEXTURE_2D, depthTexture.glTexture, 0); - } - else if (depthBuffer) - { - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, - gl.RENDERBUFFER, depthBuffer.glBuffer); - } - - var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); - - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - - if (status !== gl.FRAMEBUFFER_COMPLETE) - { - gl.deleteFramebuffer(glObject); - return null; - } - - renderTarget.gd = gd; - renderTarget.glObject = glObject; - renderTarget.colorTexture0 = colorTexture0; - renderTarget.colorTexture1 = colorTexture1; - renderTarget.colorTexture2 = colorTexture2; - renderTarget.colorTexture3 = colorTexture3; - renderTarget.depthBuffer = depthBuffer; - renderTarget.depthTexture = depthTexture; - renderTarget.width = width; - renderTarget.height = height; - renderTarget.face = face; - - return renderTarget; -}; - - -// -// WebGLIndexBuffer -// -function WebGLIndexBuffer() {} -WebGLIndexBuffer.prototype = -{ - version : 1, - - map : function indexBufferMapFn(offset, numIndices) - { - if (offset === undefined) - { - offset = 0; - } - if (numIndices === undefined) - { - numIndices = this.numIndices; - } - - var gd = this.gd; - var gl = gd.gl; - - var format = this.format; - var data; - if (format === gl.UNSIGNED_BYTE) - { - data = new Uint8Array(numIndices); - } - else if (format === gl.UNSIGNED_SHORT) - { - data = new Uint16Array(numIndices); - } - else //if (format === gl.UNSIGNED_INT) - { - data = new Uint32Array(numIndices); - } - - var numValues = 0; - var writer = function indexBufferWriterFn() - { - var numArguments = arguments.length; - for (var n = 0; n < numArguments; n += 1) - { - data[numValues] = arguments[n]; - numValues += 1; - } - }; - writer.data = data; - writer.offset = offset; - writer.getNumWrittenIndices = function getNumWrittenIndicesFn() - { - return numValues; - }; - writer.write = writer; - return writer; - }, - - unmap : function indexBufferUnmapFn(writer) - { - if (writer) - { - var gd = this.gd; - var gl = gd.gl; - - var data = writer.data; - delete writer.data; - - var offset = writer.offset; - - delete writer.write; - - var numIndices = writer.getNumWrittenIndices(); - if (!numIndices) - { - return; - } - - if (numIndices < data.length) - { - data = data.subarray(0, numIndices); - } - - gd.setIndexBuffer(this); - - if (numIndices < this.numIndices) - { - gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, offset, data); - } - else - { - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, this.usage); - } - } - }, - - setData : function indexBufferSetDataFn(data, offset, numIndices) - { - if (offset === undefined) - { - offset = 0; - } - if (numIndices === undefined) - { - numIndices = this.numIndices; - } - - var gd = this.gd; - var gl = gd.gl; - - var bufferData; - var format = this.format; - if (format === gl.UNSIGNED_BYTE) - { - if (data instanceof Uint8Array) - { - bufferData = data; - } - else - { - bufferData = new Uint8Array(data); - } - } - else if (format === gl.UNSIGNED_SHORT) - { - if (data instanceof Uint16Array) - { - bufferData = data; - } - else - { - bufferData = new Uint16Array(data); - } - offset *= 2; - } - else if (format === gl.UNSIGNED_INT) - { - if (data instanceof Uint32Array) - { - bufferData = data; - } - else - { - bufferData = new Uint32Array(data); - } - offset *= 4; - } - data = undefined; - - if (numIndices < bufferData.length) - { - bufferData = bufferData.subarray(0, numIndices); - } - - gd.setIndexBuffer(this); - - if (numIndices < this.numIndices) - { - gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, offset, bufferData); - } - else - { - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, bufferData, this.usage); - } - }, - - destroy : function indexBufferDestroyFn() - { - var gd = this.gd; - if (gd) - { - var glBuffer = this.glBuffer; - if (glBuffer) - { - var gl = gd.gl; - if (gl) - { - gd.unsetIndexBuffer(this); - gl.deleteBuffer(glBuffer); - } - delete this.glBuffer; - } - - delete this.gd; - } - } -}; - -// Constructor function -WebGLIndexBuffer.create = function webGLIndexBufferCreateFn(gd, params) -{ - var gl = gd.gl; - - var ib = new WebGLIndexBuffer(); - ib.gd = gd; - - var numIndices = params.numIndices; - ib.numIndices = numIndices; - - var format = params.format; - if (typeof format === "string") - { - format = gd['INDEXFORMAT_' + format]; - } - ib.format = format; - - var stride; - if (format === gl.UNSIGNED_BYTE) - { - stride = 1; - } - else if (format === gl.UNSIGNED_SHORT) - { - stride = 2; - } - else //if (format === gl.UNSIGNED_INT) - { - stride = 4; - } - ib.stride = stride; - - /*jshint sub: true*/ - // Avoid dot notation lookup to prevent Google Closure complaining about transient being a keyword - ib['transient'] = (params['transient'] || false); - ib.dynamic = (params.dynamic || ib['transient']); - ib.usage = (ib['transient'] ? gl.STREAM_DRAW : (ib.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW)); - /*jshint sub: false*/ - - ib.glBuffer = gl.createBuffer(); - - if (params.data) - { - ib.setData(params.data, 0, numIndices); - } - else - { - gd.setIndexBuffer(ib); - - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, (numIndices * stride), ib.usage); - } - - return ib; -}; - - -// -// WebGLSemantics -// -function WebGLSemantics() {} -WebGLSemantics.prototype = -{ - version : 1 -}; - -// Constructor function -WebGLSemantics.create = function webGLSemanticsCreateFn(gd, attributes) -{ - var semantics = new WebGLSemantics(); - - var numAttributes = attributes.length; - semantics.length = numAttributes; - for (var i = 0; i < numAttributes; i += 1) - { - var attribute = attributes[i]; - if (typeof attribute === "string") - { - semantics[i] = gd['SEMANTIC_' + attribute]; - } - else - { - semantics[i] = attribute; - } - } - - return semantics; -}; - - -// -// WebGLVertexBuffer -// -function WebGLVertexBuffer() {} -WebGLVertexBuffer.prototype = -{ - version : 1, - - map : function vertexBufferMapFn(offset, numVertices) - { - if (offset === undefined) - { - offset = 0; - } - if (numVertices === undefined) - { - numVertices = this.numVertices; - } - - var gd = this.gd; - var gl = gd.gl; - - var numValuesPerVertex = this.stride; - var attributes = this.attributes; - var numAttributes = attributes.length; - - var data, writer; - var numValues = 0; - - if (this.hasSingleFormat) - { - var maxNumValues = (numVertices * numValuesPerVertex); - var format = attributes[0].format; - - if (format === gl.BYTE) - { - data = new Int8Array(maxNumValues); - } - else if (format === gl.UNSIGNED_BYTE) - { - data = new Uint8Array(maxNumValues); - } - else if (format === gl.SHORT) - { - data = new Int16Array(maxNumValues); - } - else if (format === gl.UNSIGNED_SHORT) - { - data = new Uint16Array(maxNumValues); - } - else if (format === gl.INT) - { - data = new Int32Array(maxNumValues); - } - else if (format === gl.UNSIGNED_INT) - { - data = new Uint32Array(maxNumValues); - } - else if (format === gl.FLOAT) - { - data = new Float32Array(maxNumValues); - } - - writer = function vertexBufferWriterSingleFn() - { - var numArguments = arguments.length; - var currentArgument = 0; - for (var a = 0; a < numAttributes; a += 1) - { - var attribute = attributes[a]; - var numComponents = attribute.numComponents; - var currentComponent = 0, j; - do - { - if (currentArgument < numArguments) - { - var value = arguments[currentArgument]; - currentArgument += 1; - if (typeof value === "number") - { - if (attribute.normalized) - { - value *= attribute.normalizationScale; - } - data[numValues] = value; - numValues += 1; - currentComponent += 1; - } - else if (currentComponent === 0) - { - var numSubArguments = value.length; - if (numSubArguments > numComponents) - { - numSubArguments = numComponents; - } - if (attribute.normalized) - { - var scale = attribute.normalizationScale; - for (j = 0; j < numSubArguments; j += 1) - { - data[numValues] = (value[j] * scale); - numValues += 1; - currentComponent += 1; - } - } - else - { - for (j = 0; j < numSubArguments; j += 1) - { - data[numValues] = value[j]; - numValues += 1; - currentComponent += 1; - } - } - while (currentComponent < numComponents) - { - // No need to clear to zeros - numValues += 1; - currentComponent += 1; - } - break; - } - else - { - TurbulenzEngine.callOnError( - 'Missing values for attribute ' + a); - return null; - } - } - else - { - // No need to clear to zeros - numValues += 1; - currentComponent += 1; - } - } - while (currentComponent < numComponents); - } - }; - } - else - { - var destOffset = 0; - var bufferSize = (numVertices * this.strideInBytes); - - data = new ArrayBuffer(bufferSize); - - if (typeof DataView !== 'undefined' && 'setFloat32' in DataView.prototype) - { - var dataView = new DataView(data); - - writer = function vertexBufferWriterDataViewFn() - { - var numArguments = arguments.length; - var currentArgument = 0; - for (var a = 0; a < numAttributes; a += 1) - { - var attribute = attributes[a]; - var numComponents = attribute.numComponents; - var setter = attribute.typedSetter; - var componentStride = attribute.componentStride; - var currentComponent = 0, j; - do - { - if (currentArgument < numArguments) - { - var value = arguments[currentArgument]; - currentArgument += 1; - if (typeof value === "number") - { - if (attribute.normalized) - { - value *= attribute.normalizationScale; - } - setter.call(dataView, destOffset, value, true); - destOffset += componentStride; - currentComponent += 1; - numValues += 1; - } - else if (currentComponent === 0) - { - var numSubArguments = value.length; - if (numSubArguments > numComponents) - { - numSubArguments = numComponents; - } - if (attribute.normalized) - { - var scale = attribute.normalizationScale; - for (j = 0; j < numSubArguments; j += 1) - { - setter.call(dataView, destOffset, (value[j] * scale), true); - destOffset += componentStride; - currentComponent += 1; - numValues += 1; - } - } - else - { - for (j = 0; j < numSubArguments; j += 1) - { - setter.call(dataView, destOffset, value[j], true); - destOffset += componentStride; - currentComponent += 1; - numValues += 1; - } - } - while (currentComponent < numComponents) - { - // No need to clear to zeros - numValues += 1; - currentComponent += 1; - } - break; - } - else - { - TurbulenzEngine.callOnError( - 'Missing values for attribute ' + a); - return null; - } - } - else - { - // No need to clear to zeros - numValues += 1; - currentComponent += 1; - } - } - while (currentComponent < numComponents); - } - }; - } - else - { - writer = function vertexBufferWriterMultiFn() - { - var numArguments = arguments.length; - var currentArgument = 0; - var dest; - for (var a = 0; a < numAttributes; a += 1) - { - var attribute = attributes[a]; - var numComponents = attribute.numComponents; - dest = new attribute.typedArray(data, destOffset, numComponents); - destOffset += attribute.stride; - - var currentComponent = 0, j; - do - { - if (currentArgument < numArguments) - { - var value = arguments[currentArgument]; - currentArgument += 1; - if (typeof value === "number") - { - if (attribute.normalized) - { - value *= attribute.normalizationScale; - } - dest[currentComponent] = value; - currentComponent += 1; - numValues += 1; - } - else if (currentComponent === 0) - { - var numSubArguments = value.length; - if (numSubArguments > numComponents) - { - numSubArguments = numComponents; - } - if (attribute.normalized) - { - var scale = attribute.normalizationScale; - for (j = 0; j < numSubArguments; j += 1) - { - dest[currentComponent] = (value[j] * scale); - currentComponent += 1; - numValues += 1; - } - } - else - { - for (j = 0; j < numSubArguments; j += 1) - { - dest[currentComponent] = value[j]; - currentComponent += 1; - numValues += 1; - } - } - while (currentComponent < numComponents) - { - // No need to clear to zeros - currentComponent += 1; - numValues += 1; - } - break; - } - else - { - TurbulenzEngine.callOnError( - 'Missing values for attribute ' + a); - return null; - } - } - else - { - // No need to clear to zeros - currentComponent += 1; - numValues += 1; - } - } - while (currentComponent < numComponents); - } - }; - } - } - - writer.data = data; - writer.offset = offset; - writer.getNumWrittenVertices = function getNumWrittenVerticesFn() - { - return Math.floor(numValues / numValuesPerVertex); - }; - writer.getNumWrittenValues = function getNumWrittenValuesFn() - { - return numValues; - }; - writer.write = writer; - return writer; - }, - - unmap : function vertexBufferUnmapFn(writer) - { - if (writer) - { - var data = writer.data; - delete writer.data; - - delete writer.write; - - var numVertices = writer.getNumWrittenVertices(); - if (!numVertices) - { - return; - } - - var offset = writer.offset; - - var stride = this.strideInBytes; - - if (this.hasSingleFormat) - { - var numValues = writer.getNumWrittenValues(); - if (numValues < data.length) - { - data = data.subarray(0, numValues); - } - } - else - { - var numBytes = (numVertices * stride); - if (numBytes < data.byteLength) - { - data = data.slice(0, numBytes); - } - } - - var gd = this.gd; - var gl = gd.gl; - - gd.bindVertexBuffer(this.glBuffer); - - if (numVertices < this.numVertices) - { - gl.bufferSubData(gl.ARRAY_BUFFER, (offset * stride), data); - } - else - { - gl.bufferData(gl.ARRAY_BUFFER, data, this.usage); - } - } - }, - - setData : function vertexBufferSetDataFn(data, offset, numVertices) - { - if (offset === undefined) - { - offset = 0; - } - if (numVertices === undefined) - { - numVertices = this.numVertices; - } - - var gd = this.gd; - var gl = gd.gl; - var strideInBytes = this.strideInBytes; - - // Fast path for ArrayBuffer data - - if (data.constructor === ArrayBuffer) - { - gd.bindVertexBuffer(this.glBuffer); - - if (numVertices < this.numVertices) - { - gl.bufferSubData(gl.ARRAY_BUFFER, (offset * strideInBytes), data); - } - else - { - gl.bufferData(gl.ARRAY_BUFFER, data, this.usage); - } - return; - } - - var attributes = this.attributes; - var numAttributes = this.numAttributes; - var attribute, format, bufferData, TypedArrayConstructor; - - if (this.hasSingleFormat) - { - attribute = attributes[0]; - format = attribute.format; - - if (format === gl.BYTE) - { - if (!(data instanceof Int8Array)) - { - TypedArrayConstructor = Int8Array; - } - } - else if (format === gl.UNSIGNED_BYTE) - { - if (!(data instanceof Uint8Array)) - { - TypedArrayConstructor = Uint8Array; - } - } - else if (format === gl.SHORT) - { - if (!(data instanceof Int16Array)) - { - TypedArrayConstructor = Int16Array; - } - } - else if (format === gl.UNSIGNED_SHORT) - { - if (!(data instanceof Uint16Array)) - { - TypedArrayConstructor = Uint16Array; - } - } - else if (format === gl.INT) - { - if (!(data instanceof Int32Array)) - { - TypedArrayConstructor = Int32Array; - } - } - else if (format === gl.UNSIGNED_INT) - { - if (!(data instanceof Uint32Array)) - { - TypedArrayConstructor = Uint32Array; - } - } - else if (format === gl.FLOAT) - { - if (!(data instanceof Float32Array)) - { - TypedArrayConstructor = Float32Array; - } - } - - var numValuesPerVertex = this.stride; - var numValues = (numVertices * numValuesPerVertex); - - if (TypedArrayConstructor) - { - // Data has to be put into a Typed Array and - // potentially normalized. - - if (attribute.normalized) - { - data = this.scaleValues(data, attribute.normalizationScale, numValues); - } - bufferData = new TypedArrayConstructor(data); - if (numValues < bufferData.length) - { - bufferData = bufferData.subarray(0, numValues); - } - } - else - { - bufferData = data; - } - - if (numValues < data.length) - { - bufferData = bufferData.subarray(0, numValues); - } - } - else - { - var bufferSize = (numVertices * strideInBytes); - - bufferData = new ArrayBuffer(bufferSize); - - var srcOffset = 0, destOffset = 0, v, c, a, numComponents, componentStride, scale; - if (typeof DataView !== 'undefined' && 'setFloat32' in DataView.prototype) - { - var dataView = new DataView(bufferData); - - for (v = 0; v < numVertices; v += 1) - { - for (a = 0; a < numAttributes; a += 1) - { - attribute = attributes[a]; - numComponents = attribute.numComponents; - componentStride = attribute.componentStride; - var setter = attribute.typedSetter; - if (attribute.normalized) - { - scale = attribute.normalizationScale; - for (c = 0; c < numComponents; c += 1) - { - setter.call(dataView, destOffset, (data[srcOffset] * scale), true); - destOffset += componentStride; - srcOffset += 1; - } - } - else - { - for (c = 0; c < numComponents; c += 1) - { - setter.call(dataView, destOffset, data[srcOffset], true); - destOffset += componentStride; - srcOffset += 1; - } - } - } - } - } - else - { - for (v = 0; v < numVertices; v += 1) - { - for (a = 0; a < numAttributes; a += 1) - { - attribute = attributes[a]; - numComponents = attribute.numComponents; - var dest = new attribute.typedArray(bufferData, destOffset, numComponents); - destOffset += attribute.stride; - if (attribute.normalized) - { - scale = attribute.normalizationScale; - for (c = 0; c < numComponents; c += 1) - { - dest[c] = (data[srcOffset] * scale); - srcOffset += 1; - } - } - else - { - for (c = 0; c < numComponents; c += 1) - { - dest[c] = data[srcOffset]; - srcOffset += 1; - } - } - } - } - } - } - data = undefined; - - gd.bindVertexBuffer(this.glBuffer); - - if (numVertices < this.numVertices) - { - gl.bufferSubData(gl.ARRAY_BUFFER, (offset * strideInBytes), bufferData); - } - else - { - gl.bufferData(gl.ARRAY_BUFFER, bufferData, this.usage); - } - }, - - // Internal - scaleValues : function scaleValuesFn(values, scale, numValues) - { - if (numValues === undefined) - { - numValues = values.length; - } - var scaledValues = new values.constructor(numValues); - for (var n = 0; n < numValues; n += 1) - { - scaledValues[n] = (values[n] * scale); - } - return scaledValues; - }, - - bindAttributes : function bindAttributesFn(numAttributes, attributes, offset) - { - var gd = this.gd; - var gl = gd.gl; - var vertexAttributes = this.attributes; - var stride = this.strideInBytes; - var attributeMask = 0; - /*jshint bitwise: false*/ - for (var n = 0; n < numAttributes; n += 1) - { - var vertexAttribute = vertexAttributes[n]; - var attribute = attributes[n]; - - attributeMask |= (1 << attribute); - - gl.vertexAttribPointer(attribute, - vertexAttribute.numComponents, - vertexAttribute.format, - vertexAttribute.normalized, - stride, - offset); - - offset += vertexAttribute.stride; - } - /*jshint bitwise: true*/ - return attributeMask; - }, - - setAttributes : function setAttributesFn(attributes) - { - var gd = this.gd; - - var numAttributes = attributes.length; - this.numAttributes = numAttributes; - - this.attributes = []; - var stride = 0, numValuesPerVertex = 0, hasSingleFormat = true; - - for (var i = 0; i < numAttributes; i += 1) - { - var format = attributes[i]; - if (typeof format === "string") - { - format = gd['VERTEXFORMAT_' + format]; - } - this.attributes[i] = format; - stride += format.stride; - numValuesPerVertex += format.numComponents; - - if (hasSingleFormat && i) - { - if (format.format !== this.attributes[i - 1].format) - { - hasSingleFormat = false; - } - } - } - this.strideInBytes = stride; - this.stride = numValuesPerVertex; - this.hasSingleFormat = hasSingleFormat; - - return stride; - }, - - resize : function resizeFn(size) - { - if (size !== (this.strideInBytes * this.numVertices)) - { - var gd = this.gd; - var gl = gd.gl; - - gd.bindVertexBuffer(this.glBuffer); - - var bufferType = gl.ARRAY_BUFFER; - gl.bufferData(bufferType, size, this.usage); - - var bufferSize = gl.getBufferParameter(bufferType, gl.BUFFER_SIZE); - this.numVertices = Math.floor(bufferSize / this.strideInBytes); - } - }, - - destroy : function vertexBufferDestroyFn() - { - var gd = this.gd; - if (gd) - { - var glBuffer = this.glBuffer; - if (glBuffer) - { - var gl = gd.gl; - if (gl) - { - gd.unbindVertexBuffer(glBuffer); - gl.deleteBuffer(glBuffer); - } - delete this.glBuffer; - } - - delete this.gd; - } - } -}; - -// Constructor function -WebGLVertexBuffer.create = function webGLVertexBufferCreateFn(gd, params) -{ - var gl = gd.gl; - - var vb = new WebGLVertexBuffer(); - vb.gd = gd; - - var numVertices = params.numVertices; - vb.numVertices = numVertices; - - var strideInBytes = vb.setAttributes(params.attributes); - - /*jshint sub: true*/ - // Avoid dot notation lookup to prevent Google Closure complaining about transient being a keyword - vb['transient'] = (params['transient'] || false); - vb.dynamic = (params.dynamic || vb['transient']); - vb.usage = (vb['transient'] ? gl.STREAM_DRAW : (vb.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW)); - /*jshint sub: false*/ - vb.glBuffer = gl.createBuffer(); - - var bufferSize = (numVertices * strideInBytes); - - if (params.data) - { - vb.setData(params.data, 0, numVertices); - } - else - { - gd.bindVertexBuffer(vb.glBuffer); - - gl.bufferData(gl.ARRAY_BUFFER, bufferSize, vb.usage); - } - - return vb; -}; - - -// -// WebGLPass -// -function WebGLPass() {} -WebGLPass.prototype = -{ - version : 1, - - updateParametersData : function updateParametersDataFn(gd) - { - var gl = gd.gl; - - this.dirty = false; - - // Set parameters - var hasProperty = Object.prototype.hasOwnProperty; - var parameters = this.parameters; - for (var p in parameters) - { - if (hasProperty.call(parameters, p)) - { - var parameter = parameters[p]; - if (parameter.dirty) - { - parameter.dirty = 0; - - var paramInfo = parameter.info; - var location = parameter.location; - if (paramInfo && - null !== location) - { - var parameterValues = paramInfo.values; - var sampler = parameter.sampler; - if (sampler) - { - gd.setTexture(parameter.textureUnit, parameterValues, sampler); - } - else if (1 < paramInfo.numValues) - { - parameter.setter.call(gl, location, parameterValues); - } - else //if (1 === paramInfo.numValues) - { - parameter.setter.call(gl, location, parameterValues[0]); - } - } - } - } - } - }, - - initializeParameters : function passInitializeParametersFn(gd) - { - var gl = gd.gl; - - var glProgram = this.glProgram; - - gd.setProgram(glProgram); - - var passParameters = this.parameters; - for (var p in passParameters) - { - if (passParameters.hasOwnProperty(p)) - { - var parameter = passParameters[p]; - - var paramInfo = parameter.info; - if (paramInfo) - { - var location = gl.getUniformLocation(glProgram, p); - if (null !== location) - { - parameter.location = location; - - if (parameter.sampler) - { - gl.uniform1i(location, parameter.textureUnit); - } - else - { - if (1 < paramInfo.numValues) - { - parameter.setter.call(gl, location, paramInfo.values); - } - else //if (1 === paramInfo.numValues) - { - parameter.setter.call(gl, location, paramInfo.values[0]); - } - } - } - } - } - } - }, - - destroy : function passDestroyFn() - { - delete this.glProgram; - delete this.semanticsMask; - delete this.parameters; - - var states = this.states; - if (states) - { - states.length = 0; - delete this.states; - } - } -}; - -// Constructor function -WebGLPass.create = function webGLPassCreateFn(gd, shader, params) -{ - var gl = gd.gl; - - var pass = new WebGLPass(); - - pass.name = (params.name || null); - - var programs = shader.programs; - var parameters = shader.parameters; - - var parameterNames = params.parameters; - var programNames = params.programs; - var semanticNames = params.semantics; - var states = params.states; - - var compoundProgramName = programNames.join(':'); - var linkedProgram = shader.linkedPrograms[compoundProgramName]; - var glProgram, semanticsMask, p, s; - if (linkedProgram === undefined) - { - // Create GL program - glProgram = gl.createProgram(); - - var numPrograms = programNames.length; - for (p = 0; p < numPrograms; p += 1) - { - var glShader = programs[programNames[p]]; - if (glShader) - { - gl.attachShader(glProgram, glShader); - } - } - - /*jshint bitwise: false*/ - var numSemantics = semanticNames.length; - semanticsMask = 0; - for (s = 0; s < numSemantics; s += 1) - { - var semanticName = semanticNames[s]; - var attribute = gd['SEMANTIC_' + semanticName]; - if (attribute !== undefined) - { - semanticsMask |= (1 << attribute); - gl.bindAttribLocation(glProgram, attribute, ("ATTR" + attribute)); - } - } - /*jshint bitwise: true*/ - - gl.linkProgram(glProgram); - - shader.linkedPrograms[compoundProgramName] = { - glProgram : glProgram, - semanticsMask : semanticsMask - }; - } - else - { - //console.log('Reused program ' + compoundProgramName); - glProgram = linkedProgram.glProgram; - semanticsMask = linkedProgram.semanticsMask; - } - - pass.glProgram = glProgram; - pass.semanticsMask = semanticsMask; - - // Set parameters - var numTextureUnits = 0; - var passParameters = {}; - pass.parameters = passParameters; - var numParameters = parameterNames ? parameterNames.length : 0; - for (p = 0; p < numParameters; p += 1) - { - var parameterName = parameterNames[p]; - - var parameter = {}; - passParameters[parameterName] = parameter; - - var paramInfo = parameters[parameterName]; - parameter.info = paramInfo; - if (paramInfo) - { - parameter.location = null; - if (paramInfo.sampler) - { - parameter.sampler = paramInfo.sampler; - parameter.textureUnit = numTextureUnits; - numTextureUnits += 1; - } - else - { - parameter.sampler = undefined; - parameter.textureUnit = undefined; - } - parameter.setter = paramInfo.setter; - } - } - pass.numTextureUnits = numTextureUnits; - pass.numParameters = numParameters; - - function equalRenderStates(defaultValues, values) - { - var numDefaultValues = defaultValues.length; - var n; - for (n = 0; n < numDefaultValues; n += 1) - { - if (defaultValues[n] !== values[n]) - { - return false; - } - } - return true; - } - - var hasProperty = Object.prototype.hasOwnProperty; - var stateHandlers = gd.stateHandlers; - var passStates = []; - var passStatesSet = {}; - pass.states = passStates; - pass.statesSet = passStatesSet; - for (s in states) - { - if (hasProperty.call(states, s)) - { - var stateHandler = stateHandlers[s]; - if (stateHandler) - { - var values = stateHandler.parse(states[s]); - if (values !== null) - { - if (equalRenderStates(stateHandler.defaultValues, values)) - { - continue; - } - passStates.push({ - name: s, - set: stateHandler.set, - reset: stateHandler.reset, - values: values - }); - passStatesSet[s] = true; - } - else - { - TurbulenzEngine.callOnError('Unknown value for state ' + - s + ': ' + states[s]); - } - } - } - } - - return pass; -}; - - -// -// WebGLTechnique -// -function WebGLTechnique() {} -WebGLTechnique.prototype = -{ - version : 1, - - getPass : function getPassFn(id) - { - var passes = this.passes; - var numPasses = passes.length; - if (typeof id === "string") - { - for (var n = 0; n < numPasses; n += 1) - { - var pass = passes[n]; - if (pass.name === id) - { - return pass; - } - } - } - else - { - /*jshint bitwise: false*/ - id = (id | 0); - /*jshint bitwise: true*/ - if (id < numPasses) - { - return passes[id]; - } - } - return null; - }, - - activate : function activateFn(gd) - { - this.device = gd; - - if (!this.initialized) - { - this.shader.initialize(gd); - this.initialize(gd); - } - }, - - deactivate : function deactivateFn() - { - this.device = null; - }, - - checkProperties : function checkPropertiesFn(gd) - { - // Check for parameters set directly into the technique... - var fakeTechniqueParameters = {}, p; - for (p in this) - { - if (p !== 'version' && - p !== 'name' && - p !== 'passes' && - p !== 'numPasses' && - p !== 'device' && - p !== 'numParameters') - { - fakeTechniqueParameters[p] = this[p]; - } - } - - if (fakeTechniqueParameters) - { - var passes = this.passes; - if (passes.length === 1) - { - gd.setParametersImmediate(gd, passes, fakeTechniqueParameters); - } - else - { - gd.setParametersDeferred(gd, passes, fakeTechniqueParameters); - } - - var hasProperty = Object.prototype.hasOwnProperty; - for (p in fakeTechniqueParameters) - { - if (hasProperty.call(fakeTechniqueParameters, p)) - { - delete this[p]; - } - } - } - }, - - initialize : function techniqueInitializeFn(gd) - { - if (this.initialized) - { - return; - } - - var passes = this.passes; - if (passes) - { - var numPasses = passes.length; - var n; - for (n = 0; n < numPasses; n += 1) - { - passes[n].initializeParameters(gd); - } - } - - if (Object.defineProperty) - { - this.initializeParametersSetters(gd); - } - - this.initialized = true; - }, - - initializeParametersSetters : function initializeParametersSettersFn(gd) - { - var gl = gd.gl; - - function make_sampler_setter(pass, parameter) { - return function (parameterValues) { - if (this.device) - { - gd.setTexture(parameter.textureUnit, parameterValues, parameter.info.sampler); - } - else - { - pass.dirty = true; - parameter.dirty = 1; - parameter.info.values = parameterValues; - } - }; - } - - function make_float_uniform_setter(pass, parameter) { - - var paramInfo = parameter.info; - var location = parameter.location; - - function setDeferredParameter(parameterValues) - { - if (typeof parameterValues !== 'number') - { - var values = paramInfo.values; - var numValues = Math.min(paramInfo.numValues, parameterValues.length); - for (var v = 0; v < numValues; v += 1) - { - values[v] = parameterValues[v]; - } - parameter.dirty = Math.max(numValues, (parameter.dirty || 0)); - } - else - { - paramInfo.values[0] = parameterValues; - parameter.dirty = (parameter.dirty || 1); - } - pass.dirty = true; - } - - switch (paramInfo.columns) - { - case 1: - if (1 === paramInfo.numValues) - { - return function (parameterValues) - { - if (this.device) - { - gl.uniform1f(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - } - return function (parameterValues) - { - if (this.device) - { - gl.uniform1fv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 2: - return function (parameterValues) - { - if (this.device) - { - gl.uniform2fv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 3: - return function (parameterValues) - { - if (this.device) - { - gl.uniform3fv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 4: - return function (parameterValues) - { - if (this.device) - { - gl.uniform4fv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - default: - return null; - } - } - - function make_int_uniform_setter(pass, parameter) { - var paramInfo = parameter.info; - var location = parameter.location; - - function setDeferredParameter(parameterValues) - { - if (typeof parameterValues !== 'number') - { - var values = paramInfo.values; - var numValues = Math.min(paramInfo.numValues, parameterValues.length); - for (var v = 0; v < numValues; v += 1) - { - values[v] = parameterValues[v]; - } - parameter.dirty = Math.max(numValues, (parameter.dirty || 0)); - } - else - { - paramInfo.values[0] = parameterValues; - parameter.dirty = (parameter.dirty || 1); - } - pass.dirty = true; - } - - switch (paramInfo.columns) - { - case 1: - if (1 === paramInfo.numValues) - { - return function (parameterValues) - { - if (this.device) - { - gl.uniform1i(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - } - return function (parameterValues) - { - if (this.device) - { - gl.uniform1iv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 2: - return function (parameterValues) - { - if (this.device) - { - gl.uniform2iv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 3: - return function (parameterValues) - { - if (this.device) - { - gl.uniform3iv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - case 4: - return function (parameterValues) - { - if (this.device) - { - gl.uniform4iv(location, parameterValues); - } - else - { - setDeferredParameter(parameterValues); - } - }; - default: - return null; - } - } - - var passes = this.passes; - var numPasses = passes.length; - var pass, parameters, p, parameter, paramInfo, setter; - if (numPasses === 1) - { - pass = passes[0]; - parameters = pass.parameters; - for (p in parameters) - { - if (parameters.hasOwnProperty(p)) - { - parameter = parameters[p]; - paramInfo = parameter.info; - if (paramInfo) - { - if (undefined !== parameter.location) - { - if (parameter.sampler) - { - setter = make_sampler_setter(pass, parameter); - } - else - { - if (paramInfo.type === 'float') - { - setter = make_float_uniform_setter(pass, parameter); - } - else - { - setter = make_int_uniform_setter(pass, parameter); - } - } - - Object.defineProperty(this, p, { - set : setter, - enumerable : false, - configurable : false - }); - } - } - } - } - - this.checkProperties = function () - { - }; - } - else - { - Object.defineProperty(this, 'device', { - writable : true, - enumerable : false, - configurable : false - }); - - Object.defineProperty(this, 'version', { - writable : false, - enumerable : false, - configurable : false - }); - - Object.defineProperty(this, 'name', { - writable : false, - enumerable : false, - configurable : false - }); - - Object.defineProperty(this, 'passes', { - writable : false, - enumerable : false, - configurable : false - }); - - Object.defineProperty(this, 'numParameters', { - writable : false, - enumerable : false, - configurable : false - }); - } - }, - - destroy : function techniqueDestroyFn() - { - var passes = this.passes; - if (passes) - { - var numPasses = passes.length; - var n; - - for (n = 0; n < numPasses; n += 1) - { - passes[n].destroy(); - } - - passes.length = 0; - - delete this.passes; - } - - delete this.device; - } -}; - -// Constructor function -WebGLTechnique.create = function webGLTechniqueCreateFn(gd, shader, name, passes) -{ - var technique = new WebGLTechnique(); - - technique.initialized = false; - technique.shader = shader; - technique.name = name; - - var numPasses = passes.length, n; - var numParameters = 0; - technique.passes = []; - technique.numPasses = numPasses; - for (n = 0; n < numPasses; n += 1) - { - var passParams = passes[n]; - if (passParams.parameters) - { - numParameters += passParams.parameters.length; - } - technique.passes[n] = WebGLPass.create(gd, shader, passParams); - } - - technique.numParameters = numParameters; - - technique.device = null; - - - return technique; -}; - -// -// WebGLShader -// -function WebGLShader() {} -WebGLShader.prototype = -{ - version : 1, - - getTechnique : function getTechniqueFn(name) - { - if (typeof name === "string") - { - return this.techniques[name]; - } - else - { - var techniques = this.techniques; - for (var t in techniques) - { - if (techniques.hasOwnProperty(t)) - { - if (name === 0) - { - return techniques[t]; - } - else - { - name -= 1; - } - } - } - return null; - } - }, - - getParameter : function getParameterFn(name) - { - if (typeof name === "string") - { - return this.parameters[name]; - } - else - { - /*jshint bitwise: false*/ - name = (name | 0); - /*jshint bitwise: true*/ - var parameters = this.parameters; - for (var p in parameters) - { - if (parameters.hasOwnProperty(p)) - { - if (name === 0) - { - return parameters[p]; - } - else - { - name -= 1; - } - } - } - return null; - } - }, - - initialize : function shaderInitializeFn(gd) - { - if (this.initialized) - { - return; - } - - var gl = gd.gl; - var p; - - // Check copmpiled programs as late as possible - var shaderPrograms = this.programs; - for (p in shaderPrograms) - { - if (shaderPrograms.hasOwnProperty(p)) - { - var compiledProgram = shaderPrograms[p]; - var compiled = gl.getShaderParameter(compiledProgram, gl.COMPILE_STATUS); - if (!compiled) - { - var compilerInfo = gl.getShaderInfoLog(compiledProgram); - TurbulenzEngine.callOnError( - 'Program "' + p + '" failed to compile: ' + compilerInfo); - } - } - } - - // Check linked programs as late as possible - var linkedPrograms = this.linkedPrograms; - for (p in linkedPrograms) - { - if (linkedPrograms.hasOwnProperty(p)) - { - var linkedProgram = linkedPrograms[p]; - var glProgram = linkedProgram.glProgram; - if (glProgram) - { - var linked = gl.getProgramParameter(glProgram, gl.LINK_STATUS); - if (!linked) - { - var linkerInfo = gl.getProgramInfoLog(glProgram); - TurbulenzEngine.callOnError( - 'Program "' + p + '" failed to link: ' + linkerInfo); - } - } - } - } - - this.initialized = true; - }, - - destroy : function shaderDestroyFn() - { - var gd = this.gd; - if (gd) - { - var gl = gd.gl; - var p; - - var techniques = this.techniques; - if (techniques) - { - for (p in techniques) - { - if (techniques.hasOwnProperty(p)) - { - techniques[p].destroy(); - } - } - delete this.techniques; - } - - var linkedPrograms = this.linkedPrograms; - if (linkedPrograms) - { - if (gl) - { - for (p in linkedPrograms) - { - if (linkedPrograms.hasOwnProperty(p)) - { - var linkedProgram = linkedPrograms[p]; - var glProgram = linkedProgram.glProgram; - if (glProgram) - { - gl.deleteProgram(glProgram); - delete linkedProgram.glProgram; - } - } - } - } - delete this.linkedPrograms; - } - - var programs = this.programs; - if (programs) - { - if (gl) - { - for (p in programs) - { - if (programs.hasOwnProperty(p)) - { - gl.deleteShader(programs[p]); - } - } - } - delete this.programs; - } - - delete this.samplers; - delete this.parameters; - delete this.gd; - } - } -}; - -// Constructor function -WebGLShader.create = function webGLShaderCreateFn(gd, params) -{ - var gl = gd.gl; - - var shader = new WebGLShader(); - - shader.initialized = false; - - var techniques = params.techniques; - var parameters = params.parameters; - var programs = params.programs; - var samplers = params.samplers; - var p; - - shader.gd = gd; - shader.name = params.name; - - // Compile programs as early as possible - var shaderPrograms = {}; - shader.programs = shaderPrograms; - for (p in programs) - { - if (programs.hasOwnProperty(p)) - { - var program = programs[p]; - - var glShaderType; - if (program.type === 'fragment') - { - glShaderType = gl.FRAGMENT_SHADER; - } - else if (program.type === 'vertex') - { - glShaderType = gl.VERTEX_SHADER; - } - var glShader = gl.createShader(glShaderType); - - gl.shaderSource(glShader, program.code); - - gl.compileShader(glShader); - - shaderPrograms[p] = glShader; - } - } - - var linkedPrograms = {}; - shader.linkedPrograms = linkedPrograms; - - // Samplers - var defaultSampler = gd.DEFAULT_SAMPLER; - var maxAnisotropy = gd.maxAnisotropy; - - shader.samplers = {}; - var sampler; - for (p in samplers) - { - if (samplers.hasOwnProperty(p)) - { - sampler = samplers[p]; - - var samplerMaxAnisotropy = sampler.MaxAnisotropy; - if (samplerMaxAnisotropy) - { - if (samplerMaxAnisotropy > maxAnisotropy) - { - samplerMaxAnisotropy = maxAnisotropy; - } - } - else - { - samplerMaxAnisotropy = defaultSampler.maxAnisotropy; - } - - sampler = { - minFilter : (sampler.MinFilter || defaultSampler.minFilter), - magFilter : (sampler.MagFilter || defaultSampler.magFilter), - wrapS : (sampler.WrapS || defaultSampler.wrapS), - wrapT : (sampler.WrapT || defaultSampler.wrapT), - wrapR : (sampler.WrapR || defaultSampler.wrapR), - maxAnisotropy : samplerMaxAnisotropy - }; - if (sampler.wrapS === 0x2900) - { - sampler.wrapS = gl.CLAMP_TO_EDGE; - } - if (sampler.wrapT === 0x2900) - { - sampler.wrapT = gl.CLAMP_TO_EDGE; - } - if (sampler.wrapR === 0x2900) - { - sampler.wrapR = gl.CLAMP_TO_EDGE; - } - shader.samplers[p] = gd.createSampler(sampler); - } - } - - // Parameters - var numParameters = 0; - shader.parameters = {}; - for (p in parameters) - { - if (parameters.hasOwnProperty(p)) - { - var parameter = parameters[p]; - if (!parameter.columns) - { - parameter.columns = 1; - } - if (!parameter.rows) - { - parameter.rows = 1; - } - parameter.numValues = (parameter.columns * parameter.rows); - var parameterType = parameter.type; - if (parameterType === "float" || - parameterType === "int" || - parameterType === "bool") - { - var parameterValues = parameter.values; - if (parameterValues) - { - if (parameterType === "float") - { - parameter.values = new Float32Array(parameterValues); - } - else - { - parameter.values = new Int32Array(parameterValues); - } - } - else - { - if (parameterType === "float") - { - parameter.values = new Float32Array(parameter.numValues); - } - else - { - parameter.values = new Int32Array(parameter.numValues); - } - } - - if (parameterType === 'float') - { - switch (parameter.columns) - { - case 1: - if (1 === parameter.numValues) - { - parameter.setter = gl.uniform1f; - } - else - { - parameter.setter = gl.uniform1fv; - } - break; - case 2: - parameter.setter = gl.uniform2fv; - break; - case 3: - parameter.setter = gl.uniform3fv; - break; - case 4: - parameter.setter = gl.uniform4fv; - break; - default: - break; - } - } - else - { - switch (parameter.columns) - { - case 1: - if (1 === parameter.numValues) - { - parameter.setter = gl.uniform1i; - } - else - { - parameter.setter = gl.uniform1iv; - } - break; - case 2: - parameter.setter = gl.uniform2iv; - break; - case 3: - parameter.setter = gl.uniform3iv; - break; - case 4: - parameter.setter = gl.uniform4iv; - break; - default: - break; - } - } - } - else // Sampler - { - sampler = shader.samplers[p]; - if (!sampler) - { - sampler = defaultSampler; - shader.samplers[p] = defaultSampler; - } - parameter.sampler = sampler; - parameter.values = null; - } - - parameter.name = p; - - shader.parameters[p] = parameter; - numParameters += 1; - } - } - shader.numParameters = numParameters; - - // Techniques and passes - var shaderTechniques = {}; - var numTechniques = 0; - shader.techniques = shaderTechniques; - for (p in techniques) - { - if (techniques.hasOwnProperty(p)) - { - shaderTechniques[p] = WebGLTechnique.create(gd, shader, p, techniques[p]); - numTechniques += 1; - } - } - shader.numTechniques = numTechniques; - - return shader; -}; - -// -// WebGLTechniqueParameters -// -function WebGLTechniqueParameters() {} - -// Constructor function -WebGLTechniqueParameters.create = function WebGLTechniqueParametersFn(params) -{ - var techniqueParameters = new WebGLTechniqueParameters(); - - if (params) - { - for (var p in params) - { - if (params.hasOwnProperty(p)) - { - techniqueParameters[p] = params[p]; - } - } - } - - return techniqueParameters; -}; - -// -// WebGLTechniqueParameterBuffer -// -function techniqueParameterBufferSetData(data, offset, numValues) -{ - for (var n = 0, o = offset; n < numValues; n += 1, o += 1) - { - this[o] = data[n]; - } - return o; -} - -function techniqueParameterBufferCreate(params) -{ - if (Float32Array.prototype.map === undefined) - { - Float32Array.prototype.map = function techniqueParameterBufferMap(offset, numFloats) { - if (offset === undefined) - { - offset = 0; - } - var buffer = this; - if (numFloats === undefined) - { - numFloats = this.length; - } - function techniqueParameterBufferWriter() - { - var numArguments = arguments.length; - for (var a = 0; a < numArguments; a += 1) - { - var value = arguments[a]; - if (typeof value === 'number') - { - buffer[offset] = value; - offset += 1; - } - else - { - offset = techniqueParameterBufferSetData.call(buffer, value, offset, value.length); - } - } - } - return techniqueParameterBufferWriter; - }; - - Float32Array.prototype.unmap = function techniqueParameterBufferUnmap(/* writer */) { - }; - } - - return new Float32Array(params.numFloats); -} - - -// -// WebGLDrawParameters -// -function WebGLDrawParameters() -{ - // Streams, TechniqueParameters and Instances are stored as indexed properties - this.endStreams = 0; - this.endTechniqueParameters = (16 * 3); - this.endInstances = ((16 * 3) + 8); - this.firstIndex = 0; - this.count = 0; - this.sortKey = 0; - this.technique = null; - this.indexBuffer = null; - this.primitive = -1; - this.userData = null; - - // Initialize for 1 Stream, 2 TechniqueParameters and 8 Instances - this[0] = undefined; - this[1] = undefined; - this[2] = undefined; - - this[(16 * 3) + 0] = undefined; - this[(16 * 3) + 1] = undefined; - - this[((16 * 3) + 8) + 0] = undefined; - this[((16 * 3) + 8) + 1] = undefined; - this[((16 * 3) + 8) + 2] = undefined; - this[((16 * 3) + 8) + 3] = undefined; - this[((16 * 3) + 8) + 4] = undefined; - this[((16 * 3) + 8) + 5] = undefined; - this[((16 * 3) + 8) + 6] = undefined; - this[((16 * 3) + 8) + 7] = undefined; -} - -WebGLDrawParameters.prototype = -{ - version : 1, - - setTechniqueParameters : function setTechniqueParametersFn(indx, techniqueParameters) - { - if (indx < 8) - { - indx += (16 * 3); - - this[indx] = techniqueParameters; - - var endTechniqueParameters = this.endTechniqueParameters; - if (techniqueParameters) - { - if (endTechniqueParameters <= indx) - { - this.endTechniqueParameters = (indx + 1); - } - } - else - { - while ((16 * 3) < endTechniqueParameters && - !this[endTechniqueParameters - 1]) - { - endTechniqueParameters -= 1; - } - this.endTechniqueParameters = endTechniqueParameters; - } - } - }, - - setVertexBuffer : function setVertexBufferFn(indx, vertexBuffer) - { - if (indx < 16) - { - indx *= 3; - - this[indx] = vertexBuffer; - - var endStreams = this.endStreams; - if (vertexBuffer) - { - if (endStreams <= indx) - { - this.endStreams = (indx + 3); - } - } - else - { - while (0 < endStreams && - !this[endStreams - 3]) - { - endStreams -= 3; - } - this.endStreams = endStreams; - } - } - }, - - setSemantics : function setSemanticsFn(indx, semantics) - { - if (indx < 16) - { - this[(indx * 3) + 1] = semantics; - } - }, - - setOffset : function setOffsetFn(indx, offset) - { - if (indx < 16) - { - this[(indx * 3) + 2] = offset; - } - }, - - getTechniqueParameters : function getTechniqueParametersFn(indx) - { - if (indx < 8) - { - return this[indx + (16 * 3)]; - } - else - { - return undefined; - } - }, - - getVertexBuffer : function getVertexBufferFn(indx) - { - if (indx < 16) - { - return this[(indx * 3) + 0]; - } - else - { - return undefined; - } - }, - - getSemantics : function getSemanticsFn(indx) - { - if (indx < 16) - { - return this[(indx * 3) + 1]; - } - else - { - return undefined; - } - }, - - getOffset : function getOffsetFn(indx) - { - if (indx < 16) - { - return this[(indx * 3) + 2]; - } - else - { - return undefined; - } - }, - - addInstance : function drawParametersAddInstanceFn(instanceParameters) - { - if (instanceParameters) - { - var endInstances = this.endInstances; - this.endInstances = (endInstances + 1); - this[endInstances] = instanceParameters; - } - }, - - removeInstances : function drawParametersRemoveInstancesFn() - { - this.endInstances = ((16 * 3) + 8); - }, - - getNumInstances : function drawParametersGetNumInstancesFn() - { - return (this.endInstances - ((16 * 3) + 8)); - } -}; - -// Constructor function -WebGLDrawParameters.create = function webGLDrawParametersFn(/* params */) -{ - return new WebGLDrawParameters(); -}; - - -// -// WebGLGraphicsDevice -// -function WebGLGraphicsDevice() {} -WebGLGraphicsDevice.prototype = -{ - version : 1, - - SEMANTIC_POSITION: 0, - SEMANTIC_POSITION0: 0, - SEMANTIC_BLENDWEIGHT: 1, - SEMANTIC_BLENDWEIGHT0: 1, - SEMANTIC_NORMAL: 2, - SEMANTIC_NORMAL0: 2, - SEMANTIC_COLOR: 3, - SEMANTIC_COLOR0: 3, - SEMANTIC_COLOR1: 4, - SEMANTIC_SPECULAR: 4, - SEMANTIC_FOGCOORD: 5, - SEMANTIC_TESSFACTOR: 5, - SEMANTIC_PSIZE0: 6, - SEMANTIC_BLENDINDICES: 7, - SEMANTIC_BLENDINDICES0: 7, - SEMANTIC_TEXCOORD: 8, - SEMANTIC_TEXCOORD0: 8, - SEMANTIC_TEXCOORD1: 9, - SEMANTIC_TEXCOORD2: 10, - SEMANTIC_TEXCOORD3: 11, - SEMANTIC_TEXCOORD4: 12, - SEMANTIC_TEXCOORD5: 13, - SEMANTIC_TEXCOORD6: 14, - SEMANTIC_TEXCOORD7: 15, - SEMANTIC_TANGENT: 14, - SEMANTIC_TANGENT0: 14, - SEMANTIC_BINORMAL0: 15, - SEMANTIC_BINORMAL: 15, - SEMANTIC_PSIZE: 6, - SEMANTIC_ATTR0: 0, - SEMANTIC_ATTR1: 1, - SEMANTIC_ATTR2: 2, - SEMANTIC_ATTR3: 3, - SEMANTIC_ATTR4: 4, - SEMANTIC_ATTR5: 5, - SEMANTIC_ATTR6: 6, - SEMANTIC_ATTR7: 7, - SEMANTIC_ATTR8: 8, - SEMANTIC_ATTR9: 9, - SEMANTIC_ATTR10: 10, - SEMANTIC_ATTR11: 11, - SEMANTIC_ATTR12: 12, - SEMANTIC_ATTR13: 13, - SEMANTIC_ATTR14: 14, - SEMANTIC_ATTR15: 15, - - PIXELFORMAT_A8: 0, - PIXELFORMAT_L8: 1, - PIXELFORMAT_L8A8: 2, - PIXELFORMAT_R5G5B5A1: 3, - PIXELFORMAT_R5G6B5: 4, - PIXELFORMAT_R8G8B8A8: 5, - PIXELFORMAT_R8G8B8: 6, - PIXELFORMAT_D24S8: 7, - PIXELFORMAT_DXT1: 8, - PIXELFORMAT_DXT3: 9, - PIXELFORMAT_DXT5: 10, - - drawIndexed : function drawIndexedFn(primitive, numIndices, first) - { - var gl = this.gl; - var indexBuffer = this.activeIndexBuffer; - - var offset; - if (first) - { - offset = (first * indexBuffer.stride); - } - else - { - offset = 0; - } - - var format = indexBuffer.format; - - var attributeMask = this.attributeMask; - - var activeTechnique = this.activeTechnique; - var passes = activeTechnique.passes; - var numPasses = passes.length; - var mask; - - activeTechnique.checkProperties(this); - - /*jshint bitwise: false*/ - if (1 === numPasses) - { - mask = (passes[0].semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - this.enableClientState(mask); - } - - gl.drawElements(primitive, numIndices, format, offset); - } - else - { - for (var p = 0; p < numPasses; p += 1) - { - var pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - this.enableClientState(mask); - } - - this.setPass(pass); - - gl.drawElements(primitive, numIndices, format, offset); - } - } - /*jshint bitwise: true*/ - }, - - draw : function drawFn(primitive, numVertices, first) - { - var gl = this.gl; - - var attributeMask = this.attributeMask; - - var activeTechnique = this.activeTechnique; - var passes = activeTechnique.passes; - var numPasses = passes.length; - var mask; - - activeTechnique.checkProperties(this); - - /*jshint bitwise: false*/ - if (1 === numPasses) - { - mask = (passes[0].semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - this.enableClientState(mask); - } - - gl.drawArrays(primitive, first, numVertices); - } - else - { - for (var p = 0; p < numPasses; p += 1) - { - var pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - this.enableClientState(mask); - } - - this.setPass(pass); - - gl.drawArrays(primitive, first, numVertices); - } - } - /*jshint bitwise: true*/ - }, - - setTechniqueParameters : function setTechniqueParametersFn() - { - var activeTechnique = this.activeTechnique; - var passes = activeTechnique.passes; - var setParameters = (1 === passes.length ? this.setParametersImmediate : this.setParametersDeferred); - var numTechniqueParameters = arguments.length; - for (var t = 0; t < numTechniqueParameters; t += 1) - { - setParameters(this, passes, arguments[t]); - } - }, - - //Internal - - setParametersImmediate : function setParametersImmediateFn(gd, passes, techniqueParameters) - { - var gl = gd.gl; - - var parameters = passes[0].parameters; - /*jshint forin: true*/ - for (var p in techniqueParameters) - { - var parameter = parameters[p]; - if (parameter !== undefined) - { - var sampler = parameter.sampler; - var parameterValues = techniqueParameters[p]; - if (parameterValues !== undefined) - { - if (sampler !== undefined) - { - gd.setTexture(parameter.textureUnit, parameterValues, sampler); - } - else - { - parameter.setter.call(gl, parameter.location, parameterValues); - } - } - else - { - delete techniqueParameters[p]; - if (sampler) - { - gd.setTexture(parameter.textureUnit); - } - } - } - } - /*jshint forin: false*/ - }, - - // ONLY USE FOR SINGLE PASS TECHNIQUES ON DRAWARRAY - setParametersCaching : function setParametersCachingFn(gd, passes, techniqueParameters) - { - var gl = gd.gl; - - var parameters = passes[0].parameters; - /*jshint forin: true*/ - for (var p in techniqueParameters) - { - var parameter = parameters[p]; - if (parameter !== undefined) - { - var parameterValues = techniqueParameters[p]; - if (parameter.value !== parameterValues) - { - parameter.value = parameterValues; - - var sampler = parameter.sampler; - if (parameterValues !== undefined) - { - if (sampler !== undefined) - { - gd.setTexture(parameter.textureUnit, parameterValues, sampler); - } - else - { - parameter.setter.call(gl, parameter.location, parameterValues); - } - } - else - { - delete techniqueParameters[p]; - if (sampler) - { - gd.setTexture(parameter.textureUnit); - } - } - } - } - } - /*jshint forin: false*/ - }, - - setParametersDeferred : function setParametersDeferredFn(gd, passes, techniqueParameters) - { - var numPasses = passes.length; - var min = Math.min; - var max = Math.max; - for (var n = 0; n < numPasses; n += 1) - { - var pass = passes[n]; - var parameters = pass.parameters; - pass.dirty = true; - - /*jshint forin: true*/ - for (var p in techniqueParameters) - { - var parameter = parameters[p]; - if (parameter) - { - var paramInfo = parameter.info; - var parameterValues = techniqueParameters[p]; - if (parameterValues !== undefined) - { - if (parameter.sampler) - { - paramInfo.values = parameterValues; - parameter.dirty = 1; - } - else if (typeof parameterValues !== 'number') - { - var values = paramInfo.values; - var numValues = min(paramInfo.numValues, parameterValues.length); - for (var v = 0; v < numValues; v += 1) - { - values[v] = parameterValues[v]; - } - parameter.dirty = max(numValues, (parameter.dirty || 0)); - } - else - { - paramInfo.values[0] = parameterValues; - parameter.dirty = (parameter.dirty || 1); - } - } - else - { - delete techniqueParameters[p]; - } - } - } - /*jshint forin: false*/ - } - }, - - setTechnique : function setTechniqueFn(technique) - { - var activeTechnique = this.activeTechnique; - if (activeTechnique !== technique) - { - if (activeTechnique) - { - activeTechnique.deactivate(); - } - - this.activeTechnique = technique; - - technique.activate(this); - - var passes = technique.passes; - if (1 === passes.length) - { - this.setPass(passes[0]); - } - } - }, - - // ONLY USE FOR SINGLE PASS TECHNIQUES ON DRAWARRAY - setTechniqueCaching : function setTechniqueCachingFn(technique) - { - var pass = technique.passes[0]; - - var activeTechnique = this.activeTechnique; - if (activeTechnique !== technique) - { - if (activeTechnique) - { - activeTechnique.deactivate(); - } - - this.activeTechnique = technique; - - technique.activate(this); - - this.setPass(pass); - } - - var parameters = pass.parameters; - for (var p in parameters) - { - if (parameters.hasOwnProperty(p)) - { - parameters[p].value = null; - } - } - }, - - setStream : function setStreamFn(vertexBuffer, semantics, offset) - { - if (offset) - { - offset *= vertexBuffer.strideInBytes; - } - else - { - offset = 0; - } - - this.bindVertexBuffer(vertexBuffer.glBuffer); - - var attributes = semantics; - var numAttributes = attributes.length; - if (numAttributes > vertexBuffer.numAttributes) - { - numAttributes = vertexBuffer.numAttributes; - } - - /*jshint bitwise: false*/ - this.attributeMask |= vertexBuffer.bindAttributes(numAttributes, attributes, offset); - /*jshint bitwise: true*/ - }, - - setIndexBuffer : function setIndexBufferFn(indexBuffer) - { - if (this.activeIndexBuffer !== indexBuffer) - { - this.activeIndexBuffer = indexBuffer; - var glBuffer; - if (indexBuffer) - { - glBuffer = indexBuffer.glBuffer; - } - else - { - glBuffer = null; - } - var gl = this.gl; - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, glBuffer); - } - }, - - drawArray : function drawArrayFn(drawParametersArray, globalTechniqueParametersArray, sortMode) - { - var gl = this.gl; - var ELEMENT_ARRAY_BUFFER = gl.ELEMENT_ARRAY_BUFFER; - - var setParametersCaching = this.setParametersCaching; - var setParametersDeferred = this.setParametersDeferred; - - var setStream = this.setStream; - var enableClientState = this.enableClientState; - - var numGlobalTechniqueParameters = globalTechniqueParametersArray.length; - - var numDrawParameters = drawParametersArray.length; - if (numDrawParameters > 1 && sortMode) - { - if (sortMode > 0) - { - drawParametersArray.sort(function drawArraySortPositive(a, b) { - return (b.sortKey - a.sortKey); - }); - } - else if (sortMode < 0) - { - drawParametersArray.sort(function drawArraySortNegative(a, b) { - return (a.sortKey - b.sortKey); - }); - } - } - - - var activeIndexBuffer = this.activeIndexBuffer; - var setParameters = null; - var lastTechnique = null; - var lastEndStreams = -1; - var lastDrawParameters = null; - var techniqueParameters = null; - var v = 0; - var streamsMatch = false; - var vertexBuffer = null; - var offset = 0; - var passes = null; - var p = null; - var pass = null; - var format = 0; - var numPasses = 0; - var mask = 0; - var attributeMask = 0; - var t = 0; - - for (var n = 0; n < numDrawParameters; n += 1) - { - var drawParameters = drawParametersArray[n]; - var technique = drawParameters.technique; - var endTechniqueParameters = drawParameters.endTechniqueParameters; - var endStreams = drawParameters.endStreams; - var endInstances = drawParameters.endInstances; - var indexBuffer = drawParameters.indexBuffer; - var primitive = drawParameters.primitive; - var count = drawParameters.count; - var firstIndex = drawParameters.firstIndex; - - if (lastTechnique !== technique) - { - lastTechnique = technique; - - passes = technique.passes; - numPasses = passes.length; - if (1 === numPasses) - { - this.setTechniqueCaching(technique); - setParameters = setParametersCaching; - } - else - { - this.setTechnique(technique); - setParameters = setParametersDeferred; - } - - technique.checkProperties(this); - - for (t = 0; t < numGlobalTechniqueParameters; t += 1) - { - setParameters(this, passes, globalTechniqueParametersArray[t]); - } - } - - for (t = (16 * 3); t < endTechniqueParameters; t += 1) - { - techniqueParameters = drawParameters[t]; - if (techniqueParameters) - { - setParameters(this, passes, techniqueParameters); - } - } - - streamsMatch = (lastEndStreams === endStreams); - for (v = 0; streamsMatch && v < endStreams; v += 3) - { - streamsMatch = (lastDrawParameters[v] === drawParameters[v] && - lastDrawParameters[v + 1] === drawParameters[v + 1] && - lastDrawParameters[v + 2] === drawParameters[v + 2]); - } - - if (!streamsMatch) - { - lastEndStreams = endStreams; - lastDrawParameters = drawParameters; - - for (v = 0; v < endStreams; v += 3) - { - vertexBuffer = drawParameters[v]; - if (vertexBuffer) - { - setStream.call(this, vertexBuffer, drawParameters[v + 1], drawParameters[v + 2]); - } - } - - attributeMask = this.attributeMask; - } - - /*jshint bitwise: false*/ - if (indexBuffer) - { - if (activeIndexBuffer !== indexBuffer) - { - activeIndexBuffer = indexBuffer; - gl.bindBuffer(ELEMENT_ARRAY_BUFFER, indexBuffer.glBuffer); - } - - offset = firstIndex; - if (offset) - { - offset *= indexBuffer.stride; - } - - format = indexBuffer.format; - - if (1 === numPasses) - { - mask = (passes[0].semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - t = ((16 * 3) + 8); - if (t < endInstances) - { - do - { - setParameters(this, passes, drawParameters[t]); - - gl.drawElements(primitive, count, format, offset); - - t += 1; - } - while (t < endInstances); - } - else - { - gl.drawElements(primitive, count, format, offset); - } - } - else - { - t = ((16 * 3) + 8); - if (t < endInstances) - { - do - { - setParameters(this, passes, drawParameters[t]); - - for (p = 0; p < numPasses; p += 1) - { - pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - this.setPass(pass); - - gl.drawElements(primitive, count, format, offset); - } - - t += 1; - } - while (t < endInstances); - } - else - { - for (p = 0; p < numPasses; p += 1) - { - pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - this.setPass(pass); - - gl.drawElements(primitive, count, format, offset); - } - } - } - } - else - { - if (1 === numPasses) - { - mask = (passes[0].semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - t = ((16 * 3) + 8); - if (t < endInstances) - { - do - { - setParameters(this, passes, drawParameters[t]); - - gl.drawArrays(primitive, firstIndex, count); - - t += 1; - } - while (t < endInstances); - } - else - { - gl.drawArrays(primitive, firstIndex, count); - } - } - else - { - t = ((16 * 3) + 8); - if (t < endInstances) - { - do - { - setParameters(this, passes, drawParameters[t]); - - for (p = 0; p < numPasses; p += 1) - { - pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - this.setPass(pass); - - gl.drawArrays(primitive, firstIndex, count); - } - - t += 1; - } - while (t < endInstances); - } - else - { - for (p = 0; p < numPasses; p += 1) - { - pass = passes[p]; - - mask = (pass.semanticsMask & attributeMask); - if (mask !== this.clientStateMask) - { - enableClientState.call(this, mask); - } - - this.setPass(pass); - - gl.drawArrays(primitive, firstIndex, count); - } - } - } - } - /*jshint bitwise: true*/ - } - - this.activeIndexBuffer = activeIndexBuffer; - }, - - beginDraw : function beginDrawFn(primitive, numVertices, formats, semantics) - { - this.immediatePrimitive = primitive; - if (numVertices) - { - var n; - var immediateSemantics = this.immediateSemantics; - var attributes = semantics; - var numAttributes = attributes.length; - immediateSemantics.length = numAttributes; - for (n = 0; n < numAttributes; n += 1) - { - var attribute = attributes[n]; - if (typeof attribute === "string") - { - attribute = this['SEMANTIC_' + attribute]; - } - immediateSemantics[n] = attribute; - } - - var immediateVertexBuffer = this.immediateVertexBuffer; - - var oldStride = immediateVertexBuffer.strideInBytes; - var oldSize = (oldStride * immediateVertexBuffer.numVertices); - - var stride = immediateVertexBuffer.setAttributes(formats); - if (stride !== oldStride) - { - immediateVertexBuffer.numVertices = Math.floor(oldSize / stride); - } - - var size = (stride * numVertices); - if (size > oldSize) - { - immediateVertexBuffer.resize(size); - } - - return immediateVertexBuffer.map(0, numVertices); - } - return null; - }, - - endDraw : function endDrawFn(writer) - { - var immediateVertexBuffer = this.immediateVertexBuffer; - - var numVerticesWritten = writer.getNumWrittenVertices(); - - immediateVertexBuffer.unmap(writer); - - if (numVerticesWritten) - { - var gl = this.gl; - - var stride = immediateVertexBuffer.strideInBytes; - var offset = 0; - - /*jshint bitwise: false*/ - var vertexAttributes = immediateVertexBuffer.attributes; - - var semantics = this.immediateSemantics; - var numSemantics = semantics.length; - var deltaAttributeMask = 0; - for (var n = 0; n < numSemantics; n += 1) - { - var vertexAttribute = vertexAttributes[n]; - - var attribute = semantics[n]; - - deltaAttributeMask |= (1 << attribute); - - gl.vertexAttribPointer(attribute, - vertexAttribute.numComponents, - vertexAttribute.format, - vertexAttribute.normalized, - stride, - offset); - - offset += vertexAttribute.stride; - } - this.attributeMask |= deltaAttributeMask; - /*jshint bitwise: true*/ - - this.draw(this.immediatePrimitive, numVerticesWritten, 0); - } - }, - - setViewport : function setViewportFn(x, y, w, h) - { - var currentBox = this.state.viewportBox; - if (currentBox[0] !== x || - currentBox[1] !== y || - currentBox[2] !== w || - currentBox[3] !== h) - { - currentBox[0] = x; - currentBox[1] = y; - currentBox[2] = w; - currentBox[3] = h; - this.gl.viewport(x, y, w, h); - } - }, - - setScissor : function setScissorFn(x, y, w, h) - { - var currentBox = this.state.scissorBox; - if (currentBox[0] !== x || - currentBox[1] !== y || - currentBox[2] !== w || - currentBox[3] !== h) - { - currentBox[0] = x; - currentBox[1] = y; - currentBox[2] = w; - currentBox[3] = h; - this.gl.scissor(x, y, w, h); - } - }, - - clear : function clearFn(color, depth, stencil) - { - var gl = this.gl; - var state = this.state; - - var clearMask = 0; - - if (color) - { - clearMask += gl.COLOR_BUFFER_BIT; - - var currentColor = state.clearColor; - var color0 = color[0]; - var color1 = color[1]; - var color2 = color[2]; - var color3 = color[3]; - if (currentColor[0] !== color0 || - currentColor[1] !== color1 || - currentColor[2] !== color2 || - currentColor[3] !== color3) - { - currentColor[0] = color0; - currentColor[1] = color1; - currentColor[2] = color2; - currentColor[3] = color3; - gl.clearColor(color0, color1, color2, color3); - } - } - - if (depth !== undefined) - { - clearMask += gl.DEPTH_BUFFER_BIT; - - if (state.clearDepth !== depth) - { - state.clearDepth = depth; - gl.clearDepth(depth); - } - - if (stencil !== undefined) - { - clearMask += gl.STENCIL_BUFFER_BIT; - - if (state.clearStencil !== stencil) - { - state.clearStencil = stencil; - gl.clearStencil(stencil); - } - } - } - - if (clearMask) - { - var colorMask = state.colorMask; - var colorMaskEnabled = (colorMask[0] || colorMask[1] || colorMask[2] || colorMask[3]); - var depthMask = state.depthMask; - var program = state.program; - - if (color) - { - if (!colorMaskEnabled) - { - // This is posibly a mistake, enable it for this call - gl.colorMask(true, true, true, true); - } - } - - if (depth !== undefined) - { - if (!depthMask) - { - // This is posibly a mistake, enable it for this call - gl.depthMask(true); - } - } - - if (program) - { - gl.useProgram(null); // Work around for Mac crash bug. - } - - gl.clear(clearMask); - - if (color) - { - if (!colorMaskEnabled) - { - gl.colorMask(false, false, false, false); - } - } - - if (depth !== undefined) - { - if (!depthMask) - { - gl.depthMask(false); - } - } - - if (program) - { - gl.useProgram(program); - } - } - }, - - beginFrame : function beginFrameFn() - { - var gl = this.gl; - - this.attributeMask = 0; - - /*jshint bitwise: false*/ - var clientStateMask = this.clientStateMask; - var n; - if (clientStateMask) - { - for (n = 0; n < 16; n += 1) - { - if (clientStateMask & (1 << n)) - { - gl.disableVertexAttribArray(n); - } - } - this.clientStateMask = 0; - } - /*jshint bitwise: true*/ - - this.resetStates(); - - this.setScissor(0, 0, this.width, this.height); - this.setViewport(0, 0, this.width, this.height); - - return true; - }, - - beginRenderTarget : function beginRenderTargetFn(renderTarget) - { - this.activeRenderTarget = renderTarget; - return renderTarget.bind(); - }, - - endRenderTarget : function endRenderTargetFn() - { - this.activeRenderTarget.unbind(); - this.activeRenderTarget = null; - }, - - beginOcclusionQuery : function beginOcclusionQueryFn() - { - return false; - }, - - endOcclusionQuery : function endOcclusionQueryFn() - { - }, - - endFrame : function endFrameFn() - { - var gl = this.gl; - //gl.flush(); - - if (this.activeTechnique) - { - this.activeTechnique.deactivate(); - this.activeTechnique = null; - } - - if (this.activeIndexBuffer) - { - this.setIndexBuffer(null); - } - - var state = this.state; - if (state.program) - { - state.program = null; - gl.useProgram(null); - } - - this.numFrames += 1; - var currentFrameTime = TurbulenzEngine.getTime(); - var diffTime = (currentFrameTime - this.previousFrameTime); - if (diffTime >= 1000.0) - { - this.fps = (this.numFrames / (diffTime * 0.001)); - this.numFrames = 0; - this.previousFrameTime = currentFrameTime; - } - - var canvas = gl.canvas; - var width = (gl.drawingBufferWidth || canvas.width); - var height = (gl.drawingBufferHeight || canvas.height); - if (this.width !== width || - this.height !== height) - { - this.width = width; - this.height = height; - this.setViewport(0, 0, width, height); - this.setScissor(0, 0, width, height); - } - - this.checkFullScreen(); - }, - - createTechniqueParameters : function createTechniqueParametersFn(params) - { - return WebGLTechniqueParameters.create(params); - }, - - createSemantics : function createSemanticsFn(attributes) - { - return WebGLSemantics.create(this, attributes); - }, - - createVertexBuffer : function createVertexBufferFn(params) - { - return WebGLVertexBuffer.create(this, params); - }, - - createIndexBuffer : function createIndexBufferFn(params) - { - return WebGLIndexBuffer.create(this, params); - }, - - createTexture : function createTextureFn(params) - { - return WebGLTexture.create(this, params); - }, - - createShader : function createShaderFn(params) - { - return WebGLShader.create(this, params); - }, - - createTechniqueParameterBuffer : function createTechniqueParameterBufferFn(params) - { - return techniqueParameterBufferCreate(params); - }, - - createRenderBuffer : function createRenderBufferFn(params) - { - return WebGLRenderBuffer.create(this, params); - }, - - createRenderTarget : function createRenderTargetFn(params) - { - return WebGLRenderTarget.create(this, params); - }, - - createOcclusionQuery : function createOcclusionQueryFn(/* params */) - { - return null; - }, - - createDrawParameters : function createDrawParametersFn(params) - { - return WebGLDrawParameters.create(params); - }, - - isSupported : function isSupportedFn(name) - { - var gl = this.gl; - if ("OCCLUSION_QUERIES" === name) - { - return false; - } - else if ("NPOT_MIPMAPPED_TEXTURES" === name) - { - return false; - } - else if ("TEXTURE_DXT1" === name || - "TEXTURE_DXT3" === name || - "TEXTURE_DXT5" === name) - { - var compressedTexturesExtension = this.compressedTexturesExtension; - if (compressedTexturesExtension) - { - var compressedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS); - if (compressedFormats) - { - var requestedFormat; - if ("TEXTURE_DXT1" === name) - { - requestedFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT1_EXT; - } - else if ("TEXTURE_DXT3" === name) - { - requestedFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT3_EXT; - } - else //if ("TEXTURE_DXT5" === name) - { - requestedFormat = compressedTexturesExtension.COMPRESSED_RGBA_S3TC_DXT5_EXT; - } - var numCompressedFormats = compressedFormats.length; - for (var n = 0; n < numCompressedFormats; n += 1) - { - if (compressedFormats[n] === requestedFormat) - { - return true; - } - } - } - } - return false; - } - else if ("TEXTURE_ETC1" === name) - { - return false; - } - else if ("INDEXFORMAT_UINT" === name) - { - if (gl.getExtension('OES_element_index_uint')) - { - return true; - } - return false; - } - return undefined; - }, - - maxSupported : function maxSupportedFn(name) - { - var gl = this.gl; - if ("ANISOTROPY" === name) - { - return this.maxAnisotropy; - } - else if ("TEXTURE_SIZE" === name) - { - return gl.getParameter(gl.MAX_TEXTURE_SIZE); - } - else if ("CUBEMAP_TEXTURE_SIZE" === name) - { - return gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE); - } - else if ("3D_TEXTURE_SIZE" === name) - { - return 0; - } - else if ("RENDERTARGET_COLOR_TEXTURES" === name) - { - return 1; - } - else if ("RENDERBUFFER_SIZE" === name) - { - return gl.getParameter(gl.MAX_RENDERBUFFER_SIZE); - } - return 0; - }, - - loadTexturesArchive : function loadTexturesArchiveFn(params) - { - var src = params.src; - if (typeof TARLoader !== 'undefined') - { - TARLoader.create({ - gd: this, - src : src, - mipmaps : params.mipmaps, - ontextureload : function tarTextureLoadedFn(texture) - { - params.ontextureload(texture); - }, - onload : function tarLoadedFn(success, status) - { - if (params.onload) - { - params.onload(true, status); - } - }, - onerror : function tarFailedFn() - { - if (params.onload) - { - params.onload(false, status); - } - } - }); - return true; - } - else - { - TurbulenzEngine.callOnError( - 'Missing archive loader required for ' + src); - return false; - } - }, - - getScreenshot : function getScreenshotFn(compress, x, y, width, height) - { - var gl = this.gl; - var canvas = gl.canvas; - - if (compress) - { - return canvas.toDataURL('image/jpeg'); - } - else - { - if (x === undefined) - { - x = 0; - } - - if (y === undefined) - { - y = 0; - } - - var target = this.activeRenderTarget; - if (!target) - { - target = canvas; - } - - if (width === undefined) - { - width = target.width; - } - - if (height === undefined) - { - height = target.height; - } - - var pixels = new Uint8Array(4 * width * height); - - gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); - - return pixels; - } - }, - - // private - checkFullScreen : function checkFullScreenFn() - { - var fullscreen = this.fullscreen; - if (this.oldFullscreen !== fullscreen) - { - this.oldFullscreen = fullscreen; - - this.requestFullScreen(fullscreen); - } - }, - - requestFullScreen : function requestFullScreenFn(fullscreen) - { - if (fullscreen) - { - var canvas = this.gl.canvas; - if (canvas.webkitRequestFullScreenWithKeys) - { - canvas.webkitRequestFullScreenWithKeys(); - } - else if (canvas.requestFullScreenWithKeys) - { - canvas.requestFullScreenWithKeys(); - } - else if (canvas.webkitRequestFullScreen) - { - canvas.webkitRequestFullScreen(canvas.ALLOW_KEYBOARD_INPUT); - } - else if (canvas.mozRequestFullScreen) - { - canvas.mozRequestFullScreen(); - } - else if (canvas.requestFullScreen) - { - canvas.requestFullScreen(); - } - else if (canvas.requestFullscreen) - { - canvas.requestFullscreen(); - } - } - else - { - if (document.webkitCancelFullScreen) - { - document.webkitCancelFullScreen(); - } - else if (document.cancelFullScreen) - { - document.cancelFullScreen(); - } - else if (document.exitFullscreen) - { - document.exitFullscreen(); - } - } - }, - - createSampler : function createSamplerFn(sampler) - { - var samplerKey = sampler.minFilter.toString() + - ':' + sampler.magFilter.toString() + - ':' + sampler.wrapS.toString() + - ':' + sampler.wrapT.toString() + - ':' + sampler.wrapR.toString() + - ':' + sampler.maxAnisotropy.toString(); - - var cachedSamplers = this.cachedSamplers; - var cachedSampler = cachedSamplers[samplerKey]; - if (!cachedSampler) - { - cachedSamplers[samplerKey] = sampler; - return sampler; - } - return cachedSampler; - }, - - unsetIndexBuffer : function unsetIndexBufferFn(indexBuffer) - { - if (this.activeIndexBuffer === indexBuffer) - { - this.activeIndexBuffer = null; - var gl = this.gl; - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - } - }, - - bindVertexBuffer : function bindVertexBufferFn(buffer) - { - if (this.bindedVertexBuffer !== buffer) - { - this.bindedVertexBuffer = buffer; - var gl = this.gl; - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - } - }, - - unbindVertexBuffer : function unbindVertexBufferFn(buffer) - { - if (this.bindedVertexBuffer === buffer) - { - this.bindedVertexBuffer = null; - var gl = this.gl; - gl.bindBuffer(gl.ARRAY_BUFFER, null); - } - }, - - bindTextureUnit : function bindTextureUnitFn(unit, target, texture) - { - var state = this.state; - var gl = this.gl; - - if (state.activeTextureUnit !== unit) - { - state.activeTextureUnit = unit; - gl.activeTexture(gl.TEXTURE0 + unit); - } - gl.bindTexture(target, texture); - }, - - bindTexture : function bindTextureFn(target, texture) - { - var state = this.state; - var gl = this.gl; - - var dummyUnit = (state.maxTextureUnit - 1); - if (state.activeTextureUnit !== dummyUnit) - { - state.activeTextureUnit = dummyUnit; - gl.activeTexture(gl.TEXTURE0 + dummyUnit); - } - gl.bindTexture(target, texture); - }, - - unbindTexture : function unbindTextureFn(texture) - { - var state = this.state; - var lastMaxTextureUnit = state.lastMaxTextureUnit; - var textureUnits = state.textureUnits; - for (var u = 0; u < lastMaxTextureUnit; u += 1) - { - var textureUnit = textureUnits[u]; - if (textureUnit.texture === texture) - { - textureUnit.texture = null; - this.bindTextureUnit(u, textureUnit.target, null); - } - } - }, - - setSampler : function setSamplerFn(sampler, target) - { - if (sampler) - { - var gl = this.gl; - - gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, sampler.minFilter); - gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, sampler.magFilter); - gl.texParameteri(target, gl.TEXTURE_WRAP_S, sampler.wrapS); - gl.texParameteri(target, gl.TEXTURE_WRAP_T, sampler.wrapT); - /* - if (sSupports3DTextures) - { - gl.texParameteri(target, gl.TEXTURE_WRAP_R, sampler.wrapR); - } - */ - if (this.TEXTURE_MAX_ANISOTROPY_EXT) - { - gl.texParameteri(target, this.TEXTURE_MAX_ANISOTROPY_EXT, sampler.maxAnisotropy); - } - } - }, - - setPass : function setPassFn(pass) - { - var gl = this.gl; - var state = this.state; - - // Set renderstates - var renderStatesSet = pass.statesSet; - var renderStates = pass.states; - var numRenderStates = renderStates.length; - var r, renderState; - for (r = 0; r < numRenderStates; r += 1) - { - renderState = renderStates[r]; - renderState.set.apply(renderState, renderState.values); - } - - // Reset previous renderstates - var renderStatesToReset = state.renderStatesToReset; - var numRenderStatesToReset = renderStatesToReset.length; - for (r = 0; r < numRenderStatesToReset; r += 1) - { - renderState = renderStatesToReset[r]; - if (!(renderState.name in renderStatesSet)) - { - renderState.reset(); - } - } - - // Copy set renderstates to be reset later - renderStatesToReset.length = numRenderStates; - for (r = 0; r < numRenderStates; r += 1) - { - renderStatesToReset[r] = renderStates[r]; - } - - // Reset texture units - var lastMaxTextureUnit = state.lastMaxTextureUnit; - var textureUnits = state.textureUnits; - var currentMaxTextureUnit = pass.numTextureUnits; - if (currentMaxTextureUnit < lastMaxTextureUnit) - { - var u = currentMaxTextureUnit; - do - { - var textureUnit = textureUnits[u]; - if (textureUnit.texture) - { - textureUnit.texture = null; - this.bindTextureUnit(u, textureUnit.target, null); - } - u += 1; - } - while (u < lastMaxTextureUnit); - } - state.lastMaxTextureUnit = currentMaxTextureUnit; - - var program = pass.glProgram; - if (state.program !== program) - { - state.program = program; - gl.useProgram(program); - } - - if (pass.dirty) - { - pass.updateParametersData(this); - } - }, - - enableClientState : function enableClientStateFn(mask) - { - var gl = this.gl; - - var oldMask = this.clientStateMask; - this.clientStateMask = mask; - - /*jshint bitwise: false*/ - var disableMask = (oldMask & (~mask)); - var enableMask = ((~oldMask) & mask); - var n; - - if (disableMask) - { - if ((disableMask & 0xff) === 0) - { - disableMask >>= 8; - n = 8; - } - else - { - n = 0; - } - do - { - if (0 !== (0x01 & disableMask)) - { - gl.disableVertexAttribArray(n); - } - n += 1; - disableMask >>= 1; - } - while (disableMask); - } - - if (enableMask) - { - if ((enableMask & 0xff) === 0) - { - enableMask >>= 8; - n = 8; - } - else - { - n = 0; - } - do - { - if (0 !== (0x01 & enableMask)) - { - gl.enableVertexAttribArray(n); - } - n += 1; - enableMask >>= 1; - } - while (enableMask); - } - /*jshint bitwise: true*/ - }, - - setTexture : function setTextureFn(textureUnitIndex, texture, sampler) - { - var state = this.state; - var gl = this.gl; - - var textureUnit = state.textureUnits[textureUnitIndex]; - var oldgltarget = textureUnit.target; - var oldglobject = textureUnit.texture; - - if (texture) - { - var gltarget = texture.target; - var globject = texture.glTexture; - if (oldglobject !== globject || - oldgltarget !== gltarget) - { - textureUnit.target = gltarget; - textureUnit.texture = globject; - - if (state.activeTextureUnit !== textureUnitIndex) - { - state.activeTextureUnit = textureUnitIndex; - gl.activeTexture(gl.TEXTURE0 + textureUnitIndex); - } - - if (oldgltarget !== gltarget && - oldglobject) - { - gl.bindTexture(oldgltarget, null); - } - - gl.bindTexture(gltarget, globject); - - if (texture.sampler !== sampler) - { - texture.sampler = sampler; - - this.setSampler(sampler, gltarget); - } - } - } - else - { - if (oldgltarget && - oldglobject) - { - textureUnit.target = 0; - textureUnit.texture = null; - - if (state.activeTextureUnit !== textureUnitIndex) - { - state.activeTextureUnit = textureUnitIndex; - gl.activeTexture(gl.TEXTURE0 + textureUnitIndex); - } - - gl.bindTexture(oldgltarget, null); - } - } - }, - - setProgram : function setProgramFn(program) - { - var state = this.state; - if (state.program !== program) - { - state.program = program; - this.gl.useProgram(program); - } - }, - - syncState : function syncStateFn() - { - var state = this.state; - var gl = this.gl; - - if (state.depthTestEnable) - { - gl.enable(gl.DEPTH_TEST); - } - else - { - gl.disable(gl.DEPTH_TEST); - } - - gl.depthFunc(state.depthFunc); - - gl.depthMask(state.depthMask); - - if (state.blendEnable) - { - gl.enable(gl.BLEND); - } - else - { - gl.disable(gl.BLEND); - } - - gl.blendFunc(state.blendSrc, state.blendDst); - - if (state.cullFaceEnable) - { - gl.enable(gl.CULL_FACE); - } - else - { - gl.disable(gl.CULL_FACE); - } - - gl.cullFace(state.cullFace); - - gl.frontFace(state.frontFace); - - var colorMask = state.colorMask; - gl.colorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); - - if (state.stencilTestEnable) - { - gl.enable(gl.STENCIL_TEST); - } - else - { - gl.disable(gl.STENCIL_TEST); - } - - gl.stencilFunc(state.stencilFunc, state.stencilRef, state.stencilMask); - - gl.stencilOp(state.stencilFail, state.stencilZFail, state.stencilZPass); - - if (state.polygonOffsetFillEnable) - { - gl.enable(gl.POLYGON_OFFSET_FILL); - } - else - { - gl.disable(gl.POLYGON_OFFSET_FILL); - } - - gl.polygonOffset(state.polygonOffsetFactor, state.polygonOffsetUnits); - - gl.lineWidth(state.lineWidth); - - gl.activeTexture(gl.TEXTURE0 + state.activeTextureUnit); - - var currentBox = this.state.viewportBox; - gl.viewport(currentBox[0], currentBox[1], currentBox[2], currentBox[3]); - - currentBox = this.state.scissorBox; - gl.scissor(currentBox[0], currentBox[1], currentBox[2], currentBox[3]); - - var currentColor = state.clearColor; - gl.clearColor(currentColor[0], currentColor[1], currentColor[2], currentColor[3]); - - gl.clearDepth(state.clearDepth); - - gl.clearStencil(state.clearStencil); - }, - - resetStates : function resetStatesFn() - { - var state = this.state; - - var lastMaxTextureUnit = state.lastMaxTextureUnit; - var textureUnits = state.textureUnits; - for (var u = 0; u < lastMaxTextureUnit; u += 1) - { - var textureUnit = textureUnits[u]; - if (textureUnit.texture) - { - this.bindTextureUnit(u, textureUnit.target, null); - textureUnit.texture = null; - textureUnit.target = 0; - } - } - }, - - destroy : function graphicsDeviceDestroyFn() - { - delete this.activeTechnique; - delete this.activeIndexBuffer; - delete this.bindedVertexBuffer; - - if (this.immediateVertexBuffer) - { - this.immediateVertexBuffer.destroy(); - delete this.immediateVertexBuffer; - } - - delete this.gl; - } -}; - -// Constructor function -WebGLGraphicsDevice.create = function webGLGraphicsDeviceCreateFn(canvas, params) -{ - function getAvailableContext(canvas, params, contextList) - { - if (canvas.getContext) - { - var canvasParams = { - alpha: false, - stencil: true, - antialias: false - }; - - var multisample = params.multisample; - if (multisample !== undefined && 1 < multisample) - { - canvasParams.antialias = true; - } - - var numContexts = contextList.length, i; - for (i = 0; i < numContexts; i += 1) - { - try - { - var context = canvas.getContext(contextList[i], canvasParams); - if (context) - { - return context; - } - } - catch (ex) - { - } - } - } - return null; - } - - // TODO: Test if we can also use "webkit-3d" and "moz-webgl" - var gl = getAvailableContext(canvas, params, ['webgl', 'experimental-webgl']); - if (!gl) - { - return null; - } - - var width = (gl.drawingBufferWidth || canvas.width); - var height = (gl.drawingBufferHeight || canvas.height); - - gl.enable(gl.SCISSOR_TEST); - gl.depthRange(0.0, 1.0); - gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); - //gl.hint(gl.GENERATE_MIPMAP_HINT, gl.NICEST); - - var gd = new WebGLGraphicsDevice(); - gd.gl = gl; - gd.width = width; - gd.height = height; - - var extensions = gl.getSupportedExtensions(); - if (extensions) - { - extensions = extensions.join(' '); - } - else - { - extensions = ''; - } - gd.extensions = extensions; - gd.shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION); - gd.rendererVersion = gl.getParameter(gl.VERSION); - gd.renderer = gl.getParameter(gl.RENDERER); - gd.vendor = gl.getParameter(gl.VENDOR); - - if (extensions.indexOf('WEBGL_compressed_texture_s3tc') !== -1) - { - gd.WEBGL_compressed_texture_s3tc = true; - if (extensions.indexOf('WEBKIT_WEBGL_compressed_texture_s3tc') !== -1) - { - gd.compressedTexturesExtension = gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc'); - } - else if (extensions.indexOf('MOZ_WEBGL_compressed_texture_s3tc') !== -1) - { - gd.compressedTexturesExtension = gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc'); - } - else - { - gd.compressedTexturesExtension = gl.getExtension('WEBGL_compressed_texture_s3tc'); - } - } - else if (extensions.indexOf('WEBKIT_WEBGL_compressed_textures') !== -1) - { - gd.compressedTexturesExtension = gl.getExtension('WEBKIT_WEBGL_compressed_textures'); - } - - var anisotropyExtension; - if (extensions.indexOf('EXT_texture_filter_anisotropic') !== -1) - { - if (extensions.indexOf('MOZ_EXT_texture_filter_anisotropic') !== -1) - { - anisotropyExtension = gl.getExtension('MOZ_EXT_texture_filter_anisotropic'); - } - else if (extensions.indexOf('WEBKIT_EXT_texture_filter_anisotropic') !== -1) - { - anisotropyExtension = gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic'); - } - else - { - anisotropyExtension = gl.getExtension('EXT_texture_filter_anisotropic'); - } - } - if (anisotropyExtension) - { - gd.TEXTURE_MAX_ANISOTROPY_EXT = anisotropyExtension.TEXTURE_MAX_ANISOTROPY_EXT; - gd.maxAnisotropy = gl.getParameter(anisotropyExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT); - } - else - { - gd.maxAnisotropy = 1; - } - - gd.PRIMITIVE_POINTS = gl.POINTS; - gd.PRIMITIVE_LINES = gl.LINES; - gd.PRIMITIVE_LINE_LOOP = gl.LINE_LOOP; - gd.PRIMITIVE_LINE_STRIP = gl.LINE_STRIP; - gd.PRIMITIVE_TRIANGLES = gl.TRIANGLES; - gd.PRIMITIVE_TRIANGLE_STRIP = gl.TRIANGLE_STRIP; - gd.PRIMITIVE_TRIANGLE_FAN = gl.TRIANGLE_FAN; - - gd.INDEXFORMAT_UBYTE = gl.UNSIGNED_BYTE; - gd.INDEXFORMAT_USHORT = gl.UNSIGNED_SHORT; - gd.INDEXFORMAT_UINT = gl.UNSIGNED_INT; - - function getNormalizationScale(format) - { - if (format === gl.BYTE) - { - return 0x7f; - } - else if (format === gl.UNSIGNED_BYTE) - { - return 0xff; - } - else if (format === gl.SHORT) - { - return 0x7fff; - } - else if (format === gl.UNSIGNED_SHORT) - { - return 0xffff; - } - else if (format === gl.INT) - { - return 0x7fffffff; - } - else if (format === gl.UNSIGNED_INT) - { - return 0xffffffff; - } - else //if (format === gl.FLOAT) - { - return 1; - } - } - - function makeVertexformat(n, c, s, f, name) - { - var attributeFormat = { - numComponents: c, - stride: s, - componentStride: (s / c), - format: f, - name: name - }; - if (n) - { - attributeFormat.normalized = true; - attributeFormat.normalizationScale = getNormalizationScale(f); - } - else - { - attributeFormat.normalized = false; - attributeFormat.normalizationScale = 1; - } - - if (typeof DataView !== 'undefined' && 'setFloat32' in DataView.prototype) - { - if (f === gl.BYTE) - { - attributeFormat.typedSetter = DataView.prototype.setInt8; - } - else if (f === gl.UNSIGNED_BYTE) - { - attributeFormat.typedSetter = DataView.prototype.setUint8; - } - else if (f === gl.SHORT) - { - attributeFormat.typedSetter = DataView.prototype.setInt16; - } - else if (f === gl.UNSIGNED_SHORT) - { - attributeFormat.typedSetter = DataView.prototype.setUint16; - } - else if (f === gl.INT) - { - attributeFormat.typedSetter = DataView.prototype.setInt32; - } - else if (f === gl.UNSIGNED_INT) - { - attributeFormat.typedSetter = DataView.prototype.setUint32; - } - else //if (f === gl.FLOAT) - { - attributeFormat.typedSetter = DataView.prototype.setFloat32; - } - } - else - { - if (f === gl.BYTE) - { - attributeFormat.typedArray = Int8Array; - } - else if (f === gl.UNSIGNED_BYTE) - { - attributeFormat.typedArray = Uint8Array; - } - else if (f === gl.SHORT) - { - attributeFormat.typedArray = Int16Array; - } - else if (f === gl.UNSIGNED_SHORT) - { - attributeFormat.typedArray = Uint16Array; - } - else if (f === gl.INT) - { - attributeFormat.typedArray = Int32Array; - } - else if (f === gl.UNSIGNED_INT) - { - attributeFormat.typedArray = Uint32Array; - } - else //if (f === gl.FLOAT) - { - attributeFormat.typedArray = Float32Array; - } - } - return attributeFormat; - } - - gd.VERTEXFORMAT_BYTE4 = makeVertexformat(0, 4, 4, gl.BYTE, 'BYTE4'); - gd.VERTEXFORMAT_BYTE4N = makeVertexformat(1, 4, 4, gl.BYTE, 'BYTE4N'); - gd.VERTEXFORMAT_UBYTE4 = makeVertexformat(0, 4, 4, gl.UNSIGNED_BYTE, 'UBYTE4'); - gd.VERTEXFORMAT_UBYTE4N = makeVertexformat(1, 4, 4, gl.UNSIGNED_BYTE, 'UBYTE4N'); - gd.VERTEXFORMAT_SHORT2 = makeVertexformat(0, 2, 4, gl.SHORT, 'SHORT2'); - gd.VERTEXFORMAT_SHORT2N = makeVertexformat(1, 2, 4, gl.SHORT, 'SHORT2N'); - gd.VERTEXFORMAT_SHORT4 = makeVertexformat(0, 4, 8, gl.SHORT, 'SHORT4'); - gd.VERTEXFORMAT_SHORT4N = makeVertexformat(1, 4, 8, gl.SHORT, 'SHORT4N'); - gd.VERTEXFORMAT_USHORT2 = makeVertexformat(0, 2, 4, gl.UNSIGNED_SHORT, 'USHORT2'); - gd.VERTEXFORMAT_USHORT2N = makeVertexformat(1, 2, 4, gl.UNSIGNED_SHORT, 'USHORT2N'); - gd.VERTEXFORMAT_USHORT4 = makeVertexformat(0, 4, 8, gl.UNSIGNED_SHORT, 'USHORT4'); - gd.VERTEXFORMAT_USHORT4N = makeVertexformat(1, 4, 8, gl.UNSIGNED_SHORT, 'USHORT4N'); - gd.VERTEXFORMAT_FLOAT1 = makeVertexformat(0, 1, 4, gl.FLOAT, 'FLOAT1'); - gd.VERTEXFORMAT_FLOAT2 = makeVertexformat(0, 2, 8, gl.FLOAT, 'FLOAT2'); - gd.VERTEXFORMAT_FLOAT3 = makeVertexformat(0, 3, 12, gl.FLOAT, 'FLOAT3'); - gd.VERTEXFORMAT_FLOAT4 = makeVertexformat(0, 4, 16, gl.FLOAT, 'FLOAT4'); - - gd.DEFAULT_SAMPLER = { - minFilter : gl.LINEAR_MIPMAP_LINEAR, - magFilter : gl.LINEAR, - wrapS : gl.REPEAT, - wrapT : gl.REPEAT, - wrapR : gl.REPEAT, - maxAnisotropy : 1 - }; - - gd.cachedSamplers = {}; - - var maxTextureUnit = 1; - var maxUnit = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); - if (maxTextureUnit < maxUnit) - { - maxTextureUnit = maxUnit; - } - maxUnit = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS); - if (maxTextureUnit < maxUnit) - { - maxTextureUnit = maxUnit; - } - - var textureUnits = []; - textureUnits.length = maxTextureUnit; - for (var t = 0; t < maxTextureUnit; t += 1) - { - textureUnits[t] = {}; - } - - var defaultDepthFunc = gl.LEQUAL; - var defaultBlendFuncSrc = gl.SRC_ALPHA; - var defaultBlendFuncDst = gl.ONE_MINUS_SRC_ALPHA; - var defaultCullFace = gl.BACK; - var defaultFrontFace = gl.CCW; - var defaultStencilFunc = gl.ALWAYS; - var defaultStencilOp = gl.KEEP; - - var currentState = { - depthTestEnable : true, - blendEnable : false, - cullFaceEnable : true, - stencilTestEnable : false, - polygonOffsetFillEnable : false, - depthMask : true, - depthFunc : defaultDepthFunc, - blendSrc : defaultBlendFuncSrc, - blendDst : defaultBlendFuncDst, - cullFace : defaultCullFace, - frontFace : defaultFrontFace, - colorMask : [true, true, true, true], - stencilFunc : defaultStencilFunc, - stencilRef : 0, - stencilMask : 0xffffffff, - stencilFail : defaultStencilOp, - stencilZFail : defaultStencilOp, - stencilZPass : defaultStencilOp, - polygonOffsetFactor : 0, - polygonOffsetUnits : 0, - lineWidth : 1, - - renderStatesToReset : [], - - viewportBox : [0, 0, width, height], - scissorBox : [0, 0, width, height], - - clearColor : [0, 0, 0, 1], - clearDepth : 1.0, - clearStencil : 0, - - activeTextureUnit : 0, - maxTextureUnit : maxTextureUnit, - lastMaxTextureUnit: 0, - textureUnits : textureUnits, - - program : null - }; - gd.state = currentState; - - // State handlers - function setDepthTestEnable(enable) - { - if (currentState.depthTestEnable !== enable) - { - currentState.depthTestEnable = enable; - if (enable) - { - gl.enable(gl.DEPTH_TEST); - } - else - { - gl.disable(gl.DEPTH_TEST); - } - } - } - - function setDepthFunc(func) - { - if (currentState.depthFunc !== func) - { - currentState.depthFunc = func; - gl.depthFunc(func); - } - } - - function setDepthMask(enable) - { - if (currentState.depthMask !== enable) - { - currentState.depthMask = enable; - gl.depthMask(enable); - } - } - - function setBlendEnable(enable) - { - if (currentState.blendEnable !== enable) - { - currentState.blendEnable = enable; - if (enable) - { - gl.enable(gl.BLEND); - } - else - { - gl.disable(gl.BLEND); - } - } - } - - function setBlendFunc(src, dst) - { - if (currentState.blendSrc !== src || currentState.blendDst !== dst) - { - currentState.blendSrc = src; - currentState.blendDst = dst; - gl.blendFunc(src, dst); - } - } - - function setCullFaceEnable(enable) - { - if (currentState.cullFaceEnable !== enable) - { - currentState.cullFaceEnable = enable; - if (enable) - { - gl.enable(gl.CULL_FACE); - } - else - { - gl.disable(gl.CULL_FACE); - } - } - } - - function setCullFace(face) - { - if (currentState.cullFace !== face) - { - currentState.cullFace = face; - gl.cullFace(face); - } - } - - function setFrontFace(face) - { - if (currentState.frontFace !== face) - { - currentState.frontFace = face; - gl.frontFace(face); - } - } - - function setColorMask(mask0, mask1, mask2, mask3) - { - var colorMask = currentState.colorMask; - if (colorMask[0] !== mask0 || - colorMask[1] !== mask1 || - colorMask[2] !== mask2 || - colorMask[3] !== mask3) - { - colorMask[0] = mask0; - colorMask[1] = mask1; - colorMask[2] = mask2; - colorMask[3] = mask3; - gl.colorMask(mask0, mask1, mask2, mask3); - } - } - - function setStencilTestEnable(enable) - { - if (currentState.stencilTestEnable !== enable) - { - currentState.stencilTestEnable = enable; - if (enable) - { - gl.enable(gl.STENCIL_TEST); - } - else - { - gl.disable(gl.STENCIL_TEST); - } - } - } - - function setStencilFunc(stencilFunc, stencilRef, stencilMask) - { - if (currentState.stencilFunc !== stencilFunc || - currentState.stencilRef !== stencilRef || - currentState.stencilMask !== stencilMask) - { - currentState.stencilFunc = stencilFunc; - currentState.stencilRef = stencilRef; - currentState.stencilMask = stencilMask; - gl.stencilFunc(stencilFunc, stencilRef, stencilMask); - } - } - - function setStencilOp(stencilFail, stencilZfail, stencilZpass) - { - if (currentState.stencilFail !== stencilFail || - currentState.stencilZFail !== stencilZfail || - currentState.stencilZPass !== stencilZpass) - { - currentState.stencilFail = stencilFail; - currentState.stencilZFail = stencilZfail; - currentState.stencilZPass = stencilZpass; - gl.stencilOp(stencilFail, stencilZfail, stencilZpass); - } - } - - function setPolygonOffsetFillEnable(enable) - { - if (currentState.polygonOffsetFillEnable !== enable) - { - currentState.polygonOffsetFillEnable = enable; - if (enable) - { - gl.enable(gl.POLYGON_OFFSET_FILL); - } - else - { - gl.disable(gl.POLYGON_OFFSET_FILL); - } - } - } - - function setPolygonOffset(factor, units) - { - if (currentState.polygonOffsetFactor !== factor || - currentState.polygonOffsetUnits !== units) - { - currentState.polygonOffsetFactor = factor; - currentState.polygonOffsetUnits = units; - gl.polygonOffset(factor, units); - } - } - - function setLineWidth(lineWidth) - { - if (currentState.lineWidth !== lineWidth) - { - currentState.lineWidth = lineWidth; - gl.lineWidth(lineWidth); - } - } - - function resetDepthTestEnable() - { - //setDepthTestEnable(true); - if (!currentState.depthTestEnable) - { - currentState.depthTestEnable = true; - gl.enable(gl.DEPTH_TEST); - } - } - - function resetDepthFunc() - { - //setDepthFunc(defaultDepthFunc); - var func = defaultDepthFunc; - if (currentState.depthFunc !== func) - { - currentState.depthFunc = func; - gl.depthFunc(func); - } - } - - function resetDepthMask() - { - //setDepthMask(true); - if (!currentState.depthMask) - { - currentState.depthMask = true; - gl.depthMask(true); - } - } - - function resetBlendEnable() - { - //setBlendEnable(false); - if (currentState.blendEnable) - { - currentState.blendEnable = false; - gl.disable(gl.BLEND); - } - } - - function resetBlendFunc() - { - //setBlendFunc(defaultBlendFuncSrc, defaultBlendFuncDst); - var src = defaultBlendFuncSrc; - var dst = defaultBlendFuncDst; - if (currentState.blendSrc !== src || currentState.blendDst !== dst) - { - currentState.blendSrc = src; - currentState.blendDst = dst; - gl.blendFunc(src, dst); - } - } - - function resetCullFaceEnable() - { - //setCullFaceEnable(true); - if (!currentState.cullFaceEnable) - { - currentState.cullFaceEnable = true; - gl.enable(gl.CULL_FACE); - } - } - - function resetCullFace() - { - //setCullFace(defaultCullFace); - var face = defaultCullFace; - if (currentState.cullFace !== face) - { - currentState.cullFace = face; - gl.cullFace(face); - } - } - - function resetFrontFace() - { - //setFrontFace(defaultFrontFace); - var face = defaultFrontFace; - if (currentState.frontFace !== face) - { - currentState.frontFace = face; - gl.frontFace(face); - } - } - - function resetColorMask() - { - //setColorMask(true, true, true, true); - var colorMask = currentState.colorMask; - if (colorMask[0] !== true || - colorMask[1] !== true || - colorMask[2] !== true || - colorMask[3] !== true) - { - colorMask[0] = true; - colorMask[1] = true; - colorMask[2] = true; - colorMask[3] = true; - gl.colorMask(true, true, true, true); - } - } - - function resetStencilTestEnable() - { - //setStencilTestEnable(false); - if (currentState.stencilTestEnable) - { - currentState.stencilTestEnable = false; - gl.disable(gl.STENCIL_TEST); - } - } - - function resetStencilFunc() - { - //setStencilFunc(defaultStencilFunc, 0, 0xffffffff); - var stencilFunc = defaultStencilFunc; - if (currentState.stencilFunc !== stencilFunc || - currentState.stencilRef !== 0 || - currentState.stencilMask !== 0xffffffff) - { - currentState.stencilFunc = stencilFunc; - currentState.stencilRef = 0; - currentState.stencilMask = 0xffffffff; - gl.stencilFunc(stencilFunc, 0, 0xffffffff); - } - } - - function resetStencilOp() - { - //setStencilOp(defaultStencilOp, defaultStencilOp, defaultStencilOp); - var stencilOp = defaultStencilOp; - if (currentState.stencilFail !== stencilOp || - currentState.stencilZFail !== stencilOp || - currentState.stencilZPass !== stencilOp) - { - currentState.stencilFail = stencilOp; - currentState.stencilZFail = stencilOp; - currentState.stencilZPass = stencilOp; - gl.stencilOp(stencilOp, stencilOp, stencilOp); - } - } - - function resetPolygonOffsetFillEnable() - { - //setPolygonOffsetFillEnable(false); - if (currentState.polygonOffsetFillEnable) - { - currentState.polygonOffsetFillEnable = false; - gl.disable(gl.POLYGON_OFFSET_FILL); - } - } - - function resetPolygonOffset() - { - //setPolygonOffset(0, 0); - if (currentState.polygonOffsetFactor !== 0 || - currentState.polygonOffsetUnits !== 0) - { - currentState.polygonOffsetFactor = 0; - currentState.polygonOffsetUnits = 0; - gl.polygonOffset(0, 0); - } - } - - function resetLineWidth() - { - //setLineWidth(1); - if (currentState.lineWidth !== 1) - { - currentState.lineWidth = 1; - gl.lineWidth(1); - } - } - - function parseBoolean(state) - { - if (typeof state === 'number') - { - return (state ? true : false); - } - if (typeof state !== 'boolean') - { - // TODO - return null; - } - return [state]; - } - - function parseEnum(state) - { - if (typeof state !== 'number') - { - // TODO - return null; - } - return [state]; - } - - function parseEnum2(state) - { - if (typeof state === 'object') - { - var value0 = state[0], value1 = state[1]; - if (typeof value0 !== 'number') - { - // TODO - return null; - } - if (typeof value1 !== 'number') - { - // TODO - return null; - } - return [value0, value1]; - } - return null; - } - - function parseEnum3(state) - { - if (typeof state === 'object') - { - var value0 = state[0], value1 = state[1], value2 = state[2]; - if (typeof value0 !== 'number') - { - // TODO - return null; - } - if (typeof value1 !== 'number') - { - // TODO - return null; - } - if (typeof value2 !== 'number') - { - // TODO - return null; - } - return [value0, value1, value2]; - } - return null; - } - - function parseFloat(state) - { - if (typeof state !== 'number') - { - // TODO - return null; - } - return [state]; - } - - function parseFloat2(state) - { - if (typeof state === 'object') - { - var value0 = state[0], value1 = state[1]; - if (typeof value0 !== 'number') - { - // TODO - return null; - } - if (typeof value1 !== 'number') - { - // TODO - return null; - } - return [value0, value1]; - } - return null; - } - - function parseColorMask(state) - { - if (typeof state === 'object') - { - var value0 = state[0], value1 = state[1], value2 = state[2], value3 = state[3]; - if (typeof value0 !== 'number') - { - // TODO - return null; - } - if (typeof value1 !== 'number') - { - // TODO - return null; - } - if (typeof value2 !== 'number') - { - // TODO - return null; - } - if (typeof value3 !== 'number') - { - // TODO - return null; - } - return [value0, value1, value2, value3]; - } - return null; - } - - var stateHandlers = {}; - function addStateHandler(name, sf, rf, pf, dv) - { - stateHandlers[name] = { - set: sf, - reset: rf, - parse: pf, - defaultValues: dv - }; - } - addStateHandler("DepthTestEnable", setDepthTestEnable, resetDepthTestEnable, parseBoolean, [true]); - addStateHandler("DepthFunc", setDepthFunc, resetDepthFunc, parseEnum, [defaultDepthFunc]); - addStateHandler("DepthMask", setDepthMask, resetDepthMask, parseBoolean, [true]); - addStateHandler("BlendEnable", setBlendEnable, resetBlendEnable, parseBoolean, [false]); - addStateHandler("BlendFunc", setBlendFunc, resetBlendFunc, parseEnum2, [defaultBlendFuncSrc, defaultBlendFuncDst]); - addStateHandler("CullFaceEnable", setCullFaceEnable, resetCullFaceEnable, parseBoolean, [true]); - addStateHandler("CullFace", setCullFace, resetCullFace, parseEnum, [defaultCullFace]); - addStateHandler("FrontFace", setFrontFace, resetFrontFace, parseEnum, [defaultFrontFace]); - addStateHandler("ColorMask", setColorMask, resetColorMask, parseColorMask, [true, true, true, true]); - addStateHandler("StencilTestEnable", setStencilTestEnable, resetStencilTestEnable, parseBoolean, [false]); - addStateHandler("StencilFunc", setStencilFunc, resetStencilFunc, parseEnum3, [defaultStencilFunc, 0, 0xffffffff]); - addStateHandler("StencilOp", setStencilOp, resetStencilOp, parseEnum3, [defaultStencilOp, defaultStencilOp, defaultStencilOp]); - addStateHandler("PolygonOffsetFillEnable", setPolygonOffsetFillEnable, resetPolygonOffsetFillEnable, parseBoolean, [false]); - addStateHandler("PolygonOffset", setPolygonOffset, resetPolygonOffset, parseFloat2, [0, 0]); - addStateHandler("LineWidth", setLineWidth, resetLineWidth, parseFloat, [1]); - gd.stateHandlers = stateHandlers; - - gd.syncState(); - - gd.videoRam = 0; - gd.desktopWidth = window.screen.width; - gd.desktopHeight = window.screen.height; - - if (Object.defineProperty) - { - Object.defineProperty(gd, "fullscreen", { - get : function getFullscreenFn() { - return (document.fullscreenEnabled || - document.mozFullScreen || - document.webkitIsFullScreen || - false); - }, - set : function setFullscreenFn(newFullscreen) { - gd.requestFullScreen(newFullscreen); - }, - enumerable : true, - configurable : false - }); - - gd.checkFullScreen = function dummyCheckFullScreenFn() - { - }; - } - else - { - gd.fullscreen = false; - gd.oldFullscreen = false; - } - - gd.clientStateMask = 0; - gd.attributeMask = 0; - gd.activeTechnique = null; - gd.activeIndexBuffer = null; - gd.bindedVertexBuffer = 0; - gd.activeRenderTarget = null; - - gd.immediateVertexBuffer = gd.createVertexBuffer({ - numVertices: (256 * 1024 / 16), - attributes: ['FLOAT4'], - dynamic: true, - 'transient': true - }); - gd.immediatePrimitive = -1; - gd.immediateSemantics = []; - - gd.fps = 0; - gd.numFrames = 0; - gd.previousFrameTime = TurbulenzEngine.getTime(); - - return gd; -}; diff --git a/spine-turbulenz/turbulenz/turbulenzengine.js b/spine-turbulenz/turbulenz/turbulenzengine.js deleted file mode 100644 index 0c75d3d59..000000000 --- a/spine-turbulenz/turbulenz/turbulenzengine.js +++ /dev/null @@ -1,843 +0,0 @@ -// Copyright (c) 2011-2012 Turbulenz Limited -/*global VMath*/ -/*global WebGLGraphicsDevice*/ -/*global WebGLInputDevice*/ -/*global WebGLSoundDevice*/ -/*global WebGLPhysicsDevice*/ -/*global WebGLNetworkDevice*/ -/*global Float32Array*/ -/*global console*/ -/*global window*/ -"use strict"; - -// -// WebGLTurbulenzEngine -// -function WebGLTurbulenzEngine() {} -WebGLTurbulenzEngine.prototype = { - - version : '0.24.0.0', - - setInterval: function (f, t) - { - var that = this; - return window.setInterval(function () { - that.updateTime(); - f(); - }, t); - }, - - clearInterval: function (i) - { - return window.clearInterval(i); - }, - - createGraphicsDevice: function (params) - { - if (this.graphicsDevice) - { - this.callOnError('GraphicsDevice already created'); - return null; - } - else - { - var graphicsDevice = WebGLGraphicsDevice.create(this.canvas, params); - this.graphicsDevice = graphicsDevice; - return graphicsDevice; - } - }, - - createPhysicsDevice: function (params) - { - if (this.physicsDevice) - { - this.callOnError('PhysicsDevice already created'); - return null; - } - else - { - var physicsDevice; - var plugin = this.getPluginObject(); - if (plugin) - { - physicsDevice = plugin.createPhysicsDevice(params); - } - else - { - physicsDevice = WebGLPhysicsDevice.create(params); - } - this.physicsDevice = physicsDevice; - return physicsDevice; - } - }, - - createSoundDevice: function (params) - { - if (this.soundDevice) - { - this.callOnError('SoundDevice already created'); - return null; - } - else - { - var soundDevice; - var plugin = this.getPluginObject(); - if (plugin) - { - soundDevice = plugin.createSoundDevice(params); - } - else - { - soundDevice = WebGLSoundDevice.create(params); - } - this.soundDevice = soundDevice; - return soundDevice; - } - }, - - createInputDevice: function (params) - { - if (this.inputDevice) - { - this.callOnError('InputDevice already created'); - return null; - } - else - { - var inputDevice = WebGLInputDevice.create(this.canvas, params); - this.inputDevice = inputDevice; - return inputDevice; - } - }, - - createNetworkDevice: function (params) - { - if (this.networkDevice) - { - throw 'NetworkDevice already created'; - } - else - { - var networkDevice = WebGLNetworkDevice.create(params); - this.networkDevice = networkDevice; - return networkDevice; - } - }, - - createMathDevice: function (/* params */) - { - // Check if the browser supports using apply with Float32Array - try - { - var testVector = new Float32Array([1, 2, 3]); - - VMath.v3Build.apply(VMath, testVector); - - // Clamp FLOAT_MAX - testVector[0] = VMath.FLOAT_MAX; - VMath.FLOAT_MAX = testVector[0]; - } - catch (e) - { - } - - return VMath; - }, - - createNativeMathDevice: function (/* params */) - { - return VMath; - }, - - getGraphicsDevice: function () - { - var graphicsDevice = this.graphicsDevice; - if (graphicsDevice === null) - { - this.callOnError("GraphicsDevice not created yet."); - } - return graphicsDevice; - }, - - getPhysicsDevice: function () - { - return this.physicsDevice; - }, - - getSoundDevice: function () - { - return this.soundDevice; - }, - - getInputDevice: function () - { - return this.inputDevice; - }, - - getNetworkDevice: function () - { - return this.networkDevice; - }, - - getMathDevice: function () - { - return VMath; - }, - - getNativeMathDevice: function () - { - return VMath; - }, - - flush: function () - { - - }, - - run: function () - { - - }, - - encrypt: function (msg) - { - return msg; - }, - - decrypt: function (msg) - { - return msg; - }, - - generateSignature: function (/* msg */) - { - return null; - }, - - verifySignature: function (/* msg, sig */) - { - return true; - }, - - onerror: function (msg) - { - console.error(msg); - }, - - onwarning: function (msg) - { - console.warn(msg); - }, - - getSystemInfo: function () - { - return this.systemInfo; - }, - - request: function (url, callback) - { - var that = this; - - var xhr; - if (window.XMLHttpRequest) - { - xhr = new window.XMLHttpRequest(); - } - else if (window.ActiveXObject) - { - xhr = new window.ActiveXObject("Microsoft.XMLHTTP"); - } - else - { - that.callOnError("No XMLHTTPRequest object could be created"); - return; - } - - function httpRequestCallback() - { - if (xhr.readyState === 4) /* 4 == complete */ - { - if (!that.isUnloading()) - { - var xhrResponseText = xhr.responseText; - var xhrStatus = xhr.status; - - if ("" === xhrResponseText) - { - xhrResponseText = null; - } - - if (null === xhr.getResponseHeader("Content-Type") && - "" === xhr.getAllResponseHeaders()) - { - // Sometimes the browser sets status to 200 OK - // when the connection is closed before the - // message is sent (weird!). In order to address - // this we fail any completely empty responses. - // Hopefully, nobody will get a valid response - // with no headers and no body! - // Except that for cross domain requests getAllResponseHeaders ALWAYS returns an empty string - // even for valid responses... - callback(null, 0); - return; - } - - // Fix for loading from file - if (xhrStatus === 0 && xhrResponseText && window.location.protocol === "file:") - { - xhrStatus = 200; - } - - // Invoke the callback - if (xhrStatus !== 0) - { - // Under these conditions, we return a null - // response text. - - if (404 === xhrStatus) - { - xhrResponseText = null; - } - - callback(xhrResponseText, xhrStatus); - } - else - { - // Checking xhr.statusText when xhr.status is - // 0 causes a silent error - - callback(xhrResponseText, 0); - } - } - - // break circular reference - xhr.onreadystatechange = null; - xhr = null; - callback = null; - } - } - - xhr.open('GET', url, true); - if (callback) - { - xhr.onreadystatechange = httpRequestCallback; - } - xhr.send(); - }, - - // Internals - destroy : function () - { - if (this.networkDevice) - { - delete this.networkDevice; - } - if (this.inputDevice) - { - this.inputDevice.destroy(); - delete this.inputDevice; - } - if (this.physicsDevice) - { - delete this.physicsDevice; - } - if (this.soundDevice) - { - if (this.soundDevice.destroy) - { - this.soundDevice.destroy(); - } - delete this.soundDevice; - } - if (this.graphicsDevice) - { - this.graphicsDevice.destroy(); - delete this.graphicsDevice; - } - if (this.canvas) - { - delete this.canvas; - } - if (this.resizeCanvas) - { - window.removeEventListener('resize', this.resizeCanvas, false); - } - }, - - getPluginObject : function () - { - if (!this.plugin && - this.pluginId) - { - this.plugin = document.getElementById(this.pluginId); - } - return this.plugin; - }, - - unload : function () - { - if (!this.unloading) - { - this.unloading = true; - if (this.onunload) - { - this.onunload(); - } - if (this.destroy) - { - this.destroy(); - } - } - }, - - isUnloading : function () - { - return this.unloading; - }, - - enableProfiling : function () - { - }, - - startProfiling : function () - { - if (console && console.profile && console.profileEnd) - { - console.profile("turbulenz"); - } - }, - - stopProfiling : function () - { - // Chrome and Safari return an object. IE and Firefox print to the console/profile tab. - var result; - if (console && console.profile && console.profileEnd) - { - console.profileEnd("turbulenz"); - if (console.profiles) - { - result = console.profiles[console.profiles.length - 1]; - } - } - - return result; - }, - - callOnError : function (msg) - { - var onerror = this.onerror; - if (onerror) - { - onerror(msg); - } - } -}; - -// Constructor function -WebGLTurbulenzEngine.create = function webGLTurbulenzEngineFn(params) -{ - var tz = new WebGLTurbulenzEngine(); - - var canvas = params.canvas; - var fillParent = params.fillParent; - - // To expose unload (the whole interaction needs a re-design) - window.TurbulenzEngineCanvas = tz; - - tz.pluginId = params.pluginId; - tz.plugin = null; - - // time property - var getTime = Date.now; - var performance = window.performance; - if (performance) - { - // It seems high resolution "now" requires a proper "this" - if (performance.now) - { - getTime = function getTimeFn() - { - return performance.now(); - }; - } - else if (performance.webkitNow) - { - getTime = function getTimeFn() - { - return performance.webkitNow(); - }; - } - } - - // To be used by the GraphicsDevice for accurate fps calculations - tz.getTime = getTime; - - var baseTime = getTime(); // all in milliseconds (our "time" property is in seconds) - - // Safari 6.0 has broken object property defines. - var canUseDefineProperty = true; - var navStr = navigator.userAgent; - var navVersionIdx = navStr.indexOf("Version/6.0"); - if (-1 !== navVersionIdx) - { - if (-1 !== navStr.substring(navVersionIdx).indexOf("Safari/")) - { - canUseDefineProperty = false; - } - } - - if (canUseDefineProperty && Object.defineProperty) - { - Object.defineProperty(tz, "time", { - get : function () { - return ((getTime() - baseTime) * 0.001); - }, - set : function (newValue) { - if (typeof newValue === 'number') - { - // baseTime is in milliseconds, newValue is in seconds - baseTime = (getTime() - (newValue * 1000)); - } - else - { - tz.callOnError("Must set 'time' attribute to a number"); - } - }, - enumerable : false, - configurable : false - }); - - tz.updateTime = function () - { - }; - } - else - { - tz.updateTime = function () - { - this.time = ((getTime() - baseTime) * 0.001); - }; - } - - // fast zero timeouts - if (window.postMessage) - { - var zeroTimeoutMessageName = "0-timeout-message"; - var timeouts = []; - var timeId = 0; - - var setZeroTimeout = function setZeroTimeoutFn(fn) - { - timeId += 1; - var timeout = { - id : timeId, - fn : fn - }; - timeouts.push(timeout); - window.postMessage(zeroTimeoutMessageName, "*"); - return timeout; - }; - - var clearZeroTimeout = function clearZeroTimeoutFn(timeout) - { - var id = timeout; - var numTimeouts = timeouts.length; - for (var n = 0; n < numTimeouts; n += 1) - { - if (timeouts[n].id === id) - { - timeouts.splice(n, 1); - return; - } - } - }; - - var handleZeroTimeoutMessages = function handleZeroTimeoutMessagesFn(event) - { - if (event.source === window && - event.data === zeroTimeoutMessageName) - { - event.stopPropagation(); - - if (timeouts.length && !tz.isUnloading()) - { - var timeout = timeouts.shift(); - var fn = timeout.fn; - fn(); - } - } - }; - window.addEventListener("message", handleZeroTimeoutMessages, true); - - tz.setTimeout = function (f, t) - { - if (t < 1) - { - return setZeroTimeout(f); - } - else - { - var that = this; - return window.setTimeout(function () { - that.updateTime(); - if (!that.isUnloading()) - { - f(); - } - }, t); - } - }; - - tz.clearTimeout = function (i) - { - if (typeof i === 'object') - { - return clearZeroTimeout(i); - } - else - { - return window.clearTimeout(i); - } - }; - } - else - { - tz.setTimeout = function (f, t) - { - var that = this; - return window.setTimeout(function () { - that.updateTime(); - if (!that.isUnloading()) - { - f(); - } - }, t); - }; - - tz.clearTimeout = function (i) - { - return window.clearTimeout(i); - }; - } - - var requestAnimationFrame = (window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - window.mozRequestAnimationFrame); - if (requestAnimationFrame) - { - tz.setInterval = function (f, t) - { - var that = this; - if (Math.abs(t - (1000 / 60)) <= 1) - { - var interval = { - enabled: true - }; - var wrap1 = function wrap1() - { - if (interval.enabled) - { - that.updateTime(); - if (!that.isUnloading()) - { - f(); - } - requestAnimationFrame(wrap1, that.canvas); - } - }; - requestAnimationFrame(wrap1, that.canvas); - return interval; - } - else - { - var wrap2 = function wrap2() - { - that.updateTime(); - if (!that.isUnloading()) - { - f(); - } - }; - return window.setInterval(wrap2, t); - } - }; - - tz.clearInterval = function (i) - { - if (typeof i === 'object') - { - i.enabled = false; - } - else - { - window.clearInterval(i); - } - }; - } - - tz.canvas = canvas; - tz.networkDevice = null; - tz.inputDevice = null; - tz.physicsDevice = null; - tz.soundDevice = null; - tz.graphicsDevice = null; - - if (fillParent) - { - // Resize canvas to fill parent - tz.resizeCanvas = function () - { - canvas.width = canvas.parentNode.clientWidth; - canvas.height = canvas.parentNode.clientHeight; - }; - - tz.resizeCanvas(); - - window.addEventListener('resize', tz.resizeCanvas, false); - } - - var previousOnBeforeUnload = window.onbeforeunload; - window.onbeforeunload = function () - { - tz.unload(); - - if (previousOnBeforeUnload) - { - previousOnBeforeUnload.call(this); - } - }; - - tz.time = 0; - - // System info - var systemInfo = { - architecture: '', - cpuDescription: '', - cpuVendor: '', - numPhysicalCores: 1, - numLogicalCores: 1, - ramInMegabytes: 0, - frequencyInMegaHZ: 0, - osVersionMajor: 0, - osVersionMinor: 0, - osVersionBuild: 0, - osName: navigator.platform, - userLocale: (navigator.language || navigator.userLanguage).replace('-', '_') - }; - var userAgent = navigator.userAgent; - var osIndex = userAgent.indexOf('Windows'); - if (osIndex !== -1) - { - systemInfo.osName = 'Windows'; - if (navigator.platform === 'Win64') - { - systemInfo.architecture = 'x86_64'; - } - else if (navigator.platform === 'Win32') - { - systemInfo.architecture = 'x86'; - } - osIndex += 7; - if (userAgent.slice(osIndex, (osIndex + 4)) === ' NT ') - { - osIndex += 4; - systemInfo.osVersionMajor = parseInt(userAgent.slice(osIndex, (osIndex + 1)), 10); - systemInfo.osVersionMinor = parseInt(userAgent.slice((osIndex + 2), (osIndex + 4)), 10); - } - } - else - { - osIndex = userAgent.indexOf('Mac OS X'); - if (osIndex !== -1) - { - systemInfo.osName = 'Darwin'; - if (navigator.platform.indexOf('Intel') !== -1) - { - systemInfo.architecture = 'x86'; - } - osIndex += 9; - systemInfo.osVersionMajor = parseInt(userAgent.slice(osIndex, (osIndex + 2)), 10); - systemInfo.osVersionMinor = parseInt(userAgent.slice((osIndex + 3), (osIndex + 4)), 10); - systemInfo.osVersionBuild = (parseInt(userAgent.slice((osIndex + 5), (osIndex + 6)), 10) || 0); - } - else - { - osIndex = userAgent.indexOf('Linux'); - if (osIndex !== -1) - { - systemInfo.osName = 'Linux'; - if (navigator.platform.indexOf('64') !== -1) - { - systemInfo.architecture = 'x86_64'; - } - else if (navigator.platform.indexOf('x86') !== -1) - { - systemInfo.architecture = 'x86'; - } - } - } - } - tz.systemInfo = systemInfo; - - var b64ConversionTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".split(''); - - tz.base64Encode = function base64EncodeFn(bytes) - { - var output = ""; - var numBytes = bytes.length; - var valueToChar = b64ConversionTable; - var n, chr1, chr2, chr3, enc1, enc2, enc3, enc4; - - /*jshint bitwise: false*/ - n = 0; - while (n < numBytes) - { - chr1 = bytes[n]; - n += 1; - - enc1 = (chr1 >> 2); - - if (n < numBytes) - { - chr2 = bytes[n]; - n += 1; - - if (n < numBytes) - { - chr3 = bytes[n]; - n += 1; - - enc2 = (((chr1 & 3) << 4) | (chr2 >> 4)); - enc3 = (((chr2 & 15) << 2) | (chr3 >> 6)); - enc4 = (chr3 & 63); - } - else - { - enc2 = (((chr1 & 3) << 4) | (chr2 >> 4)); - enc3 = ((chr2 & 15) << 2); - enc4 = 64; - } - } - else - { - enc2 = ((chr1 & 3) << 4); - enc3 = 64; - enc4 = 64; - } - - output += valueToChar[enc1]; - output += valueToChar[enc2]; - output += valueToChar[enc3]; - output += valueToChar[enc4]; - } - /*jshint bitwise: true*/ - - return output; - }; - - return tz; -}; - -window.WebGLTurbulenzEngine = WebGLTurbulenzEngine;