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;