diff --git a/spine-as3/README.md b/spine-as3/README.md index 33b21559b..7c472452f 100644 --- a/spine-as3/README.md +++ b/spine-as3/README.md @@ -10,18 +10,32 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-as3 works with data exported from Spine 3.1.08. Updating spine-as3 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-as3 works with data exported from the latest Spine version. spine-as3 supports all Spine features, including meshes. If using the `spine.flash` classes for rendering, meshes are not supported. spine-as3 does not yet support loading the binary format. -## Setup +## Usage +1. Create a new Flex or Adobe AIR project in your preferred IDE. +2. Download the Spine Runtimes source using git (`git clone https://github.com/esotericsoftware/spine-runtimes`) or download it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip) +3. Add the sources from `spine-as3/spine-as3/src/` to your project -1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip). -1. Using [FDT](http://fdt.powerflasher.com/), import the spine-as3 project by choosing File -> Import -> Existing projects. For other IDEs you will need to create a new project and import the source. +## Example +The Spine AS3 example works on Windows, Linux and Mac OS X. This guide assumes you are using [FDT Free](http://fdt.powerflasher.com/) as your development environment. -Alternatively, the contents of the `spine-as3/src` directory can be copied into your project. +1. Download [FDT free](http://fdt.powerflasher.com/buy-download/) for your operating system. +3. Download and install Adobe Flash Player 22 with debugging support](https://www.adobe.com/support/flashplayer/debug_downloads.html#fp15) +2. Download the latest [Flex SDK](http://www.adobe.com/devnet/flex/flex-sdk-download.html). We assume it will be installed to some folder on your disk called `flex_sdk`. +3. Download the latest [Adobe AIR SDK](http://www.adobe.com/devnet/air/air-sdk-download.html) +4. Extract the AIR SDK contents, and copy them to your `flex_sdk` folder. This will replace the Adobe AIR version shipped with Flex. +5. Open FDT, go to `Preferences -> FDT -> Installed SDKs` +6. Click `Add` and browse to `flex_sdk` +7. Go to `File -> Import -> General -> Existing Projects into Workspace` +6. Browse to `spine-as3/`. You should see both the `spine-as3` and `spine-as3-example` project in the import dialog. Click `Finish` +8. Right click the `Main.as` file in `spine-as3-example/src/spine` in the FDT explorer and select `Debug As -> FDT SWF Application` + +**Note**: FDT Free does not allow project dependencies. If you modify the sources of `spine-as3`, you will have to compile the project to an `.swc` and place it in `spine-as3-example/libs`. ## Demos diff --git a/spine-as3/spine-as3-example/.settings/com.powerflasher.fdt.core.prefs b/spine-as3/spine-as3-example/.settings/com.powerflasher.fdt.core.prefs index f1f8e07dd..fe086a943 100644 --- a/spine-as3/spine-as3-example/.settings/com.powerflasher.fdt.core.prefs +++ b/spine-as3/spine-as3-example/.settings/com.powerflasher.fdt.core.prefs @@ -3,6 +3,7 @@ com.powerflasher.fdt.core.CompilerArguments=-static-link-runtime-shared-librarie com.powerflasher.fdt.core.CompilerConstants=CONFIG\:\:AUTHOR\!"{user.name}"\nCONFIG\:\:DEBUG\!{debug} com.powerflasher.fdt.core.DefaultOutputFolder=bin com.powerflasher.fdt.core.DefaultPlayer=External_SWF_Viewer +com.powerflasher.fdt.core.IncludeTestResources=false com.powerflasher.fdt.core.Language=AS3 com.powerflasher.fdt.core.Manifests= com.powerflasher.fdt.core.PassClasspath=true @@ -13,7 +14,7 @@ com.powerflasher.fdt.core.PassManifests=true com.powerflasher.fdt.core.PassRsls=false com.powerflasher.fdt.core.PassSwcs=true com.powerflasher.fdt.core.PlatformType=WEB -com.powerflasher.fdt.core.PlayerVersion=11.1 +com.powerflasher.fdt.core.PlayerVersion=22.0 com.powerflasher.fdt.core.ProjectTypeHint=Web com.powerflasher.fdt.core.Runtime=Flash_Player com.powerflasher.fdt.core.SdkName=Flex 4.6.0 diff --git a/spine-as3/spine-as3-example/.settings/launch/spine-as3-example.launch b/spine-as3/spine-as3-example/.settings/launch/spine-as3-example.launch index 0423423fd..ef1cb5c89 100644 --- a/spine-as3/spine-as3-example/.settings/launch/spine-as3-example.launch +++ b/spine-as3/spine-as3-example/.settings/launch/spine-as3-example.launch @@ -13,7 +13,7 @@ - + diff --git a/spine-as3/spine-as3-example/lib/spine-as3.swc b/spine-as3/spine-as3-example/lib/spine-as3.swc index 9e90cbc9d..109a011b5 100644 Binary files a/spine-as3/spine-as3-example/lib/spine-as3.swc and b/spine-as3/spine-as3-example/lib/spine-as3.swc differ diff --git a/spine-as3/spine-as3-example/src/goblins-mesh.atlas b/spine-as3/spine-as3-example/src/goblins-mesh.atlas deleted file mode 100644 index d0ddb80c6..000000000 --- a/spine-as3/spine-as3-example/src/goblins-mesh.atlas +++ /dev/null @@ -1,292 +0,0 @@ - -goblins-mesh.png -format: RGBA8888 -filter: Linear,Linear -repeat: none -dagger - rotate: true - xy: 372, 100 - size: 26, 108 - orig: 26, 108 - offset: 0, 0 - index: -1 -goblin/eyes-closed - rotate: false - xy: 2, 7 - size: 34, 12 - orig: 34, 12 - offset: 0, 0 - index: -1 -goblin/head - rotate: false - xy: 107, 36 - size: 103, 66 - orig: 103, 66 - offset: 0, 0 - index: -1 -goblin/left-arm - rotate: false - xy: 901, 56 - size: 37, 35 - orig: 37, 35 - offset: 0, 0 - index: -1 -goblin/left-foot - rotate: false - xy: 929, 95 - size: 65, 31 - orig: 65, 31 - offset: 0, 0 - index: -1 -goblin/left-hand - rotate: false - xy: 452, 2 - size: 36, 41 - orig: 36, 41 - offset: 0, 0 - index: -1 -goblin/left-lower-leg - rotate: true - xy: 713, 93 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblin/left-shoulder - rotate: false - xy: 610, 44 - size: 29, 44 - orig: 29, 44 - offset: 0, 0 - index: -1 -goblin/left-upper-leg - rotate: true - xy: 638, 93 - size: 33, 73 - orig: 33, 73 - offset: 0, 0 - index: -1 -goblin/neck - rotate: false - xy: 490, 2 - size: 36, 41 - orig: 36, 41 - offset: 0, 0 - index: -1 -goblin/pelvis - rotate: false - xy: 482, 45 - size: 62, 43 - orig: 62, 43 - offset: 0, 0 - index: -1 -goblin/right-arm - rotate: true - xy: 690, 2 - size: 23, 50 - orig: 23, 50 - offset: 0, 0 - index: -1 -goblin/right-foot - rotate: false - xy: 771, 58 - size: 63, 33 - orig: 63, 33 - offset: 0, 0 - index: -1 -goblin/right-hand - rotate: false - xy: 940, 56 - size: 36, 37 - orig: 36, 37 - offset: 0, 0 - index: -1 -goblin/right-lower-leg - rotate: true - xy: 482, 90 - size: 36, 76 - orig: 36, 76 - offset: 0, 0 - index: -1 -goblin/right-shoulder - rotate: true - xy: 602, 3 - size: 39, 45 - orig: 39, 45 - offset: 0, 0 - index: -1 -goblin/right-upper-leg - rotate: true - xy: 641, 57 - size: 34, 63 - orig: 34, 63 - offset: 0, 0 - index: -1 -goblin/torso - rotate: true - xy: 212, 34 - size: 68, 96 - orig: 68, 96 - offset: 0, 0 - index: -1 -goblin/undie-straps - rotate: false - xy: 380, 5 - size: 55, 19 - orig: 55, 19 - offset: 0, 0 - index: -1 -goblin/undies - rotate: false - xy: 174, 5 - size: 36, 29 - orig: 36, 29 - offset: 0, 0 - index: -1 -goblingirl/eyes-closed - rotate: false - xy: 269, 11 - size: 37, 21 - orig: 37, 21 - offset: 0, 0 - index: -1 -goblingirl/head - rotate: false - xy: 2, 21 - size: 103, 81 - orig: 103, 81 - offset: 0, 0 - index: -1 -goblingirl/left-arm - rotate: true - xy: 978, 56 - size: 37, 35 - orig: 37, 35 - offset: 0, 0 - index: -1 -goblingirl/left-foot - rotate: false - xy: 107, 3 - size: 65, 31 - orig: 65, 31 - offset: 0, 0 - index: -1 -goblingirl/left-hand - rotate: false - xy: 565, 2 - size: 35, 40 - orig: 35, 40 - offset: 0, 0 - index: -1 -goblingirl/left-lower-leg - rotate: true - xy: 785, 93 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblingirl/left-shoulder - rotate: true - xy: 690, 27 - size: 28, 46 - orig: 28, 46 - offset: 0, 0 - index: -1 -goblingirl/left-upper-leg - rotate: true - xy: 857, 93 - size: 33, 70 - orig: 33, 70 - offset: 0, 0 - index: -1 -goblingirl/neck - rotate: false - xy: 528, 2 - size: 35, 41 - orig: 35, 41 - offset: 0, 0 - index: -1 -goblingirl/pelvis - rotate: false - xy: 546, 45 - size: 62, 43 - orig: 62, 43 - offset: 0, 0 - index: -1 -goblingirl/right-arm - rotate: false - xy: 452, 48 - size: 28, 50 - orig: 28, 50 - offset: 0, 0 - index: -1 -goblingirl/right-foot - rotate: false - xy: 836, 58 - size: 63, 33 - orig: 63, 33 - offset: 0, 0 - index: -1 -goblingirl/right-hand - rotate: true - xy: 771, 20 - size: 36, 37 - orig: 36, 37 - offset: 0, 0 - index: -1 -goblingirl/right-lower-leg - rotate: true - xy: 560, 90 - size: 36, 76 - orig: 36, 76 - offset: 0, 0 - index: -1 -goblingirl/right-shoulder - rotate: false - xy: 649, 10 - size: 39, 45 - orig: 39, 45 - offset: 0, 0 - index: -1 -goblingirl/right-upper-leg - rotate: true - xy: 706, 57 - size: 34, 63 - orig: 34, 63 - offset: 0, 0 - index: -1 -goblingirl/torso - rotate: false - xy: 310, 2 - size: 68, 96 - orig: 68, 96 - offset: 0, 0 - index: -1 -goblingirl/undie-straps - rotate: false - xy: 212, 13 - size: 55, 19 - orig: 55, 19 - offset: 0, 0 - index: -1 -goblingirl/undies - rotate: false - xy: 810, 27 - size: 36, 29 - orig: 36, 29 - offset: 0, 0 - index: -1 -shield - rotate: false - xy: 380, 26 - size: 70, 72 - orig: 70, 72 - offset: 0, 0 - index: -1 -spear - rotate: true - xy: 2, 104 - size: 22, 368 - orig: 22, 368 - offset: 0, 0 - index: -1 diff --git a/spine-as3/spine-as3-example/src/goblins-mesh.json b/spine-as3/spine-as3-example/src/goblins-mesh.json deleted file mode 100644 index 67a624a36..000000000 --- a/spine-as3/spine-as3-example/src/goblins-mesh.json +++ /dev/null @@ -1,1081 +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": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 }, - { "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 }, - { "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 }, - { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 }, - { "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 }, - { "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 }, - { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 }, - { "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 }, - { "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 }, - { "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 }, - { "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 }, - { "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 }, - { "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 }, - { "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 }, - { "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }, - { "name": "spear1", "parent": "left hand", "length": 65.06, "x": 0.48, "y": 17.03, "rotation": 102.43 }, - { "name": "spear2", "parent": "spear1", "length": 61.41, "x": 65.05, "y": 0.04, "rotation": 0.9 }, - { "name": "spear3", "parent": "spear2", "length": 76.79, "x": 61.88, "y": 0.57, "rotation": -0.9 } -], -"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 thumb", "bone": "right hand", "attachment": "right hand thumb" }, - { "name": "right hand item", "bone": "right hand", "attachment": "dagger" }, - { "name": "right hand", "bone": "right hand", "attachment": "right hand" }, - { "name": "right hand item 2", "bone": "right hand", "attachment": "shield" } -], -"skins": { - "default": { - "left hand item": { - "dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 }, - "spear": { - "type": "skinnedmesh", - "uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.76608, 0.21781, 0.75642, 0.386, 0.74723, 0.54607, 0.72117, 1, 0.28838, 1, 0.24208, 0.54327, 0.22589, 0.38361, 0.2089, 0.21605, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ], - "triangles": [ 4, 7, 3, 6, 7, 4, 5, 6, 4, 10, 11, 12, 1, 13, 0, 12, 13, 1, 10, 12, 1, 9, 10, 1, 2, 9, 1, 8, 9, 2, 3, 8, 2, 7, 8, 3 ], - "vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.51, 20, -0.31, -6.16, 0.48, 2, 18, 64.73, -5.03, 0.5, 19, -0.4, -5.06, 0.49, 1, 16, 4.56, 23.91, 1, 1, 16, 41.7, -138.95, 1, 1, 16, 32.42, -141.1, 1, 1, 16, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.5, 19, 0.53, 6.59, 0.49, 2, 19, 62.18, 6.66, 0.51, 20, 0.2, 6.09, 0.48, 1, 20, 30.96, 6.61, 1, 1, 20, 37.26, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ], - "edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ], - "hull": 14, - "width": 22, - "height": 368 - } - }, - "right hand item": { - "dagger": { - "type": "mesh", - "uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ], - "triangles": [ 5, 7, 8, 4, 8, 3, 4, 5, 8, 5, 6, 7, 9, 11, 8, 8, 11, 3, 3, 0, 2, 3, 11, 0, 9, 10, 11, 0, 1, 2, 11, 12, 0, 0, 12, 13 ], - "vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ], - "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], - "hull": 14, - "width": 26, - "height": 108 - } - }, - "right hand item 2": { - "shield": { "rotation": 93.49, "width": 70, "height": 72 } - } - }, - "goblin": { - "eyes": { - "eyes closed": { "name": "goblin/eyes-closed", "x": 29.19, "y": -24.89, "rotation": -88.92, "width": 34, "height": 12 } - }, - "head": { - "head": { - "name": "goblin/head", - "type": "mesh", - "uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ], - "triangles": [ 5, 27, 6, 7, 27, 8, 7, 6, 27, 4, 24, 5, 5, 24, 27, 4, 3, 24, 27, 29, 8, 8, 29, 9, 24, 28, 27, 24, 25, 28, 24, 3, 25, 29, 28, 30, 29, 27, 28, 25, 2, 26, 25, 3, 2, 9, 29, 10, 0, 23, 1, 28, 25, 30, 29, 11, 10, 29, 30, 11, 2, 21, 26, 2, 1, 21, 23, 22, 1, 1, 22, 21, 30, 16, 11, 30, 17, 16, 30, 25, 17, 17, 26, 18, 18, 26, 19, 26, 17, 25, 11, 15, 12, 11, 16, 15, 12, 15, 13, 15, 14, 13, 21, 20, 26, 26, 20, 19 ], - "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], - "hull": 24, - "width": 103, - "height": 66 - } - }, - "left arm": { - "left arm": { - "name": "goblin/left-arm", - "type": "mesh", - "uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ], - "triangles": [ 3, 4, 2, 4, 5, 2, 5, 0, 2, 0, 1, 2, 0, 5, 8, 5, 6, 8, 6, 7, 8 ], - "vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], - "hull": 9, - "width": 37, - "height": 35 - } - }, - "left foot": { - "left foot": { - "name": "goblin/left-foot", - "type": "mesh", - "uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ], - "triangles": [ 2, 1, 3, 3, 10, 4, 4, 11, 5, 4, 10, 11, 3, 1, 10, 11, 6, 5, 1, 0, 10, 11, 7, 6, 11, 10, 7, 10, 8, 7, 10, 0, 8, 0, 9, 8 ], - "vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], - "hull": 10, - "width": 65, - "height": 31 - } - }, - "left hand": { - "left hand": { - "name": "goblin/left-hand", - "type": "mesh", - "uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ], - "triangles": [ 2, 3, 0, 4, 5, 0, 3, 4, 0, 0, 7, 8, 6, 7, 0, 0, 5, 6, 2, 0, 1 ], - "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], - "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], - "hull": 9, - "width": 36, - "height": 41 - } - }, - "left lower leg": { - "left lower leg": { - "name": "goblin/left-lower-leg", - "type": "mesh", - "uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ], - "triangles": [ 1, 3, 4, 7, 4, 5, 5, 6, 7, 3, 1, 2, 1, 4, 7, 0, 1, 10, 7, 8, 10, 1, 7, 10, 10, 8, 9 ], - "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ], - "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], - "hull": 11, - "width": 33, - "height": 70 - } - }, - "left shoulder": { - "left shoulder": { - "name": "goblin/left-shoulder", - "type": "mesh", - "uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ], - "triangles": [ 3, 1, 2, 3, 0, 1, 3, 4, 0, 4, 7, 0, 4, 5, 7, 5, 6, 7 ], - "vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ], - "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], - "hull": 8, - "width": 29, - "height": 44 - } - }, - "left upper leg": { - "left upper leg": { - "name": "goblin/left-upper-leg", - "type": "mesh", - "uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ], - "triangles": [ 3, 4, 2, 2, 4, 1, 1, 4, 7, 4, 5, 7, 0, 1, 7, 5, 6, 7, 7, 8, 0 ], - "vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ], - "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], - "hull": 9, - "width": 33, - "height": 73 - } - }, - "neck": { - "neck": { - "name": "goblin/neck", - "type": "mesh", - "uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ], - "triangles": [ 3, 5, 2, 2, 10, 1, 2, 5, 10, 3, 4, 5, 10, 0, 1, 0, 10, 6, 10, 5, 6, 7, 8, 6, 6, 9, 0, 6, 8, 9 ], - "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], - "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], - "hull": 10, - "width": 36, - "height": 41 - } - }, - "pelvis": { - "pelvis": { - "name": "goblin/pelvis", - "type": "mesh", - "uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ], - "triangles": [ 1, 3, 0, 1, 2, 3 ], - "vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], - "hull": 4, - "width": 62, - "height": 43 - } - }, - "right arm": { - "right arm": { - "name": "goblin/right-arm", - "type": "mesh", - "uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ], - "triangles": [ 1, 2, 6, 6, 2, 5, 1, 6, 0, 4, 5, 3, 2, 3, 5, 6, 7, 0 ], - "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ], - "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], - "hull": 8, - "width": 23, - "height": 50 - } - }, - "right foot": { - "right foot": { - "name": "goblin/right-foot", - "type": "mesh", - "uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ], - "triangles": [ 4, 5, 15, 7, 14, 6, 5, 6, 15, 6, 14, 15, 14, 7, 9, 7, 8, 9, 15, 3, 4, 9, 10, 14, 15, 2, 3, 15, 14, 2, 14, 10, 1, 12, 1, 11, 1, 12, 13, 14, 1, 2, 1, 13, 0, 1, 10, 11 ], - "vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ], - "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], - "hull": 14, - "width": 63, - "height": 33 - } - }, - "right hand": { - "right hand": { - "name": "goblin/right-hand", - "type": "mesh", - "uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ], - "triangles": [ 4, 7, 5, 5, 7, 6, 4, 3, 7, 3, 2, 8, 7, 3, 8, 8, 1, 10, 8, 2, 1, 0, 10, 1, 8, 10, 9 ], - "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], - "hull": 11, - "width": 36, - "height": 37 - } - }, - "right hand thumb": { - "right hand thumb": { - "name": "goblin/right-hand", - "type": "mesh", - "uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ], - "triangles": [ 3, 2, 4, 2, 1, 4, 1, 0, 4 ], - "vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ], - "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], - "hull": 5, - "width": 36, - "height": 37 - } - }, - "right lower leg": { - "right lower leg": { - "name": "goblin/right-lower-leg", - "type": "mesh", - "uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ], - "triangles": [ 4, 5, 2, 2, 5, 8, 5, 6, 8, 6, 7, 8, 4, 2, 3, 2, 8, 1, 8, 9, 1, 9, 10, 1, 1, 10, 0 ], - "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], - "hull": 11, - "width": 36, - "height": 76 - } - }, - "right shoulder": { - "right shoulder": { - "name": "goblin/right-shoulder", - "type": "mesh", - "uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ], - "triangles": [ 4, 6, 7, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 0, 1, 2, 3, 0 ], - "vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ], - "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], - "hull": 8, - "width": 39, - "height": 45 - } - }, - "right upper leg": { - "right upper leg": { - "name": "goblin/right-upper-leg", - "type": "mesh", - "uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ], - "triangles": [ 5, 4, 6, 6, 4, 2, 4, 3, 2, 2, 1, 6, 6, 1, 9, 6, 9, 7, 9, 1, 0, 9, 8, 7 ], - "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], - "hull": 10, - "width": 34, - "height": 63 - } - }, - "torso": { - "torso": { - "name": "goblin/torso", - "type": "mesh", - "uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ], - "triangles": [ 5, 16, 6, 6, 16, 7, 4, 17, 5, 5, 17, 16, 4, 3, 17, 17, 21, 16, 16, 21, 7, 3, 2, 17, 21, 19, 18, 21, 17, 19, 17, 2, 19, 21, 8, 7, 21, 18, 8, 18, 9, 8, 19, 22, 18, 18, 10, 9, 18, 22, 10, 2, 1, 19, 19, 20, 22, 19, 1, 20, 22, 11, 10, 22, 20, 11, 20, 1, 14, 20, 12, 11, 1, 0, 14, 20, 13, 12, 20, 14, 13, 0, 15, 14 ], - "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], - "hull": 16, - "width": 68, - "height": 96 - } - }, - "undie straps": { - "undie straps": { - "name": "goblin/undie-straps", - "type": "mesh", - "uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ], - "triangles": [ 5, 1, 4, 4, 1, 3, 6, 0, 5, 5, 0, 1, 3, 1, 2, 6, 8, 0, 6, 7, 8 ], - "vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], - "hull": 9, - "width": 55, - "height": 19 - } - }, - "undies": { - "undies": { - "name": "goblin/undies", - "type": "mesh", - "uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ], - "triangles": [ 3, 10, 4, 4, 10, 5, 10, 3, 1, 3, 2, 1, 1, 11, 10, 1, 0, 11, 10, 11, 5, 5, 11, 6, 0, 8, 11, 11, 8, 6, 0, 9, 8, 6, 8, 7 ], - "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ], - "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], - "hull": 10, - "width": 36, - "height": 29 - } - } - }, - "goblingirl": { - "eyes": { - "eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 } - }, - "head": { - "head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 } - }, - "left arm": { - "left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 } - }, - "left foot": { - "left foot": { "name": "goblingirl/left-foot", "x": 25.17, "y": 7.92, "rotation": 3.32, "width": 65, "height": 31 } - }, - "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 - } - }, - "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 shoulder": { - "left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 } - }, - "left upper leg": { - "left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 } - }, - "neck": { - "neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 } - }, - "pelvis": { - "pelvis": { "name": "goblingirl/pelvis", "x": -3.87, "y": 3.18, "width": 62, "height": 43 } - }, - "right arm": { - "right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 } - }, - "right foot": { - "right foot": { "name": "goblingirl/right-foot", "x": 23.46, "y": 9.66, "rotation": 1.52, "width": 63, "height": 33 } - }, - "right hand": { - "right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 } - }, - "right hand thumb": { - "right hand thumb": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 } - }, - "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 shoulder": { - "right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 } - }, - "right upper leg": { - "right upper leg": { "name": "goblingirl/right-upper-leg", "x": 19.69, "y": 2.13, "rotation": 97.49, "width": 34, "height": 63 } - }, - "torso": { - "torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 } - }, - "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 } - } - } -}, -"animations": { - "walk": { - "slots": { - "eyes": { - "attachment": [ - { "time": 0.7, "name": "eyes closed" }, - { "time": 0.8, "name": null } - ] - } - }, - "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.45 }, - { "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": 49.86, - "curve": [ 0.414, 0, 0.705, 0.99 ] - }, - { "time": 0.2333, "angle": 22.51 }, - { "time": 0.5, "angle": -16.93 }, - { "time": 0.6333, "angle": 1.89 }, - { - "time": 0.7333, - "angle": 34.86, - "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": -18.05 }, - { "time": 0.1333, "angle": -63.5 }, - { "time": 0.2333, "angle": -83.01 }, - { "time": 0.5, "angle": 5.11 }, - { "time": 0.6333, "angle": -28.29 }, - { "time": 0.7333, "angle": -27.52 }, - { "time": 0.8666, "angle": 3.53 }, - { "time": 1, "angle": -18.05 } - ], - "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": -14.56 }, - { "time": 0.1333, "angle": -10.42 }, - { "time": 0.2333, "angle": -5.01 }, - { "time": 0.3, "angle": 6.67 }, - { "time": 0.3666, "angle": 3.87 }, - { "time": 0.5, "angle": -3.87 }, - { "time": 0.6333, "angle": 2.78 }, - { "time": 0.7333, "angle": -11.99 }, - { "time": 0.8666, "angle": -12.45 }, - { "time": 1, "angle": -14.56 } - ] - }, - "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": -3.72, "y": -0.01 } - ] - }, - "right foot": { - "rotate": [ - { "time": 0, "angle": -5.25 }, - { "time": 0.2333, "angle": -17.76 }, - { "time": 0.3666, "angle": -20.09 }, - { "time": 0.5, "angle": -19.73 }, - { "time": 0.7333, "angle": -11.68 }, - { "time": 0.8, "angle": 4.46 }, - { "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": -43.21, - "curve": [ 0.414, 0, 0.705, 0.99 ] - }, - { "time": 0.2333, "angle": -25.98 }, - { "time": 0.5, "angle": -19.53 }, - { "time": 0.6333, "angle": -64.8 }, - { - "time": 0.7333, - "angle": -89.54, - "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": -8.4 }, - { - "time": 0.1333, - "x": 0, - "y": -9.35, - "curve": [ 0.326, 0.05, 0.674, 0.93 ] - }, - { - "time": 0.2333, - "x": 0, - "y": -0.59, - "curve": [ 0.325, 0.39, 0.643, 0.7 ] - }, - { "time": 0.3666, "x": 0, "y": -3.96 }, - { "time": 0.5, "x": 0, "y": -8.4 }, - { - "time": 0.6333, - "x": 0, - "y": -10, - "curve": [ 0.359, 0.47, 0.646, 0.74 ] - }, - { - "time": 0.7333, - "x": 0, - "y": -5.29, - "curve": [ 0.333, 0.36, 0.662, 0.69 ] - }, - { - "time": 0.8, - "x": 0, - "y": -2.49, - "curve": [ 0.322, 0.35, 0.651, 0.68 ] - }, - { "time": 0.8666, "x": 0, "y": -3.96 }, - { "time": 1, "x": 0, "y": -8.4 } - ] - }, - "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 } - ] - }, - "pelvis": { - "rotate": [ - { "time": 0, "angle": -1.33 } - ], - "translate": [ - { "time": 0, "x": 0.39, "y": -0.78 } - ] - }, - "spear1": { - "rotate": [ - { "time": 0, "angle": 1.84 }, - { "time": 0.2, "angle": -5.38 }, - { "time": 0.5, "angle": 2.95 }, - { "time": 0.7333, "angle": -3.67 }, - { "time": 1, "angle": 1.84 } - ] - }, - "spear2": { - "rotate": [ - { "time": 0, "angle": 1.84 }, - { "time": 0.2, "angle": -5.38 }, - { "time": 0.5, "angle": 2.95 }, - { "time": 0.7333, "angle": -3.67 }, - { "time": 1, "angle": 1.84 } - ] - }, - "spear3": { - "rotate": [ - { "time": 0, "angle": 3.64 }, - { "time": 0.2, "angle": -3.59 }, - { "time": 0.5, "angle": 4.74 }, - { "time": 0.7333, "angle": -1.87 }, - { "time": 1, "angle": 3.64 } - ] - } - }, - "ffd": { - "default": { - "left hand item": { - "spear": [ - { "time": 0 } - ] - }, - "right hand item": { - "dagger": [ - { - "time": 0, - "offset": 26, - "vertices": [ 2.34, 0.14 ], - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 0.5, - "offset": 8, - "vertices": [ -1.19, 4.31, 0.07, 6.41, 1.66, 6.18, 1.75, 3.59 ], - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 1, - "offset": 26, - "vertices": [ 2.34, 0.14 ] - } - ] - } - }, - "goblin": { - "head": { - "head": [ - { - "time": 0, - "curve": [ 0.632, 0, 0.75, 1 ] - }, - { - "time": 0.2, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08, -1.08, 0.08, -1.08, 0.08, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08 ], - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 0.3666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09, 1.47, 0.09, 1.47, 0.09, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09 ], - "curve": [ 0.621, 0, 0.75, 1 ] - }, - { - "time": 0.7, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17, -1.17, -0.17, -1.17, -0.17, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17 ], - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 0.8666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08, 0.38, 0.08, 0.38, 0.08, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08 ], - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { "time": 1 } - ] - }, - "left foot": { - "left foot": [ - { - "time": 0, - "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] - }, - { "time": 0.1333 }, - { - "time": 0.2333, - "offset": 8, - "vertices": [ -3.96, -2.34, -5.8, -12.47, -2.23, -12.99, 2.02, -9.1, 0, 0, 0, 0, 0, 0, -1.35, -5.28 ] - }, - { - "time": 0.3666, - "offset": 8, - "vertices": [ 0.66, 0.33, 0.33, 2.69, -0.48, 2.54, -1.13, 1.38, 0, 0, 0, 0, 0, 0, -0.11, 0.79 ] - }, - { "time": 0.5, "curve": "stepped" }, - { "time": 0.6333 }, - { - "time": 0.7333, - "offset": 8, - "vertices": [ -2.97, 9.4, -6.91, 19.92, -10.55, 18.41, -12.37, 12.38, -4.72, 6.3, 0, 0, -1.48, 4.88, -7.06, 10.7 ] - }, - { - "time": 0.8333, - "offset": 6, - "vertices": [ 1.05, 1.56, -2.52, 7.99, -5.52, 17.14, -8.93, 15.79, -10.73, 10.22, -4.23, 5.36, 0, 0, 0, 0, -5.83, 8.55 ] - }, - { - "time": 1, - "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] - } - ] - }, - "pelvis": { - "pelvis": [ - { "time": 0 }, - { - "time": 0.1333, - "offset": 6, - "vertices": [ -0.68, -4.13 ] - }, - { - "time": 0.3333, - "offset": 6, - "vertices": [ -1.04, -3.1 ] - }, - { - "time": 0.7, - "offset": 6, - "vertices": [ -1.42, -6.3 ] - }, - { - "time": 0.8666, - "offset": 6, - "vertices": [ -1.13, -1.79 ] - }, - { "time": 1 } - ] - }, - "right foot": { - "right foot": [ - { "time": 0 }, - { - "time": 0.1333, - "offset": 2, - "vertices": [ -2.81, 2.63, -2.35, 3.89, -1.99, 4.86, -0.93, 5.57, -0.48, 5.09, -0.34, 3.42, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31, 1.91, -1.32, 3.65 ] - }, - { - "time": 0.2333, - "offset": 2, - "vertices": [ -6.39, 6.41, -7.74, 8.27, -7.02, 11.35, -4.03, 13.93, -2.5, 12.62, -1.46, 7.58, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84, 2.61, -4.53, 7.92 ] - }, - { - "time": 0.3, - "offset": 2, - "vertices": [ -8.27, 6.68, -9.29, 10.13, -8.62, 14.71, -4.58, 18.81, -2.2, 17.1, -0.07, 9.9, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94, 2.38, -4.59, 10.01 ] - }, - { - "time": 0.3666, - "offset": 2, - "vertices": [ -10.47, 9.44, -13.36, 12.4, -14.32, 16.94, -9.24, 23.55, -5.51, 21.51, -1.19, 11.53, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14, 2.29, -6.63, 11.37 ] - }, - { - "time": 0.5, - "offset": 2, - "vertices": [ -5.42, 4.36, -10.59, 7.04, -11.64, 11.55, -6.19, 20.12, -1.45, 18.05, 4.86, 6.41, 2.81, 0.27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96, 4.94 ] - }, - { "time": 0.6333 }, - { - "time": 0.7333, - "offset": 4, - "vertices": [ 1.31, -6.84, -0.87, -12.54, -5.98, -14.08, -7.15, -11.63, -5.67, -4.83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06, -6.93 ] - }, - { - "time": 0.8, - "offset": 4, - "vertices": [ 0.65, -3.42, -0.43, -6.27, -2.99, -7.04, -3.57, -5.81, -2.83, -2.41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79, -1.28, 0, 0, 0, 0, -1.03, -3.46 ] - }, - { "time": 0.8666 } - ] - }, - "right hand": { - "right hand": [ - { - "time": 0, - "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] - }, - { "time": 0.5 }, - { - "time": 1, - "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] - } - ] - }, - "right lower leg": { - "right lower leg": [ - { "time": 0 }, - { - "time": 0.6, - "offset": 6, - "vertices": [ 1.8, -1.56 ] - }, - { "time": 1 } - ] - }, - "right upper leg": { - "right upper leg": [ - { - "time": 0, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] - }, - { "time": 0.3333 }, - { - "time": 0.8666, - "offset": 14, - "vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ] - }, - { - "time": 1, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] - } - ] - }, - "torso": { - "torso": [ - { - "time": 0, - "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] - }, - { - "time": 0.1333, - "offset": 14, - "vertices": [ 1.31, -0.59, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] - }, - { - "time": 0.3, - "offset": 14, - "vertices": [ 6.03, -3.13, 7.55, -1.38, 6.79, 0.31, 4.23, 1.14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07, -5.16, 0, 0, 4, 0.27, 0, 0, 0, 0, 3.43, -3.52 ] - }, - { - "time": 0.5, - "offset": 14, - "vertices": [ 2.25, -0.87, 2.57, -0.56, 3.17, -0.57, 1.48, 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22, -4.43, 0, 0, 1.48, 0.01, 0, 0, 0, 0, 0.31, -3.28, -1.53, 0.17 ] - }, - { - "time": 0.6333, - "offset": 14, - "vertices": [ 0.75, -1.51, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] - }, - { - "time": 0.8666, - "offset": 14, - "vertices": [ 0.62, -1.26, 0.38, -2.2, 3.25, -0.5, 2.41, 2.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.66, -3.1, 0, 0, 2.3, -1.15, 0, 0, 0, 0, -0.07, -3.63, -0.93, 0.1 ] - }, - { - "time": 1, - "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] - } - ] - }, - "undie straps": { - "undie straps": [ - { - "time": 0, - "offset": 2, - "vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ] - }, - { - "time": 0.1333, - "offset": 2, - "vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ] - }, - { - "time": 0.3333, - "offset": 2, - "vertices": [ -2.37, -0.05, -0.49, 0.19, -0.9, 1.16, -1.6, 2.7, 0.96, 0.8 ] - }, - { - "time": 0.7, - "offset": 2, - "vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ] - }, - { - "time": 0.8666, - "offset": 2, - "vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ] - }, - { - "time": 1, - "offset": 2, - "vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ] - } - ] - }, - "undies": { - "undies": [ - { - "time": 0, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] - }, - { - "time": 0.1333, - "vertices": [ 0.72, 0.43, 7.2, -0.16, 1.37, 0, 1.37, 0, 1.37, 0, 1.25, 0.04, -0.99, -2.95, -1.37, -3.07, 1.37, 0, 0.35, -0.29, 2.99, -0.07, 3.9, -0.14 ] - }, - { - "time": 0.3333, - "vertices": [ 1.16, 0, 2.1, -0.23, 0, 0, 0, 0, 0, 0, 2.24, -0.24, -0.43, 0.6, -1.55, 0.48 ] - }, - { - "time": 0.5333, - "vertices": [ 1.16, 0, -0.23, -0.93, -2.92, 0.35, 0, 0, 0, 0, 0.49, -0.24, -0.64, -2.07, -0.64, -2.07 ] - }, - { - "time": 0.7, - "vertices": [ 1.86, -0.11, 4.66, -0.09, -1.76, 0.21, 0, 0, -0.56, 0.32, -1.13, -1.15, -2.19, -3.47, -1.29, -3.47, 0, 0, 0, 0, 1.58, -0.04, 2.65, 0.16 ] - }, - { - "time": 0.8333, - "vertices": [ 2.41, -0.2, 8.58, 0.58, -0.83, 0.1, 0, 0, -1.02, 0.59, -2.44, -1.87, -1.62, 0, 0, 0, 0, 0, 0, 0, 2.85, -0.08, 4.78, 0.3 ] - }, - { - "time": 0.8666, - "vertices": [ 2.01, -0.02, 8.98, 0.44, -0.2, 0.08, 0.45, 0, -0.35, 0.47, -1.84, -1.44, -0.79, 1.26, 0.53, 1.23, 0.45, 0, 0.11, -0.09, 3.28, -0.09, 5.13, 0.19 ] - }, - { - "time": 1, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] - } - ] - } - } - } - } -} -} \ No newline at end of file diff --git a/spine-as3/spine-as3-example/src/goblins-mesh.png b/spine-as3/spine-as3-example/src/goblins-mesh.png deleted file mode 100644 index a3daf0010..000000000 Binary files a/spine-as3/spine-as3-example/src/goblins-mesh.png and /dev/null differ diff --git a/spine-as3/spine-as3-example/src/spine/Main.as b/spine-as3/spine-as3-example/src/spine/examples/Main.as similarity index 97% rename from spine-as3/spine-as3-example/src/spine/Main.as rename to spine-as3/spine-as3-example/src/spine/examples/Main.as index ad9edd32c..1ebfb48b5 100644 --- a/spine-as3/spine-as3-example/src/spine/Main.as +++ b/spine-as3/spine-as3-example/src/spine/examples/Main.as @@ -29,10 +29,11 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine { +package spine.examples { import flash.display.Sprite; +import spine.*; import spine.animation.AnimationStateData; import spine.atlas.Atlas; import spine.attachments.AtlasAttachmentLoader; @@ -68,7 +69,7 @@ public class Main extends Sprite { skeleton.y = 560; skeleton.state.onStart.add(function (trackIndex:int) : void { - trace(trackIndex + " start: " + skeleton.state.getCurrent(trackIndex)); + trace(trackIndex + " fuu start: " + skeleton.state.getCurrent(trackIndex)); }); skeleton.state.onEnd.add(function (trackIndex:int) : void { trace(trackIndex + " end: " + skeleton.state.getCurrent(trackIndex)); diff --git a/spine-as3/spine-as3-example/src/spineboy.atlas b/spine-as3/spine-as3-example/src/spineboy.atlas index 19c0934b1..2454a1f47 100644 --- a/spine-as3/spine-as3-example/src/spineboy.atlas +++ b/spine-as3/spine-as3-example/src/spineboy.atlas @@ -1,194 +1,216 @@ spineboy.png +size: 1024,1024 format: RGBA8888 filter: Linear,Linear repeat: none eye_indifferent rotate: true - xy: 389, 5 - size: 56, 53 - orig: 56, 53 + xy: 648, 629 + size: 93, 89 + orig: 93, 89 offset: 0, 0 index: -1 eye_surprised - rotate: false - xy: 580, 34 - size: 56, 53 - orig: 56, 53 + rotate: true + xy: 233, 179 + size: 93, 89 + orig: 93, 89 offset: 0, 0 index: -1 front_bracer rotate: false - xy: 732, 85 - size: 35, 48 - orig: 35, 48 + xy: 245, 2 + size: 58, 80 + orig: 58, 80 offset: 0, 0 index: -1 front_fist_closed rotate: false - xy: 556, 91 - size: 45, 49 - orig: 45, 49 + xy: 168, 45 + size: 75, 82 + orig: 75, 82 offset: 0, 0 index: -1 front_fist_open rotate: false - xy: 668, 32 - size: 52, 52 - orig: 52, 52 + xy: 844, 646 + size: 86, 87 + orig: 86, 87 offset: 0, 0 index: -1 front_foot - rotate: false - xy: 924, 201 - size: 76, 41 - orig: 76, 41 + rotate: true + xy: 310, 326 + size: 126, 69 + orig: 126, 69 offset: 0, 0 index: -1 front_foot_bend1 - rotate: false - xy: 845, 200 - size: 77, 42 - orig: 77, 42 + rotate: true + xy: 951, 894 + size: 128, 70 + orig: 128, 70 offset: 0, 0 index: -1 front_foot_bend2 rotate: false - xy: 778, 186 - size: 65, 56 - orig: 65, 56 + xy: 2, 33 + size: 108, 93 + orig: 108, 93 offset: 0, 0 index: -1 front_shin rotate: true - xy: 444, 91 - size: 49, 110 - orig: 49, 110 + xy: 739, 735 + size: 82, 184 + orig: 82, 184 offset: 0, 0 index: -1 front_thigh - rotate: true - xy: 603, 89 - size: 29, 67 - orig: 29, 67 + rotate: false + xy: 381, 340 + size: 48, 112 + orig: 48, 112 offset: 0, 0 index: -1 front_upper_arm - rotate: true - xy: 672, 86 - size: 32, 58 - orig: 32, 58 + rotate: false + xy: 112, 29 + size: 54, 97 + orig: 54, 97 offset: 0, 0 index: -1 goggles rotate: false - xy: 444, 142 - size: 157, 100 - orig: 157, 100 + xy: 156, 454 + size: 261, 166 + orig: 261, 166 offset: 0, 0 index: -1 gun rotate: false - xy: 603, 120 - size: 126, 122 - orig: 126, 122 + xy: 739, 819 + size: 210, 203 + orig: 210, 203 offset: 0, 0 index: -1 head rotate: false - xy: 279, 63 - size: 163, 179 - orig: 163, 179 + xy: 466, 724 + size: 271, 298 + orig: 271, 298 + offset: 0, 0 + index: -1 +hoverboard_board + rotate: true + xy: 2, 128 + size: 492, 152 + orig: 492, 152 + offset: 0, 0 + index: -1 +hoverboard_thruster + rotate: false + xy: 602, 558 + size: 60, 64 + orig: 60, 64 + offset: 0, 0 + index: -1 +hoverglow_small + rotate: true + xy: 156, 178 + size: 274, 75 + orig: 274, 75 offset: 0, 0 index: -1 mouth_grind - rotate: false - xy: 845, 163 - size: 56, 35 - orig: 56, 35 + rotate: true + xy: 951, 799 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 mouth_oooo - rotate: false - xy: 842, 126 - size: 56, 35 - orig: 56, 35 + rotate: true + xy: 245, 84 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 mouth_smile rotate: false - xy: 769, 97 - size: 56, 35 - orig: 56, 35 + xy: 925, 738 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 muzzle rotate: false - xy: 2, 2 - size: 275, 240 - orig: 277, 240 + xy: 2, 622 + size: 462, 400 + orig: 462, 400 offset: 0, 0 index: -1 neck rotate: false - xy: 903, 173 - size: 22, 25 - orig: 22, 25 + xy: 168, 2 + size: 36, 41 + orig: 36, 41 offset: 0, 0 index: -1 rear_bracer rotate: false - xy: 722, 40 - size: 34, 43 - orig: 34, 43 + xy: 932, 664 + size: 56, 72 + orig: 56, 72 offset: 0, 0 index: -1 rear_foot rotate: false - xy: 444, 11 - size: 68, 36 - orig: 68, 36 + xy: 487, 562 + size: 113, 60 + orig: 113, 60 offset: 0, 0 index: -1 rear_foot_bend1 - rotate: false - xy: 444, 49 - size: 70, 40 - orig: 70, 40 + rotate: true + xy: 419, 503 + size: 117, 66 + orig: 117, 66 offset: 0, 0 index: -1 rear_foot_bend2 rotate: false - xy: 778, 134 - size: 62, 50 - orig: 62, 50 + xy: 739, 650 + size: 103, 83 + orig: 103, 83 offset: 0, 0 index: -1 rear_shin rotate: false - xy: 731, 135 - size: 45, 107 - orig: 45, 107 + xy: 233, 274 + size: 75, 178 + orig: 75, 178 offset: 0, 0 index: -1 rear_thigh rotate: true - xy: 516, 50 - size: 39, 62 - orig: 39, 62 + xy: 487, 495 + size: 65, 104 + orig: 65, 104 offset: 0, 0 index: -1 rear_upper_arm - rotate: false - xy: 638, 35 - size: 28, 52 - orig: 28, 52 + rotate: true + xy: 156, 129 + size: 47, 87 + orig: 47, 87 offset: 0, 0 index: -1 torso rotate: true - xy: 279, 2 - size: 59, 108 - orig: 59, 108 + xy: 466, 624 + size: 98, 180 + orig: 98, 180 offset: 0, 0 index: -1 diff --git a/spine-as3/spine-as3-example/src/spineboy.json b/spine-as3/spine-as3-example/src/spineboy.json index 1bd1b64c1..e9e6e761b 100644 --- a/spine-as3/spine-as3-example/src/spineboy.json +++ b/spine-as3/spine-as3-example/src/spineboy.json @@ -1,39 +1,31 @@ { +"skeleton": { "hash": "rPoYyBLFG6F0CGZ5wsUEBKDJU9U", "spine": "3.4.00", "width": 0, "height": 0, "images": "./images/" }, "bones": [ { "name": "hip", "y": 247.47 }, - { "name": "front_thigh", "parent": "hip", "length": 74.8, "x": -17.45, "y": -11.64, "rotation": -95.51, "color": "00ff04ff" }, - { "name": "rear_thigh", "parent": "hip", "length": 85.71, "x": 8.91, "y": -5.62, "rotation": -72.54, "color": "ff000dff" }, - { "name": "torso", "parent": "hip", "length": 127.55, "x": -1.61, "y": 4.9, "rotation": 103.82, "color": "e0da19ff" }, - { - "name": "front_shin", - "parent": "front_thigh", - "length": 128.76, - "x": 78.69, - "y": 1.6, - "rotation": -2.21, - "inheritScale": false, - "color": "00ff04ff" - }, - { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "x": 103.75, "y": 19.32, "rotation": 168.37, "color": "00ff04ff" }, - { "name": "neck", "parent": "torso", "length": 25.45, "x": 127.49, "y": -0.3, "rotation": -31.53, "color": "e0da19ff" }, - { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "x": 86.1, "y": -1.32, "rotation": -19.83, "color": "ff000dff" }, - { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "x": 92.35, "y": -19.22, "rotation": -169.55, "color": "ff000dff" }, + { "name": "torso", "parent": "hip", "length": 127.55, "rotation": 103.82, "x": -1.61, "y": 4.9, "color": "e0da19ff" }, + { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "rotation": 168.37, "x": 103.75, "y": 19.32, "color": "00ff04ff" }, { "name": "front_bracer", "parent": "front_upper_arm", "length": 40.57, + "rotation": 18.29, "x": 68.8, "y": -0.68, - "rotation": 18.29, "color": "00ff04ff" }, - { "name": "front_foot", "parent": "front_shin", "length": 91.34, "x": 128.75, "y": -0.33, "rotation": 77.9, "color": "00ff04ff" }, - { "name": "head", "parent": "neck", "length": 263.57, "x": 27.66, "y": -0.25, "rotation": 23.18, "color": "e0da19ff" }, - { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "x": 51.35, "rotation": 23.15, "color": "ff000dff" }, - { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "x": 121.45, "y": -0.75, "rotation": 69.3, "color": "ff000dff" }, - { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "x": 40.56, "y": 0.19, "rotation": 12.43, "color": "00ff04ff" }, - { "name": "gun", "parent": "rear_bracer", "length": 43.1, "x": 34.42, "y": -0.45, "rotation": 5.34, "color": "ff000dff" }, - { "name": "gunTip", "parent": "gun", "x": 201.04, "y": 52.13, "rotation": 6.83, "color": "ff000dff" } + { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "rotation": 12.43, "x": 40.56, "y": 0.19, "color": "00ff04ff" }, + { "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" }, + { "name": "front_shin", "parent": "front_thigh", "length": 128.76, "rotation": -2.21, "x": 78.69, "y": 1.6, "color": "00ff04ff" }, + { "name": "front_foot", "parent": "front_shin", "length": 91.34, "rotation": 77.9, "x": 128.75, "y": -0.33, "color": "00ff04ff" }, + { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -169.55, "x": 92.35, "y": -19.22, "color": "ff000dff" }, + { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "rotation": 23.15, "x": 51.35, "color": "ff000dff" }, + { "name": "gun", "parent": "rear_bracer", "length": 43.1, "rotation": 5.34, "x": 34.42, "y": -0.45, "color": "ff000dff" }, + { "name": "gunTip", "parent": "gun", "rotation": 6.83, "x": 201.04, "y": 52.13, "color": "ff000dff" }, + { "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.49, "y": -0.3, "color": "e0da19ff" }, + { "name": "head", "parent": "neck", "length": 263.57, "rotation": 23.18, "x": 27.66, "y": -0.25, "color": "e0da19ff" }, + { "name": "rear_thigh", "parent": "hip", "length": 85.71, "rotation": -72.54, "x": 8.91, "y": -5.62, "color": "ff000dff" }, + { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.83, "x": 86.1, "y": -1.32, "color": "ff000dff" }, + { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "rotation": 69.3, "x": 121.45, "y": -0.75, "color": "ff000dff" } ], "slots": [ { "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" }, @@ -96,7 +88,8 @@ "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 ] + "vertexCount": 6, + "vertices": [ -19.14, -70.3, 40.8, -118.07, 257.77, -115.61, 285.16, 57.18, 120.77, 164.95, -5.06, 76.94 ] } }, "mouth": { @@ -1832,10 +1825,6 @@ ] }, "muzzle": { - "attachment": [ - { "time": 0.1333, "name": "muzzle" }, - { "time": 0.2666, "name": null } - ], "color": [ { "time": 0.1333, @@ -1848,6 +1837,10 @@ "curve": [ 0.821, 0, 0.909, 0.89 ] }, { "time": 0.2666, "color": "ffffff00" } + ], + "attachment": [ + { "time": 0.1333, "name": "muzzle" }, + { "time": 0.2666, "name": null } ] } }, @@ -2015,7 +2008,7 @@ ] } }, - "draworder": [ + "drawOrder": [ { "time": 0.6666, "offsets": [ diff --git a/spine-as3/spine-as3-example/src/spineboy.png b/spine-as3/spine-as3-example/src/spineboy.png index dce2fe3e2..2eae82219 100644 Binary files a/spine-as3/spine-as3-example/src/spineboy.png and b/spine-as3/spine-as3-example/src/spineboy.png differ diff --git a/spine-as3/spine-as3/.settings/com.powerflasher.fdt.classpath b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.classpath index 7e38cfa95..02f907113 100644 --- a/spine-as3/spine-as3/.settings/com.powerflasher.fdt.classpath +++ b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.classpath @@ -1,5 +1,9 @@ - frameworks/libs/player/{playerVersion}/playerglobal.swc src + frameworks/libs/player/{playerVersion}/playerglobal.swc + frameworks/libs/textLayout.swc + frameworks/libs/osmf.swc + frameworks/libs/authoringsupport.swc + frameworks/libs/core.swc diff --git a/spine-as3/spine-as3/.settings/com.powerflasher.fdt.core.prefs b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.core.prefs index 150a7ff6b..9133446bf 100644 --- a/spine-as3/spine-as3/.settings/com.powerflasher.fdt.core.prefs +++ b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.core.prefs @@ -3,6 +3,7 @@ com.powerflasher.fdt.core.CompilerArguments=-static-link-runtime-shared-librarie com.powerflasher.fdt.core.CompilerConstants=CONFIG\:\:AUTHOR\!"{user.name}"\nCONFIG\:\:DEBUG\!{debug} com.powerflasher.fdt.core.DefaultOutputFolder=bin com.powerflasher.fdt.core.DefaultPlayer=External_SWF_Viewer +com.powerflasher.fdt.core.IncludeTestResources=false com.powerflasher.fdt.core.Language=AS3 com.powerflasher.fdt.core.Manifests= com.powerflasher.fdt.core.PassClasspath=true @@ -13,7 +14,7 @@ com.powerflasher.fdt.core.PassManifests=true com.powerflasher.fdt.core.PassRsls=false com.powerflasher.fdt.core.PassSwcs=true com.powerflasher.fdt.core.PlatformType=WEB -com.powerflasher.fdt.core.PlayerVersion=11.1 +com.powerflasher.fdt.core.PlayerVersion=22.0 com.powerflasher.fdt.core.ProjectTypeHint=Web com.powerflasher.fdt.core.Runtime=Flash_Player com.powerflasher.fdt.core.SdkName=Flex 4.6.0 diff --git a/spine-as3/spine-as3/.settings/com.powerflasher.fdt.exclude b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.exclude new file mode 100644 index 000000000..2391d8c0d --- /dev/null +++ b/spine-as3/spine-as3/.settings/com.powerflasher.fdt.exclude @@ -0,0 +1,13 @@ + + + frameworks/libs/air/aircore.swc + frameworks/libs/air/airglobal.swc + frameworks/libs/air/applicationupdater.swc + frameworks/libs/air/applicationupdater_ui.swc + frameworks/libs/air/servicemonitor.swc + frameworks/libs/authoringsupport.swc + frameworks/libs/core.swc + frameworks/libs/osmf.swc + frameworks/libs/textLayout.swc + + diff --git a/spine-as3/spine-as3/src/spine/Bone.as b/spine-as3/spine-as3/src/spine/Bone.as index 9e70baa93..c5cc50db2 100644 --- a/spine-as3/spine-as3/src/spine/Bone.as +++ b/spine-as3/spine-as3/src/spine/Bone.as @@ -37,14 +37,15 @@ public class Bone implements Updatable { internal var _data:BoneData; internal var _skeleton:Skeleton; internal var _parent:Bone; + internal var _children:Vector. = new Vector.(); public var x:Number; public var y:Number; public var rotation:Number; public var scaleX:Number; public var scaleY:Number; - public var appliedRotation:Number; - public var appliedScaleX:Number; - public var appliedScaleY:Number; + public var shearX:Number; + public var shearY:Number; + public var appliedRotation:Number; internal var _a:Number; internal var _b:Number; @@ -54,6 +55,8 @@ public class Bone implements Updatable { internal var _worldY:Number; internal var _worldSignX:Number; internal var _worldSignY:Number; + + internal var _sorted:Boolean; /** @param parent May be null. */ public function Bone (data:BoneData, skeleton:Skeleton, parent:Bone) { @@ -64,26 +67,25 @@ public class Bone implements Updatable { _parent = parent; setToSetupPose(); } + + /** Same as updateWorldTransform(). This method exists for Bone to implement Updatable. */ + public function update () : void { + updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY); + } /** Computes the world SRT using the parent bone and this bone's local SRT. */ public function updateWorldTransform () : void { - updateWorldTransformWith(x, y, rotation, scaleX, scaleY); - } - - /** Same as updateWorldTransform(). This method exists for Bone to implement Updatable. */ - public function update () : void { - updateWorldTransformWith(x, y, rotation, scaleX, scaleY); + updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY); } /** Computes the world SRT using the parent bone and the specified local SRT. */ - public function updateWorldTransformWith (x:Number, y:Number, rotation:Number, scaleX:Number, scaleY:Number) : void { + public function updateWorldTransformWith (x:Number, y:Number, rotation:Number, scaleX:Number, scaleY:Number, shearX:Number, shearY:Number) : void { appliedRotation = rotation; - appliedScaleX = scaleX; - appliedScaleY = scaleY; - var radians:Number = rotation * MathUtils.degRad; - var cos:Number = Math.cos(radians), sin:Number = Math.sin(radians); - var la:Number = cos * scaleX, lb:Number = -sin * scaleY, lc:Number = sin * scaleX, ld:Number = cos * scaleY; + var rotationY:Number = rotation + 90 + shearY; + var la:Number = MathUtils.cosDeg(rotation + shearX) * scaleX, lb:Number = MathUtils.cosDeg(rotationY) * scaleY; + var lc:Number = MathUtils.sinDeg(rotation + shearX) * scaleX, ld:Number = MathUtils.sinDeg(rotationY) * scaleY; + var parent:Bone = _parent; if (!parent) { // Root bone. var skeleton:Skeleton = _skeleton; @@ -126,15 +128,13 @@ public class Bone implements Updatable { pc = 0; pd = 1; do { - radians = parent.appliedRotation * MathUtils.degRad; - cos = Math.cos(radians); - sin = Math.sin(radians); - var temp1:Number = pa * cos + pb * sin; - pb = pa * -sin + pb * cos; - pa = temp1; - temp1 = pc * cos + pd * sin; - pd = pc * -sin + pd * cos; - pc = temp1; + var cos:Number = MathUtils.cosDeg(parent.appliedRotation), sin:Number = MathUtils.sinDeg(parent.appliedRotation); + var temp:Number = pa * cos + pb * sin; + pb = pb * cos - pa * sin; + pa = temp; + temp = pc * cos + pd * sin; + pd = pd * cos - pc * sin; + pc = temp; if (!parent.data.inheritRotation) break; parent = parent.parent; @@ -149,27 +149,23 @@ public class Bone implements Updatable { pc = 0; pd = 1; do { - radians = parent.rotation * MathUtils.degRad; - cos = Math.cos(radians); - sin = Math.sin(radians); - var psx:Number = parent.appliedScaleX, psy:Number = parent.appliedScaleY; - var za:Number = cos * psx, zb:Number = -sin * psy, zc:Number = sin * psx, zd:Number = cos * psy; - var temp2:Number = pa * za + pb * zc; - pb = pa * zb + pb * zd; - pa = temp2; - temp2 = pc * za + pd * zc; - pd = pc * zb + pd * zd; - pc = temp2; - - if (psx < 0) radians = -radians; - cos = Math.cos(-radians); - sin = Math.sin(-radians); - temp2 = pa * cos + pb * sin; - pb = pa * -sin + pb * cos; - pa = temp2; - temp2 = pc * cos + pd * sin; - pd = pc * -sin + pd * cos; - pc = temp2; + cos = MathUtils.cosDeg(parent.appliedRotation), sin = MathUtils.sinDeg(parent.appliedRotation); + var psx:Number = parent.scaleX, psy:Number = parent.scaleY; + var za:Number = cos * psx, zb:Number = sin * psy, zc:Number = sin * psx, zd:Number = cos * psy; + temp = pa * za + pb * zc; + pb = pb * zd - pa * zb; + pa = temp; + temp = pc * za + pd * zc; + pd = pd * zd - pc * zb; + pc = temp; + + if (psx >= 0) sin = -sin; + temp = pa * cos + pb * sin; + pb = pb * cos - pa * sin; + pa = temp; + temp = pc * cos + pd * sin; + pd = pd * cos - pc * sin; + pc = temp; if (!parent.data.inheritScale) break; parent = parent.parent; @@ -201,18 +197,24 @@ public class Bone implements Updatable { rotation = _data.rotation; scaleX = _data.scaleX; scaleY = _data.scaleY; + shearX = _data.shearX; + shearY = _data.shearY; } public function get data () : BoneData { return _data; } + public function get skeleton () : Skeleton { + return _skeleton; + } + public function get parent () : Bone { return _parent; } - public function get skeleton () : Skeleton { - return _skeleton; + public function get children () : Vector. {; + return _children; } public function get a () : Number { @@ -262,11 +264,81 @@ public class Bone implements Updatable { public function get worldScaleY () : Number { return Math.sqrt(_c * _c + _d * _d) * _worldSignY; } + + public function worldToLocalRotationX () : Number { + var parent:Bone = _parent; + if (parent == null) return rotation; + var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d, a:Number = this.a, c:Number = this.c; + return Math.atan2(pa * c - pc * a, pd * a - pb * c) * MathUtils.radDeg; + } + + public function worldToLocalRotationY () : Number { + var parent:Bone = _parent; + if (parent == null) return rotation; + var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d, b:Number = this.b, d:Number = this.d; + return Math.atan2(pa * d - pc * b, pd * b - pb * d) * MathUtils.radDeg; + } + + public function rotateWorld (degrees:Number) : void { + var a:Number = this.a, b:Number = this.b, c:Number = this.c, d:Number = this.d; + var cos:Number = MathUtils.cosDeg(degrees), sin:Number = MathUtils.sinDeg(degrees); + this._a = cos * a - sin * c; + this._b = cos * b - sin * d; + this._c = sin * a + cos * c; + this._d = sin * b + cos * d; + } + + /** Computes the local transform from the world transform. This can be useful to perform processing on the local transform + * after the world transform has been modified directly (eg, by a constraint). + *

+ * Some redundant information is lost by the world transform, such as -1,-1 scale versus 180 rotation. The computed local + * transform values may differ from the original values but are functionally the same. */ + public function updateLocalTransform () : void { + var parent:Bone = this.parent; + if (parent == null) { + x = worldX; + y = worldY; + rotation = Math.atan2(c, a) * MathUtils.radDeg; + scaleX = Math.sqrt(a * a + c * c); + scaleY = Math.sqrt(b * b + d * d); + var det:Number = a * d - b * c; + shearX = 0; + shearY = Math.atan2(a * b + c * d, det) * MathUtils.radDeg; + return; + } + var pa:Number = parent.a, pb:Number = parent.b, pc:Number = parent.c, pd:Number = parent.d; + var pid:Number = 1 / (pa * pd - pb * pc); + var dx:Number = worldX - parent.worldX, dy:Number = worldY - parent.worldY; + x = (dx * pd * pid - dy * pb * pid); + y = (dy * pa * pid - dx * pc * pid); + var ia:Number = pid * pd; + var id:Number = pid * pa; + var ib:Number = pid * pb; + var ic:Number = pid * pc; + var ra:Number = ia * a - ib * c; + var rb:Number = ia * b - ib * d; + var rc:Number = id * c - ic * a; + var rd:Number = id * d - ic * b; + shearX = 0; + scaleX = Math.sqrt(ra * ra + rc * rc); + if (scaleX > 0.0001) { + det = ra * rd - rb * rc; + scaleY = det / scaleX; + shearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg; + rotation = Math.atan2(rc, ra) * MathUtils.radDeg; + } else { + scaleX = 0; + scaleY = Math.sqrt(rb * rb + rd * rd); + shearY = 0; + rotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg; + } + appliedRotation = rotation; + } public function worldToLocal (world:Vector.) : void { - var x:Number = world[0] - _worldX, y:Number = world[1] - _worldY; var a:Number = _a, b:Number = _b, c:Number = _c, d:Number = _d; var invDet:Number = 1 / (a * d - b * c); + var x:Number = world[0] - _worldX, y:Number = world[1] - _worldY; world[0] = (x * d * invDet - y * b * invDet); world[1] = (y * a * invDet - x * c * invDet); } diff --git a/spine-as3/spine-as3/src/spine/BoneData.as b/spine-as3/spine-as3/src/spine/BoneData.as index be24ce2e2..fc53fb77a 100644 --- a/spine-as3/spine-as3/src/spine/BoneData.as +++ b/spine-as3/spine-as3/src/spine/BoneData.as @@ -32,6 +32,7 @@ package spine { public class BoneData { + internal var _index:int; internal var _name:String; internal var _parent:BoneData; public var length:Number; @@ -40,15 +41,23 @@ public class BoneData { public var rotation:Number; public var scaleX:Number = 1; public var scaleY:Number = 1; - public var inheritScale:Boolean = true; + public var shearX:Number; + public var shearY:Number; public var inheritRotation:Boolean = true; + public var inheritScale:Boolean = true; /** @param parent May be null. */ - public function BoneData (name:String, parent:BoneData) { + public function BoneData (index:int, name:String, parent:BoneData) { + if (index < 0) throw new ArgumentError("index must be >= 0"); if (name == null) throw new ArgumentError("name cannot be null."); + _index = index; _name = name; _parent = parent; } + + public function get index () : int { + return _index; + } public function get name () : String { return _name; diff --git a/spine-as3/spine-as3/src/spine/IkConstraint.as b/spine-as3/spine-as3/src/spine/IkConstraint.as index 03621ae54..58593e228 100644 --- a/spine-as3/spine-as3/src/spine/IkConstraint.as +++ b/spine-as3/spine-as3/src/spine/IkConstraint.as @@ -35,8 +35,10 @@ public class IkConstraint implements Updatable { internal var _data:IkConstraintData; public var bones:Vector.; public var target:Bone; - public var bendDirection:int; public var mix:Number; + public var bendDirection:int; + + public var level:int; public function IkConstraint (data:IkConstraintData, skeleton:Skeleton) { if (data == null) throw new ArgumentError("data cannot be null."); @@ -77,121 +79,128 @@ public class IkConstraint implements Updatable { /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. */ static public function apply1 (bone:Bone, targetX:Number, targetY:Number, alpha:Number) : void { - var parentRotation:Number = bone._parent == null ? 0 : bone._parent.worldRotationX; - var rotation:Number = bone.rotation; - var rotationIK:Number = Math.atan2(targetY - bone._worldY, targetX - bone._worldX) * MathUtils.radDeg - parentRotation; - if ((bone._worldSignX != bone._worldSignY) != (bone._skeleton.flipX != (bone._skeleton.flipY != Bone.yDown))) - rotationIK = 360 - rotationIK; - if (rotationIK > 180) rotationIK -= 360; + var pp:Bone = bone.parent; + var id:Number = 1 / (pp.a * pp.d - pp.b * pp.c); + var x:Number = targetX - pp.worldX, y:Number = targetY - pp.worldY; + var tx:Number = (x * pp.d - y * pp.b) * id - bone.x, ty:Number = (y * pp.a - x * pp.c) * id - bone.y; + var rotationIK:Number = Math.atan2(ty, tx) * MathUtils.radDeg - bone.shearX - bone.rotation; + if (bone.scaleX < 0) rotationIK += 180; + if (rotationIK > 180) + rotationIK -= 360; else if (rotationIK < -180) rotationIK += 360; - bone.updateWorldTransformWith(bone.x, bone.y, rotation + (rotationIK - rotation) * alpha, bone.appliedScaleX, bone.appliedScaleY); + bone.updateWorldTransformWith(bone.x, bone.y, bone.rotation + rotationIK * alpha, bone.scaleX, bone.scaleY, bone.shearX, + bone.shearY); } /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param child Any descendant bone of the parent. */ static public function apply2 (parent:Bone, child:Bone, targetX:Number, targetY:Number, bendDir:int, alpha:Number) : void { - if (alpha == 0) return; - var px:Number = parent.x, py:Number = parent.y, psx:Number = parent.appliedScaleX, psy:Number = parent.appliedScaleY; - var o1:int, o2:int, s2:int; + if (alpha == 0) { + child.updateWorldTransform(); + return; + } + var px:Number = parent.x, py:Number = parent.y, psx:Number = parent.scaleX, psy:Number = parent.scaleY, csx:Number = child.scaleX;; + var os1:int, os2:int, s2:int; if (psx < 0) { psx = -psx; - o1 = 180; + os1 = 180; s2 = -1; } else { - o1 = 0; + os1 = 0; s2 = 1; } if (psy < 0) { psy = -psy; s2 = -s2; } - var cx:Number = child.x, cy:Number = child.y, csx:Number = child.appliedScaleX; - var u:Boolean = Math.abs(psx - psy) <= 0.0001; - if (!u && cy != 0) { - child._worldX = parent.a * cx + parent.worldX; - child._worldY = parent.c * cx + parent.worldY; - cy = 0; - } if (csx < 0) { csx = -csx; - o2 = 180; + os2 = 180; } else - o2 = 0; - var pp:Bone = parent.parent; - var tx:Number, ty:Number, dx:Number, dy:Number; - if (!pp) { - tx = targetX - px; - ty = targetY - py; - dx = child._worldX - px; - dy = child._worldY - py; + os2 = 0; + var cx:Number = child.x, cy:Number, cwx:Number, cwy:Number, a:Number = parent.a, b:Number = parent.b, c:Number = parent.c, d:Number = parent.d; + var u:Boolean = Math.abs(psx - psy) <= 0.0001; + if (!u) { + cy = 0; + cwx = a * cx + parent.worldX; + cwy = c * cx + parent.worldY; } else { - var ppa:Number = pp.a, ppb:Number = pp.b, ppc:Number = pp.c, ppd:Number = pp.d; - var invDet:Number = 1 / (ppa * ppd - ppb * ppc); - var wx:Number = pp._worldX, wy:Number = pp._worldY, twx:Number = targetX - wx, twy:Number = targetY - wy; - tx = (twx * ppd - twy * ppb) * invDet - px; - ty = (twy * ppa - twx * ppc) * invDet - py; - twx = child._worldX - wx; - twy = child._worldY - wy; - dx = (twx * ppd - twy * ppb) * invDet - px; - dy = (twy * ppa - twx * ppc) * invDet - py; + cy = child.y; + cwx = a * cx + b * cy + parent.worldX; + cwy = c * cx + d * cy + parent.worldY; } + var pp:Bone = parent.parent; + a = pp.a; + b = pp.b; + c = pp.c; + d = pp.d; + var id:Number = 1 / (a * d - b * c), x:Number = targetX - pp.worldX, y:Number = targetY - pp.worldY; + var tx:Number = (x * d - y * b) * id - px, ty:Number = (y * a - x * c) * id - py; + x = cwx - pp.worldX; + y = cwy - pp.worldY; + var dx:Number = (x * d - y * b) * id - px, dy:Number = (y * a - x * c) * id - py; var l1:Number = Math.sqrt(dx * dx + dy * dy), l2:Number = child.data.length * csx, a1:Number, a2:Number; outer: if (u) { l2 *= psx; var cos:Number = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2); - if (cos < -1) cos = -1; + if (cos < -1) + cos = -1; else if (cos > 1) cos = 1; a2 = Math.acos(cos) * bendDir; - var ad:Number = l1 + l2 * cos, o:Number = l2 * Math.sin(a2); - a1 = Math.atan2(ty * ad - tx * o, tx * ad + ty * o); + a = l1 + l2 * cos; + b = l2 * Math.sin(a2); + a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b); } else { - var a:Number = psx * l2, b:Number = psy * l2, ta:Number = Math.atan2(ty, tx); - var aa:Number = a * a, bb:Number = b * b, ll:Number = l1 * l1, dd:Number = tx * tx + ty * ty; - var c0:Number = bb * ll + aa * dd - aa * bb, c1:Number = -2 * bb * l1, c2:Number = bb - aa; - var d:Number = c1 * c1 - 4 * c2 * c0; + a = psx * l2; + b = psy * l2; + var aa:Number = a * a, bb:Number = b * b, dd:Number = tx * tx + ty * ty, ta:Number = Math.atan2(ty, tx); + c = bb * l1 * l1 + aa * dd - aa * bb; + var c1:Number = -2 * bb * l1, c2:Number = bb - aa; + d = c1 * c1 - 4 * c2 * c; if (d >= 0) { var q:Number = Math.sqrt(d); if (c1 < 0) q = -q; q = -(c1 + q) / 2; - var r0:Number = q / c2, r1:Number = c0 / q; + var r0:Number = q / c2, r1:Number = c / q; var r:Number = Math.abs(r0) < Math.abs(r1) ? r0 : r1; if (r * r <= dd) { - var y1:Number = Math.sqrt(dd - r * r) * bendDir; - a1 = ta - Math.atan2(y1, r); - a2 = Math.atan2(y1 / psy, (r - l1) / psx); + y = Math.sqrt(dd - r * r) * bendDir; + a1 = ta - Math.atan2(y, r); + a2 = Math.atan2(y / psy, (r - l1) / psx); break outer; } } var minAngle:Number = 0, minDist:Number = Number.MAX_VALUE, minX:Number = 0, minY:Number = 0; var maxAngle:Number = 0, maxDist:Number = 0, maxX:Number = 0, maxY:Number = 0; - var x:Number = l1 + a, dist:Number = x * x; - if (dist > maxDist) { + x = l1 + a; + d = x * x; + if (d > maxDist) { maxAngle = 0; - maxDist = dist; + maxDist = d; maxX = x; } x = l1 - a; - dist = x * x; - if (dist < minDist) { + d = x * x; + if (d < minDist) { minAngle = Math.PI; - minDist = dist; + minDist = d; minX = x; } var angle:Number = Math.acos(-a * l1 / (aa - bb)); x = a * Math.cos(angle) + l1; - var y:Number = b * Math.sin(angle); - dist = x * x + y * y; - if (dist < minDist) { + y = b * Math.sin(angle); + d = x * x + y * y; + if (d < minDist) { minAngle = angle; - minDist = dist; + minDist = d; minX = x; minY = y; } - if (dist > maxDist) { + if (d > maxDist) { maxAngle = angle; - maxDist = dist; + maxDist = d; maxX = x; maxY = y; } @@ -204,16 +213,18 @@ public class IkConstraint implements Updatable { } } var os:Number = Math.atan2(cy, cx) * s2; - a1 = (a1 - os) * MathUtils.radDeg + o1; - a2 = (a2 + os) * MathUtils.radDeg * s2 + o2; - if (a1 > 180) a1 -= 360; - else if (a1 < -180) a1 += 360; - if (a2 > 180) a2 -= 360; - else if (a2 < -180) a2 += 360; var rotation:Number = parent.rotation; - parent.updateWorldTransformWith(px, py, rotation + (a1 - rotation) * alpha, parent.appliedScaleX, parent.appliedScaleY); + a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation; + if (a1 > 180) + a1 -= 360; + else if (a1 < -180) a1 += 360; + parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, parent.scaleX, parent.scaleY, 0, 0); rotation = child.rotation; - child.updateWorldTransformWith(cx, cy, rotation + (a2 - rotation) * alpha, child.appliedScaleX, child.appliedScaleY); + a2 = ((a2 + os) * MathUtils.radDeg - child.shearX) * s2 + os2 - rotation; + if (a2 > 180) + a2 -= 360; + else if (a2 < -180) a2 += 360; + child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.scaleX, child.scaleY, child.shearX, child.shearY); } } diff --git a/spine-as3/spine-as3/src/spine/MathUtils.as b/spine-as3/spine-as3/src/spine/MathUtils.as index ee0eef7d7..b9ad40cf1 100644 --- a/spine-as3/spine-as3/src/spine/MathUtils.as +++ b/spine-as3/spine-as3/src/spine/MathUtils.as @@ -34,6 +34,20 @@ package spine { public class MathUtils { static public var radDeg:Number = 180 / Math.PI; static public var degRad:Number = Math.PI / 180; + + static public function cosDeg(degrees:Number): Number { + return Math.cos(degrees * degRad); + } + + static public function sinDeg(degrees:Number): Number { + return Math.sin(degrees * degRad); + } + + static public function clamp (value:Number, min:Number, max:Number) : Number { + if (value < min) return min; + if (value > max) return max; + return value; + } } } diff --git a/spine-as3/spine-as3/src/spine/PathConstraint.as b/spine-as3/spine-as3/src/spine/PathConstraint.as new file mode 100644 index 000000000..b31c57235 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/PathConstraint.as @@ -0,0 +1,420 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine { +import spine.attachments.PathAttachment; + +public class PathConstraint implements Updatable { + private static const NONE:int = -1, BEFORE:int = -2, AFTER:int = -3; + + internal var _data:PathConstraintData; + internal var _bones:Vector.; + public var target:Slot; + public var position:Number, spacing:Number, rotateMix:Number, translateMix:Number; + + internal const _spaces:Vector. = new Vector.(); + internal const _positions:Vector. = new Vector.(); + internal const _world:Vector. = new Vector.(); + internal const _curves:Vector. = new Vector.(); + internal const _lengths:Vector. = new Vector.(); + internal const _segments:Vector. = new Vector.(10); + + public function PathConstraint (data:PathConstraintData, skeleton:Skeleton) { + if (data == null) throw new ArgumentError("data cannot be null."); + if (skeleton == null) throw new ArgumentError("skeleton cannot be null."); + _data = data; + _bones = new Vector.(); + for each (var boneData:BoneData in data.bones) + _bones.push(skeleton.findBone(boneData.name)); + target = skeleton.findSlot(data.target.name); + position = data.position; + spacing = data.spacing; + rotateMix = data.rotateMix; + translateMix = data.translateMix; + } + + public function apply () : void { + update(); + } + + public function update () : void { + var attachment:PathAttachment = target.attachment as PathAttachment; + if (attachment == null) return; + + var rotateMix:Number = this.rotateMix, translateMix:Number = this.translateMix; + var translate:Boolean = translateMix > 0, rotate:Boolean = rotateMix > 0; + if (!translate && !rotate) return; + + var data:PathConstraintData = this._data; + var spacingMode:SpacingMode = data.spacingMode; + var lengthSpacing:Boolean = spacingMode == SpacingMode.length; + var rotateMode:RotateMode = data.rotateMode; + var tangents:Boolean = rotateMode == RotateMode.tangent, scale:Boolean = rotateMode == RotateMode.chainScale; + var boneCount:int = this._bones.length, spacesCount:int = tangents ? boneCount : boneCount + 1; + var bones:Vector. = this._bones; + this._spaces.length = spacesCount; + var spaces:Vector. = this._spaces, lengths:Vector. = null; + var spacing:Number = this.spacing; + if (scale || lengthSpacing) { + if (scale) { + this._lengths.length = boneCount; + lengths = this._lengths; + } + for (var i:int = 0, n:int = spacesCount - 1; i < n;) { + var bone:Bone = bones[i]; + var length:Number = bone.data.length, x:Number = length * bone.a, y:Number = length * bone.c; + length = Math.sqrt(x * x + y * y); + if (scale) lengths[i] = length; + spaces[++i] = lengthSpacing ? Math.max(0, length + spacing) : spacing; + } + } else { + for (i = 1; i < spacesCount; i++) + spaces[i] = spacing; + } + + var positions:Vector. = computeWorldPositions(attachment, spacesCount, tangents, + data.positionMode == PositionMode.percent, spacingMode == SpacingMode.percent); + var skeleton:Skeleton = target.skeleton; + var skeletonX:Number = skeleton.x, skeletonY:Number = skeleton.y; + var boneX:Number = positions[0], boneY:Number = positions[1], offsetRotation:Number = data.offsetRotation; + var tip:Boolean = rotateMode == RotateMode.chain && offsetRotation == 0; + var p:Number; + for (i = 0, p = 3; i < boneCount; i++, p += 3) { + bone = bones[i]; + bone._worldX += (boneX - skeletonX - bone.worldX) * translateMix; + bone._worldY += (boneY - skeletonY - bone.worldY) * translateMix; + x = positions[p]; y = positions[p + 1]; var dx:Number = x - boneX, dy:Number = y - boneY; + if (scale) { + length = lengths[i]; + if (length != 0) { + var s:Number = (Math.sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1; + bone._a *= s; + bone._c *= s; + } + } + boneX = x; + boneY = y; + if (rotate) { + var a:Number = bone.a, b:Number = bone.b, c:Number = bone.c, d:Number = bone.d, r:Number, cos:Number, sin:Number; + if (tangents) + r = positions[p - 1]; + else if (spaces[i + 1] == 0) + r = positions[p + 2]; + else + r = Math.atan2(dy, dx); + r -= Math.atan2(c, a) - offsetRotation * MathUtils.degRad; + if (tip) { + cos = Math.cos(r); + sin = Math.sin(r); + length = bone.data.length; + boneX += (length * (cos * a - sin * c) - dx) * rotateMix; + boneY += (length * (sin * a + cos * c) - dy) * rotateMix; + } + if (r > Math.PI) + r -= (Math.PI * 2); + else if (r < -Math.PI) // + r += (Math.PI * 2); + r *= rotateMix; + cos = Math.cos(r); + sin = Math.sin(r); + bone._a = cos * a - sin * c; + bone._b = cos * b - sin * d; + bone._c = sin * a + cos * c; + bone._d = sin * b + cos * d; + } + } + } + + protected function computeWorldPositions (path:PathAttachment, spacesCount:int, tangents:Boolean, percentPosition:Boolean, + percentSpacing:Boolean) : Vector. { + var target:Slot = this.target; + var position:Number = this.position; + var spaces:Vector. = this._spaces; + this._positions.length = spacesCount * 3 + 2; + var out:Vector. = this._positions, world:Vector.; + var closed:Boolean = path.closed; + var verticesLength:int = path.worldVerticesLength, curveCount:int = verticesLength / 6, prevCurve:int = NONE; + + if (!path.constantSpeed) { + var lengths:Vector. = path.lengths; + curveCount -= closed ? 1 : 2; + var pathLength:Number = lengths[curveCount]; + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (var i:int = 0; i < spacesCount; i++) + spaces[i] *= pathLength; + } + this._world.length = 8; + world = this._world; + var o:int, curve:int; + for (i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + var space:Number = spaces[i]; + position += space; + var p:Number = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + if (prevCurve != BEFORE) { + prevCurve = BEFORE; + path.computeWorldVertices2(target, 2, 4, world, 0); + } + addBeforePosition(p, world, 0, out, o); + continue; + } else if (p > pathLength) { + if (prevCurve != AFTER) { + prevCurve = AFTER; + path.computeWorldVertices2(target, verticesLength - 6, 4, world, 0); + } + addAfterPosition(p - pathLength, world, 0, out, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + var length:Number = lengths[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + var prev:Number = lengths[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + if (closed && curve == curveCount) { + path.computeWorldVertices2(target, verticesLength - 4, 4, world, 0); + path.computeWorldVertices2(target, 0, 4, world, 4); + } else + path.computeWorldVertices2(target, curve * 6 + 2, 8, world, 0); + } + addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, + tangents || (i > 0 && space == 0)); + } + return out; + } + + // World vertices. + if (closed) { + verticesLength += 2; + this._world.length = verticesLength; + world = this._world; + path.computeWorldVertices2(target, 2, verticesLength - 4, world, 0); + path.computeWorldVertices2(target, 0, 2, world, verticesLength - 4); + world[verticesLength - 2] = world[0]; + world[verticesLength - 1] = world[1]; + } else { + curveCount--; + verticesLength -= 4; + this._world.length = verticesLength; + world = this._world; + path.computeWorldVertices2(target, 2, verticesLength, world, 0); + } + + // Curve lengths. + this._curves.length = curveCount; + var curves:Vector. = this._curves; + pathLength = 0; + var x1:Number = world[0], y1:Number = world[1], cx1:Number = 0, cy1:Number = 0, cx2:Number = 0, cy2:Number = 0, x2:Number = 0, y2:Number = 0; + var tmpx:Number, tmpy:Number, dddfx:Number, dddfy:Number, ddfx:Number, ddfy:Number, dfx:Number, dfy:Number; + var w:int; + for (i = 0, w = 2; i < curveCount; i++, w += 6) { + cx1 = world[w]; + cy1 = world[w + 1]; + cx2 = world[w + 2]; + cy2 = world[w + 3]; + x2 = world[w + 4]; + y2 = world[w + 5]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.1875; + tmpy = (y1 - cy1 * 2 + cy2) * 0.1875; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667; + dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + curves[i] = pathLength; + x1 = x2; + y1 = y2; + } + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (i = 0; i < spacesCount; i++) + spaces[i] *= pathLength; + } + + var segments:Vector. = this._segments; + var curveLength:Number = 0; + var segment:int; + for (i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { + space = spaces[i]; + position += space; + p = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + addBeforePosition(p, world, 0, out, o); + continue; + } else if (p > pathLength) { + addAfterPosition(p - pathLength, world, verticesLength - 4, out, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + length = curves[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + prev = curves[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + + // Curve segment lengths. + if (curve != prevCurve) { + prevCurve = curve; + var ii:int = curve * 6; + x1 = world[ii]; + y1 = world[ii + 1]; + cx1 = world[ii + 2]; + cy1 = world[ii + 3]; + cx2 = world[ii + 4]; + cy2 = world[ii + 5]; + x2 = world[ii + 6]; + y2 = world[ii + 7]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.03; + tmpy = (y1 - cy1 * 2 + cy2) * 0.03; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667; + dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667; + curveLength = Math.sqrt(dfx * dfx + dfy * dfy); + segments[0] = curveLength; + for (ii = 1; ii < 8; ii++) { + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[ii] = curveLength; + } + dfx += ddfx; + dfy += ddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[8] = curveLength; + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[9] = curveLength; + segment = 0; + } + + // Weight by segment length. + p *= curveLength; + for (;; segment++) { + length = segments[segment]; + if (p > length) continue; + if (segment == 0) + p /= length; + else { + prev = segments[segment - 1]; + p = segment + (p - prev) / (length - prev); + } + break; + } + addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0)); + } + return out; + } + + private function addBeforePosition (p:Number, temp:Vector., i:int, out:Vector., o:int) : void { + var x1:Number = temp[i], y1:Number = temp[i + 1], dx:Number = temp[i + 2] - x1, dy:Number = temp[i + 3] - y1, r:Number = Math.atan2(dy, dx); + out[o] = x1 + p * Math.cos(r); + out[o + 1] = y1 + p * Math.sin(r); + out[o + 2] = r; + } + + private function addAfterPosition (p:Number, temp:Vector., i:int, out:Vector., o:int) : void { + var x1:Number = temp[i + 2], y1:Number = temp[i + 3], dx:Number = x1 - temp[i], dy:Number = y1 - temp[i + 1], r:Number = Math.atan2(dy, dx); + out[o] = x1 + p * Math.cos(r); + out[o + 1] = y1 + p * Math.sin(r); + out[o + 2] = r; + } + + private function addCurvePosition (p:Number, x1:Number, y1:Number, cx1:Number, cy1:Number, cx2:Number, cy2:Number, x2:Number, y2:Number, + out:Vector., o:int, tangents:Boolean) : void { + if (p == 0) p = 0.0001; + var tt:Number = p * p, ttt:Number = tt * p, u:Number = 1 - p, uu:Number = u * u, uuu:Number = uu * u; + var ut:Number = u * p, ut3:Number = ut * 3, uut3:Number = u * ut3, utt3:Number = ut3 * p; + var x:Number = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y:Number = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; + out[o] = x; + out[o + 1] = y; + if (tangents) out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + } + + public function get bones () : Vector. { + return _bones; + } + + public function get data () : PathConstraintData { + return _data; + } + + public function toString () : String { + return _data.name; + } +} + +} diff --git a/spine-as3/spine-as3/src/spine/PathConstraintData.as b/spine-as3/spine-as3/src/spine/PathConstraintData.as new file mode 100644 index 000000000..45863d0c0 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/PathConstraintData.as @@ -0,0 +1,62 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine { + +public dynamic class PathConstraintData { + internal var _name:String; + internal var _bones:Vector. = new Vector.(); + public var target:SlotData; + public var positionMode:PositionMode; + public var spacingMode:SpacingMode; + public var rotateMode:RotateMode; + public var offsetRotation:Number; + public var position:Number, spacing:Number, rotateMix:Number, translateMix:Number; + + public function PathConstraintData (name:String) { + if (name == null) throw new ArgumentError("name cannot be null."); + _name = name; + } + + public function get bones () : Vector. { + return _bones; + } + + public function get name () : String { + return _name; + } + + public function toString () : String { + return name; + } +} + +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/Polygon.as b/spine-as3/spine-as3/src/spine/Polygon.as index ae459c587..b7acb8ca7 100644 --- a/spine-as3/spine-as3/src/spine/Polygon.as +++ b/spine-as3/spine-as3/src/spine/Polygon.as @@ -34,6 +34,9 @@ package spine { public class Polygon { public var vertices:Vector. = new Vector.(); + public function Polygon () { + } + /** Returns true if the polygon contains the point. */ public function containsPoint (x:Number, y:Number) : Boolean { var nn:int = vertices.length; diff --git a/spine-as3/spine-as3/src/spine/attachments/FfdAttachment.as b/spine-as3/spine-as3/src/spine/PositionMode.as similarity index 91% rename from spine-as3/spine-as3/src/spine/attachments/FfdAttachment.as rename to spine-as3/spine-as3/src/spine/PositionMode.as index 5edab5adf..ac8dabb00 100644 --- a/spine-as3/spine-as3/src/spine/attachments/FfdAttachment.as +++ b/spine-as3/spine-as3/src/spine/PositionMode.as @@ -29,10 +29,11 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine.attachments { - -public interface FfdAttachment { - function applyFFD (sourceAttachment:Attachment) : Boolean; +package spine { + +public class PositionMode { + public static const fixed:PositionMode = new PositionMode(); + public static const percent:PositionMode = new PositionMode(); } -} +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/RotateMode.as b/spine-as3/spine-as3/src/spine/RotateMode.as new file mode 100644 index 000000000..f869f79b9 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/RotateMode.as @@ -0,0 +1,40 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine { + +public class RotateMode { + public static const tangent:RotateMode = new RotateMode(); + public static const chain:RotateMode = new RotateMode(); + public static const chainScale:RotateMode = new RotateMode(); +} + +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/Skeleton.as b/spine-as3/spine-as3/src/spine/Skeleton.as index b940566b6..1ff5cb4fb 100644 --- a/spine-as3/spine-as3/src/spine/Skeleton.as +++ b/spine-as3/spine-as3/src/spine/Skeleton.as @@ -30,6 +30,8 @@ *****************************************************************************/ package spine { +import flash.utils.Dictionary; +import spine.attachments.PathAttachment; import spine.attachments.Attachment; public class Skeleton { @@ -37,8 +39,9 @@ public class Skeleton { public var bones:Vector.; public var slots:Vector.; public var drawOrder:Vector.; - public var ikConstraints:Vector.; + public var ikConstraints:Vector., ikConstraintsSorted:Vector.; public var transformConstraints:Vector.; + public var pathConstraints:Vector.; private var _updateCache:Vector. = new Vector.(); private var _skin:Skin; public var r:Number = 1, g:Number = 1, b:Number = 1, a:Number = 1; @@ -53,55 +56,181 @@ public class Skeleton { bones = new Vector.(); for each (var boneData:BoneData in data.bones) { - var parent:Bone = boneData.parent == null ? null : bones[data.bones.indexOf(boneData.parent)]; - bones[bones.length] = new Bone(boneData, this, parent); + var bone:Bone; + if (boneData.parent == null) + bone = new Bone(boneData, this, null); + else { + var parent:Bone = bones[boneData.parent.index]; + bone = new Bone(boneData, this, parent); + parent.children.push(bone); + } + bones.push(bone); } slots = new Vector.(); drawOrder = new Vector.(); for each (var slotData:SlotData in data.slots) { - var bone:Bone = bones[data.bones.indexOf(slotData.boneData)]; + bone = bones[slotData.boneData.index]; var slot:Slot = new Slot(slotData, bone); - slots[slots.length] = slot; + slots.push(slot); drawOrder[drawOrder.length] = slot; } ikConstraints = new Vector.(); + ikConstraintsSorted = new Vector.(); for each (var ikConstraintData:IkConstraintData in data.ikConstraints) - ikConstraints[ikConstraints.length] = new IkConstraint(ikConstraintData, this); + ikConstraints.push(new IkConstraint(ikConstraintData, this)); transformConstraints = new Vector.(); for each (var transformConstraintData:TransformConstraintData in data.transformConstraints) - transformConstraints[transformConstraints.length] = new TransformConstraint(transformConstraintData, this); + transformConstraints.push(new TransformConstraint(transformConstraintData, this)); + + pathConstraints = new Vector.(); + for each (var pathConstraintData:PathConstraintData in data.pathConstraints) + pathConstraints.push(new PathConstraint(pathConstraintData, this)); updateCache(); } - /** Caches information about bones and constraints. Must be called if bones or constraints are added or removed. */ + /** Caches information about bones and constraints. Must be called if bones, constraints, or weighted path attachments are + * added or removed. */ public function updateCache () : void { - var updateCache:Vector. = _updateCache; - var ikConstraints:Vector. = this.ikConstraints; - var transformConstraints:Vector. = this.transformConstraints; - updateCache.length = bones.length + ikConstraints.length; - var i:int = 0; - for each (var bone:Bone in bones) { - updateCache[i++] = bone; - for each (var ikConstraint:IkConstraint in ikConstraints) { - if (bone == ikConstraint.bones[ikConstraint.bones.length - 1]) { - updateCache[i++] = ikConstraint; - break; - } + var updateCache:Vector. = this._updateCache; + updateCache.length = 0; + + var bones:Vector. = this.bones; + for (var i:int = 0, n:int = bones.length; i < n; i++) + bones[i]._sorted = false; + + // IK first, lowest hierarchy depth first. + var ikConstraints:Vector. = this.ikConstraintsSorted; + ikConstraints.length = 0; + for each (var c:IkConstraint in this.ikConstraints) + ikConstraints.push(c); + var ikCount:int = ikConstraints.length; + var level:int; + for (i = 0, n = ikCount; i < n; i++) { + var ik:IkConstraint = ikConstraints[i]; + var bone:Bone = ik.bones[0].parent; + for (level = 0; bone != null; level++) + bone = bone.parent; + ik.level = level; + } + var ii:int; + for (i = 1; i < ikCount; i++) { + ik = ikConstraints[i]; + level = ik.level; + for (ii = i - 1; ii >= 0; ii--) { + var other:IkConstraint = ikConstraints[ii]; + if (other.level < level) break; + ikConstraints[ii + 1] = other; } + ikConstraints[ii + 1] = ik; + } + for (i = 0, n = ikConstraints.length; i < n; i++) { + var ikConstraint:IkConstraint = ikConstraints[i]; + var target:Bone = ikConstraint.target; + sortBone(target); + + var constrained:Vector. = ikConstraint.bones; + var parent:Bone = constrained[0]; + sortBone(parent); + + updateCache.push(ikConstraint); + + sortReset(parent.children); + constrained[constrained.length - 1]._sorted = true; } - for each (var transformConstraint:TransformConstraint in transformConstraints) { - for (i = updateCache.length - 1; i >= 0; i--) { - var updatable:Updatable = updateCache[i]; - if (updatable == transformConstraint.bone || updatable == transformConstraint.target) { - updateCache.splice(i + 1, 0, transformConstraint); - break; - } - } + var pathConstraints:Vector. = this.pathConstraints; + for (i = 0, n = pathConstraints.length; i < n; i++) { + var pathConstraint:PathConstraint = pathConstraints[i]; + + var slot:Slot = pathConstraint.target; + var slotIndex:int = slot.data.index; + var slotBone:Bone = slot.bone; + if (skin != null) sortPathConstraintAttachment(skin, slotIndex, slotBone); + if (_data.defaultSkin != null && _data.defaultSkin != skin) + sortPathConstraintAttachment(_data.defaultSkin, slotIndex, slotBone); + + var nn:int; + for (ii = 0, nn = _data.skins.length; ii < nn; ii++) + sortPathConstraintAttachment(_data.skins[ii], slotIndex, slotBone); + + var attachment:PathAttachment = slot.attachment as PathAttachment; + if (attachment != null) sortPathConstraintAttachment2(attachment, slotBone); + + constrained = pathConstraint.bones; + var boneCount:int = constrained.length; + for (ii = 0; ii < boneCount; ii++) + sortBone(constrained[ii]); + + updateCache.push(pathConstraint); + + for (ii = 0; ii < boneCount; ii++) + sortReset(constrained[ii].children); + for (ii = 0; ii < boneCount; ii++) + constrained[ii]._sorted = true; + } + + var transformConstraints:Vector. = this.transformConstraints; + for (i = 0, n = transformConstraints.length; i < n; i++) { + var transformConstraint:TransformConstraint = transformConstraints[i]; + + sortBone(transformConstraint.target); + + constrained = transformConstraint.bones; + boneCount = constrained.length; + for (ii = 0; ii < boneCount; ii++) + sortBone(constrained[ii]); + + updateCache.push(transformConstraint); + + for (ii = 0; ii < boneCount; ii++) + sortReset(constrained[ii].children); + for (ii = 0; ii < boneCount; ii++) + constrained[ii]._sorted = true; + } + + for (i = 0, n = bones.length; i < n; i++) + sortBone(bones[i]); + } + + private function sortPathConstraintAttachment (skin:Skin, slotIndex:int, slotBone:Bone) : void { + var dict:Dictionary = skin.attachments[slotIndex]; + if (!dict) return; + + for each (var value:Attachment in dict) { + sortPathConstraintAttachment2(value, slotBone); + } + } + + private function sortPathConstraintAttachment2 (attachment:Attachment, slotBone:Bone) : void { + var pathAttachment:PathAttachment = attachment as PathAttachment; + if (!pathAttachment) return; + var pathBones:Vector. = pathAttachment.bones; + if (pathBones == null) + sortBone(slotBone); + else { + var bones:Vector. = this.bones; + for each (var boneIndex:int in pathBones) + sortBone(bones[boneIndex]); + } + } + + private function sortBone (bone:Bone) : void { + if (bone._sorted) return; + var parent:Bone = bone.parent; + if (parent != null) sortBone(parent); + bone._sorted = true; + _updateCache.push(bone); + } + + private function sortReset (bones:Vector.) : void { + for (var i:int = 0, n:int = bones.length; i < n; i++) { + var bone:Bone = bones[i]; + if (bone._sorted) sortReset(bone.children); + bone._sorted = false; } } @@ -128,9 +257,17 @@ public class Skeleton { } for each (var transformConstraint:TransformConstraint in transformConstraints) { + transformConstraint.rotateMix = transformConstraint._data.rotateMix; transformConstraint.translateMix = transformConstraint._data.translateMix; - transformConstraint.x = transformConstraint._data.x; - transformConstraint.y = transformConstraint._data.y; + transformConstraint.scaleMix = transformConstraint._data.scaleMix; + transformConstraint.shearMix = transformConstraint._data.shearMix; + } + + for each (var pathConstraint:PathConstraint in pathConstraints) { + pathConstraint.position = pathConstraint._data.position; + pathConstraint.spacing = pathConstraint._data.spacing; + pathConstraint.rotateMix = pathConstraint._data.rotateMix; + pathConstraint.translateMix = pathConstraint._data.translateMix; } } @@ -145,6 +282,10 @@ public class Skeleton { public function get data () : SkeletonData { return _data; } + + public function get getUpdateCache () : Vector. { + return _updateCache; + } public function get rootBone () : Bone { if (bones.length == 0) return null; @@ -282,6 +423,14 @@ public class Skeleton { if (transformConstraint._data._name == constraintName) return transformConstraint; return null; } + + /** @return May be null. */ + public function findPathConstraint (constraintName:String) : PathConstraint { + if (constraintName == null) throw new ArgumentError("constraintName cannot be null."); + for each (var pathConstraint:PathConstraint in pathConstraints) + if (pathConstraint._data._name == constraintName) return pathConstraint; + return null; + } public function update (delta:Number) : void { time += delta; diff --git a/spine-as3/spine-as3/src/spine/SkeletonBounds.as b/spine-as3/spine-as3/src/spine/SkeletonBounds.as index 9024d12f5..0999131f0 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonBounds.as +++ b/spine-as3/spine-as3/src/spine/SkeletonBounds.as @@ -38,11 +38,13 @@ public class SkeletonBounds { public var boundingBoxes:Vector. = new Vector.(); public var polygons:Vector. = new Vector.(); public var minX:Number, minY:Number, maxX:Number, maxY:Number; + + public function SkeletonBounds () { + } public function update (skeleton:Skeleton, updateAabb:Boolean) : void { var slots:Vector. = skeleton.slots; - var slotCount:int = slots.length; - var x:Number = skeleton.x, y:Number = skeleton.y; + var slotCount:int = slots.length; boundingBoxes.length = 0; for each (var polygon:Polygon in polygons) @@ -63,8 +65,8 @@ public class SkeletonBounds { polygon = new Polygon(); polygons[polygons.length] = polygon; - polygon.vertices.length = boundingBox.vertices.length; - boundingBox.computeWorldVertices(x, y, slot.bone, polygon.vertices); + polygon.vertices.length = boundingBox.worldVerticesLength; + boundingBox.computeWorldVertices(slot, polygon.vertices); } if (updateAabb) aabbCompute(); diff --git a/spine-as3/spine-as3/src/spine/SkeletonData.as b/spine-as3/spine-as3/src/spine/SkeletonData.as index 1a0802ccd..99a9047de 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonData.as +++ b/spine-as3/spine-as3/src/spine/SkeletonData.as @@ -43,8 +43,12 @@ public class SkeletonData { public var animations:Vector. = new Vector.(); public var ikConstraints:Vector. = new Vector.(); public var transformConstraints:Vector. = new Vector.(); + public var pathConstraints:Vector. = new Vector.(); public var width:Number, height:Number; public var version:String, hash:String; + + public function SkeletonData () { + } // --- Bones. @@ -135,6 +139,37 @@ public class SkeletonData { if (transformConstraintData._name == constraintName) return transformConstraintData; return null; } + + /** @return -1 if the transform constraint was not found. */ + public function findTransformConstraintIndex (transformConstraintName:String) : int { + if (transformConstraintName == null) throw new ArgumentError("transformConstraintName cannot be null."); + var transformConstraints:Vector. = this.transformConstraints; + for (var i:int = 0, n:int = transformConstraints.length; i < n; i++) + if (transformConstraints[i].name == transformConstraintName) return i; + return -1; + } + + // --- Path constraints. + + /** @return May be null. */ + public function findPathConstraint (constraintName:String) : PathConstraintData { + if (constraintName == null) throw new ArgumentError("constraintName cannot be null."); + var pathConstraints:Vector. = this.pathConstraints; + for (var i:int = 0, n:int = pathConstraints.length; i < n; i++) { + var constraint:PathConstraintData = pathConstraints[i]; + if (constraint.name == constraintName) return constraint; + } + return null; + } + + /** @return -1 if the path constraint was not found. */ + public function findPathConstraintIndex (pathConstraintName:String) : int { + if (pathConstraintName == null) throw new ArgumentError("pathConstraintName cannot be null."); + var pathConstraints:Vector. = this.pathConstraints; + for (var i:int = 0, n:int = pathConstraints.length; i < n; i++) + if (pathConstraints[i].name == pathConstraintName) return i; + return -1; + } // --- diff --git a/spine-as3/spine-as3/src/spine/SkeletonJson.as b/spine-as3/spine-as3/src/spine/SkeletonJson.as index 24294e038..b67c87742 100644 --- a/spine-as3/spine-as3/src/spine/SkeletonJson.as +++ b/spine-as3/spine-as3/src/spine/SkeletonJson.as @@ -29,6 +29,13 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ package spine { +import spine.animation.PathConstraintMixTimeline; +import spine.animation.PathConstraintSpacingTimeline; +import spine.animation.PathConstraintPositionTimeline; +import spine.animation.TransformConstraintTimeline; +import spine.animation.ShearTimeline; +import spine.attachments.PathAttachment; +import spine.attachments.VertexAttachment; import flash.utils.ByteArray; import spine.animation.Animation; @@ -37,7 +44,7 @@ import spine.animation.ColorTimeline; import spine.animation.CurveTimeline; import spine.animation.DrawOrderTimeline; import spine.animation.EventTimeline; -import spine.animation.FfdTimeline; +import spine.animation.DeformTimeline; import spine.animation.IkConstraintTimeline; import spine.animation.RotateTimeline; import spine.animation.ScaleTimeline; @@ -49,7 +56,6 @@ import spine.attachments.AttachmentType; import spine.attachments.BoundingBoxAttachment; import spine.attachments.MeshAttachment; import spine.attachments.RegionAttachment; -import spine.attachments.WeightedMeshAttachment; public class SkeletonJson { public var attachmentLoader:AttachmentLoader; @@ -83,8 +89,8 @@ public class SkeletonJson { skeletonData.hash = skeletonMap["hash"]; skeletonData.version = skeletonMap["spine"]; skeletonData.width = skeletonMap["width"] || 0; - skeletonData.height = skeletonMap["height"] || 0; - } + skeletonData.height = skeletonMap["height"] || 0; + } // Bones. var boneData:BoneData; @@ -95,60 +101,27 @@ public class SkeletonJson { parent = skeletonData.findBone(parentName); if (!parent) throw new Error("Parent bone not found: " + parentName); } - boneData = new BoneData(boneMap["name"], parent); + boneData = new BoneData(skeletonData.bones.length, boneMap["name"], parent); boneData.length = Number(boneMap["length"] || 0) * scale; boneData.x = Number(boneMap["x"] || 0) * scale; boneData.y = Number(boneMap["y"] || 0) * scale; boneData.rotation = (boneMap["rotation"] || 0); boneData.scaleX = boneMap.hasOwnProperty("scaleX") ? boneMap["scaleX"] : 1; boneData.scaleY = boneMap.hasOwnProperty("scaleY") ? boneMap["scaleY"] : 1; - boneData.inheritScale = boneMap.hasOwnProperty("inheritScale") ? boneMap["inheritScale"] : true; - boneData.inheritRotation = boneMap.hasOwnProperty("inheritRotation") ? boneMap["inheritRotation"] : true; - skeletonData.bones[skeletonData.bones.length] = boneData; + boneData.shearX = Number(boneMap["shearX"] || 0); + boneData.shearY = Number(boneMap["shearY"] || 0); + boneData.inheritRotation = boneMap.hasOwnProperty("inheritRotation") ? Boolean(boneMap["inheritRotation"]) : true; + boneData.inheritScale = boneMap.hasOwnProperty("inheritScale") ? Boolean(boneMap["inheritScale"]) : true; + skeletonData.bones.push(boneData); } - - // IK constraints. - for each (var ikMap:Object in root["ik"]) { - var ikConstraintData:IkConstraintData = new IkConstraintData(ikMap["name"]); - - for each (var boneName:String in ikMap["bones"]) { - var bone:BoneData = skeletonData.findBone(boneName); - if (!bone) throw new Error("IK bone not found: " + boneName); - ikConstraintData.bones[ikConstraintData.bones.length] = bone; - } - - ikConstraintData.target = skeletonData.findBone(ikMap["target"]); - if (!ikConstraintData.target) throw new Error("Target bone not found: " + ikMap["target"]); - - ikConstraintData.bendDirection = (!ikMap.hasOwnProperty("bendPositive") || ikMap["bendPositive"]) ? 1 : -1; - ikConstraintData.mix = ikMap.hasOwnProperty("mix") ? ikMap["mix"] : 1; - - skeletonData.ikConstraints[skeletonData.ikConstraints.length] = ikConstraintData; - } - - // Transform constraints. - for each (var transformMap:Object in root["transform"]) { - var transformConstraintData:TransformConstraintData = new TransformConstraintData(transformMap["name"]); - - transformConstraintData.bone = skeletonData.findBone(transformMap["bone"]); - if (!transformConstraintData.bone) throw new Error("Bone not found: " + transformMap["bone"]); - - transformConstraintData.target = skeletonData.findBone(transformMap["target"]); - if (!transformConstraintData.target) throw new Error("Target bone not found: " + transformMap["target"]); - - transformConstraintData.translateMix = transformMap.hasOwnProperty("translateMix") ? transformMap["translateMix"] : 1; - transformConstraintData.x = Number(boneMap["x"] || 0) * scale; - transformConstraintData.y = Number(boneMap["y"] || 0) * scale; - - skeletonData.transformConstraints[skeletonData.transformConstraints.length] = transformConstraintData; - } - + // Slots. for each (var slotMap:Object in root["slots"]) { - boneName = slotMap["bone"]; + var slotName:String = slotMap["name"]; + var boneName:String = slotMap["bone"]; boneData = skeletonData.findBone(boneName); if (!boneData) throw new Error("Slot bone not found: " + boneName); - var slotData:SlotData = new SlotData(slotMap["name"], boneData); + var slotData:SlotData = new SlotData(skeletonData.slots.length, slotName, boneData); var color:String = slotMap["color"]; if (color) { @@ -160,8 +133,81 @@ public class SkeletonJson { slotData.attachmentName = slotMap["attachment"]; slotData.blendMode = BlendMode[slotMap["blend"] || "normal"]; + skeletonData.slots.push(slotData); + } - skeletonData.slots[skeletonData.slots.length] = slotData; + // IK constraints. + for each (var constraintMap:Object in root["ik"]) { + var ikConstraintData:IkConstraintData = new IkConstraintData(constraintMap["name"]); + + for each (boneName in constraintMap["bones"]) { + var bone:BoneData = skeletonData.findBone(boneName); + if (!bone) throw new Error("IK constraint bone not found: " + boneName); + ikConstraintData.bones.push(bone); + } + + ikConstraintData.target = skeletonData.findBone(constraintMap["target"]); + if (!ikConstraintData.target) throw new Error("Target bone not found: " + constraintMap["target"]); + + ikConstraintData.bendDirection = (!constraintMap.hasOwnProperty("bendPositive") || constraintMap["bendPositive"]) ? 1 : -1; + ikConstraintData.mix = constraintMap.hasOwnProperty("mix") ? constraintMap["mix"] : 1; + + skeletonData.ikConstraints.push(ikConstraintData); + } + + // Transform constraints. + for each (constraintMap in root["transform"]) { + var transformConstraintData:TransformConstraintData = new TransformConstraintData(constraintMap["name"]); + + for each (boneName in constraintMap["bones"]) { + bone = skeletonData.findBone(boneName); + if (!bone) throw new Error("Transform constraint bone not found: " + boneName); + transformConstraintData.bones.push(bone); + } + + transformConstraintData.target = skeletonData.findBone(constraintMap["target"]); + if (!transformConstraintData.target) throw new Error("Target bone not found: " + constraintMap["target"]); + + transformConstraintData.offsetRotation = Number(constraintMap["rotation"] || 0); + transformConstraintData.offsetX = Number(constraintMap["x"] || 0) * scale; + transformConstraintData.offsetY = Number(constraintMap["y"] || 0) * scale; + transformConstraintData.offsetScaleX = Number(constraintMap["scaleX"] || 0); + transformConstraintData.offsetScaleY = Number(constraintMap["scaleY"] || 0); + transformConstraintData.offsetShearY = Number(constraintMap["shearY"] || 0); + + transformConstraintData.rotateMix = constraintMap.hasOwnProperty("rotateMix") ? constraintMap["rotateMix"] : 1; + transformConstraintData.translateMix = constraintMap.hasOwnProperty("translateMix") ? constraintMap["translateMix"] : 1; + transformConstraintData.scaleMix = constraintMap.hasOwnProperty("scaleMix") ? constraintMap["scaleMix"] : 1; + transformConstraintData.shearMix = constraintMap.hasOwnProperty("shearMix") ? constraintMap["shearMix"] : 1; + + skeletonData.transformConstraints.push(transformConstraintData); + } + + // Path constraints. + for each (constraintMap in root["path"]) { + var pathConstraintData:PathConstraintData = new PathConstraintData(constraintMap["name"]); + + for each (boneName in constraintMap["bones"]) { + bone = skeletonData.findBone(boneName); + if (!bone) throw new Error("Path constraint bone not found: " + boneName); + pathConstraintData.bones.push(bone); + } + + pathConstraintData.target = skeletonData.findSlot(constraintMap["target"]); + if (!pathConstraintData.target) throw new Error("Path target slot not found: " + constraintMap["target"]); + + pathConstraintData.positionMode = PositionMode[constraintMap["positionMode"] || "percent"]; + pathConstraintData.spacingMode = SpacingMode[constraintMap["spacingMode"] || "length"]; + pathConstraintData.rotateMode = RotateMode[constraintMap["rotateMode"] || "rotateMode"]; + pathConstraintData.offsetRotation = Number(constraintMap["rotation"] || 0); + pathConstraintData.position = Number(constraintMap["position"] || 0); + if (pathConstraintData.positionMode == PositionMode.fixed) pathConstraintData.position *= scale; + pathConstraintData.spacing = Number(constraintMap["spacing"] || 0); + if (pathConstraintData.spacingMode == SpacingMode.length || pathConstraintData.spacingMode == SpacingMode.fixed) pathConstraintData.spacing *= scale; + pathConstraintData.rotateMix = constraintMap.hasOwnProperty("rotateMix") ? constraintMap["rotateMix"] : 1; + pathConstraintData.translateMix = constraintMap.hasOwnProperty("translateMix") ? constraintMap["translateMix"] : 1; + + skeletonData.pathConstraints.push(pathConstraintData); } // Skins. @@ -169,11 +215,11 @@ public class SkeletonJson { for (var skinName:String in skins) { var skinMap:Object = skins[skinName]; var skin:Skin = new Skin(skinName); - for (var slotName:String in skinMap) { + for (slotName in skinMap) { var slotIndex:int = skeletonData.findSlotIndex(slotName); var slotEntry:Object = skinMap[slotName]; for (var attachmentName:String in slotEntry) { - var attachment:Attachment = readAttachment(skin, slotIndex, attachmentName, slotEntry[attachmentName]); + var attachment:Attachment = readAttachment(slotEntry[attachmentName], skin, slotIndex, attachmentName); if (attachment != null) skin.addAttachment(slotIndex, attachmentName, attachment); } @@ -184,20 +230,14 @@ public class SkeletonJson { } // Linked meshes. + var linkedMeshes:Vector. = this.linkedMeshes; for each (var linkedMesh:LinkedMesh in linkedMeshes) { var parentSkin:Skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); if (!parentSkin) throw new Error("Skin not found: " + linkedMesh.skin); var parentMesh:Attachment = parentSkin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); if (!parentMesh) throw new Error("Parent mesh not found: " + linkedMesh.parent); - if (linkedMesh.mesh is MeshAttachment) { - var mesh:MeshAttachment = MeshAttachment(linkedMesh.mesh); - mesh.parentMesh = MeshAttachment(parentMesh); - mesh.updateUVs(); - } else { - var weightedMesh:WeightedMeshAttachment = WeightedMeshAttachment(linkedMesh.mesh); - weightedMesh.parentMesh = WeightedMeshAttachment(parentMesh); - weightedMesh.updateUVs(); - } + linkedMesh.mesh.parentMesh = MeshAttachment(parentMesh); + linkedMesh.mesh.updateUVs(); } linkedMeshes.length = 0; @@ -210,33 +250,31 @@ public class SkeletonJson { eventData.intValue = eventMap["int"] || 0; eventData.floatValue = eventMap["float"] || 0; eventData.stringValue = eventMap["string"] || null; - skeletonData.events[skeletonData.events.length] = eventData; + skeletonData.events.push(eventData); } } // Animations. var animations:Object = root["animations"]; for (var animationName:String in animations) - readAnimation(animationName, animations[animationName], skeletonData); + readAnimation(animations[animationName], animationName, skeletonData); return skeletonData; } - private function readAttachment (skin:Skin, slotIndex:int, name:String, map:Object) : Attachment { + private function readAttachment (map:Object, skin:Skin, slotIndex:int, name:String) : Attachment { name = map["name"] || name; - var typeName:String = map["type"] || "region"; - if (typeName == "skinnedmesh") typeName = "weightedmesh"; - var type:AttachmentType = AttachmentType[typeName]; - var path:String = map["path"] || name; + var typeName:String = map["type"] || "region"; + var type:AttachmentType = AttachmentType[typeName]; var scale:Number = this.scale; - var color:String, vertices:Vector.; + var color:String; switch (type) { case AttachmentType.region: - var region:RegionAttachment = attachmentLoader.newRegionAttachment(skin, name, path); + var region:RegionAttachment = attachmentLoader.newRegionAttachment(skin, name, map["path"] || name); if (!region) return null; - region.path = path; + region.path = map["path"] || name; region.x = Number(map["x"] || 0) * scale; region.y = Number(map["y"] || 0) * scale; region.scaleX = map.hasOwnProperty("scaleX") ? map["scaleX"] : 1; @@ -255,9 +293,9 @@ public class SkeletonJson { return region; case AttachmentType.mesh: case AttachmentType.linkedmesh: - var mesh:MeshAttachment = attachmentLoader.newMeshAttachment(skin, name, path); + var mesh:MeshAttachment = attachmentLoader.newMeshAttachment(skin, name, map["path"] || name); if (!mesh) return null; - mesh.path = path; + mesh.path = map["path"] || name; color = map["color"]; if (color) { @@ -270,78 +308,79 @@ public class SkeletonJson { mesh.width = Number(map["width"] || 0) * scale; mesh.height = Number(map["height"] || 0) * scale; - if (!map["parent"]) { - mesh.vertices = getFloatArray(map, "vertices", scale); - mesh.triangles = getUintArray(map, "triangles"); - mesh.regionUVs = getFloatArray(map, "uvs", 1); - mesh.updateUVs(); - - mesh.hullLength = int(map["hull"] || 0) * 2; - if (map["edges"]) mesh.edges = getIntArray(map, "edges"); - } else { - mesh.inheritFFD = map.hasOwnProperty("ffd") ? map["ffd"] : true; - linkedMeshes[linkedMeshes.length] = new LinkedMesh(mesh, map["skin"], slotIndex, map["parent"]); + if (map["parent"]) { + mesh.inheritDeform = map.hasOwnProperty("deform") ? Boolean(map["deform"]) : true; + linkedMeshes.push(new LinkedMesh(mesh, map["skin"], slotIndex, map["parent"])); + return mesh; } - return mesh; - case AttachmentType.weightedmesh: - case AttachmentType.weightedlinkedmesh: - var weightedMesh:WeightedMeshAttachment = attachmentLoader.newWeightedMeshAttachment(skin, name, path); - if (!weightedMesh) return null; + + var uvs:Vector. = getFloatArray(map, "uvs", 1); + readVertices(map, mesh, uvs.length); + mesh.triangles = getUintArray(map, "triangles"); + mesh.regionUVs = uvs; + mesh.updateUVs(); - weightedMesh.path = path; - - color = map["color"]; - if (color) { - weightedMesh.r = toColor(color, 0); - weightedMesh.g = toColor(color, 1); - weightedMesh.b = toColor(color, 2); - weightedMesh.a = toColor(color, 3); - } - - weightedMesh.width = Number(map["width"] || 0) * scale; - weightedMesh.height = Number(map["height"] || 0) * scale; - - if (!map["parent"]) { - var uvs:Vector. = getFloatArray(map, "uvs", 1); - vertices = getFloatArray(map, "vertices", 1); - var weights:Vector. = new Vector.(); - var bones:Vector. = new Vector.(); - for (var i:int = 0, n:int = vertices.length; i < n;) { - var boneCount:int = int(vertices[i++]); - bones[bones.length] = boneCount; - for (var nn:int = i + boneCount * 4; i < nn;) { - bones[bones.length] = vertices[i]; - weights[weights.length] = vertices[i + 1] * scale; - weights[weights.length] = vertices[i + 2] * scale; - weights[weights.length] = vertices[i + 3]; - i += 4; - } - } - weightedMesh.bones = bones; - weightedMesh.weights = weights; - weightedMesh.triangles = getUintArray(map, "triangles"); - weightedMesh.regionUVs = uvs; - weightedMesh.updateUVs(); - - weightedMesh.hullLength = int(map["hull"] || 0) * 2; - if (map["edges"]) weightedMesh.edges = getIntArray(map, "edges"); - } else { - weightedMesh.inheritFFD = map.hasOwnProperty("ffd") ? map["ffd"] : true; - linkedMeshes[linkedMeshes.length] = new LinkedMesh(weightedMesh, map["skin"], slotIndex, map["parent"]); - } - return weightedMesh; + mesh.hullLength = int(map["hull"] || 0) * 2; + if (map["edges"]) mesh.edges = getIntArray(map, "edges"); + return mesh; case AttachmentType.boundingbox: var box:BoundingBoxAttachment = attachmentLoader.newBoundingBoxAttachment(skin, name); - vertices = box.vertices; - for each (var point:Number in map["vertices"]) - vertices[vertices.length] = point * scale; + if (!box) return null; + readVertices(map, box, int(map["vertexCount"]) << 1); return box; + case AttachmentType.path: + var path:PathAttachment = attachmentLoader.newPathAttachment(skin, name); + if (!path) return null; + path.closed = map.hasOwnProperty("closed") ? Boolean(map["closed"]) : false; + path.constantSpeed = map.hasOwnProperty("constantSpeed") ? Boolean(map["constantSpeed"]) : true; + + var vertexCount:int = int(map["vertexCount"]); + readVertices(map, path, vertexCount << 1); + + var lengths:Vector. = new Vector.(); + for each (var curves:Object in map["lengths"]) { + lengths.push(Number(curves) * scale); + } + path.lengths = lengths; + return path; } return null; } + + private function readVertices(map:Object, attachment:VertexAttachment, verticesLength:int) : void { + attachment.worldVerticesLength = verticesLength; + var vertices:Vector. = getFloatArray(map, "vertices", 1); + if (verticesLength == vertices.length) { + if (scale != 1) { + for (var i:int = 0, n:int = vertices.length; i < n; i++) { + vertices[i] *= scale; + } + } + attachment.vertices = vertices; + return; + } + + var weights:Vector. = new Vector.(verticesLength * 3 * 3); + weights.length = 0; + var bones:Vector. = new Vector.(verticesLength * 3); + bones.length = 0; + for (i = 0, n = vertices.length; i < n;) { + var boneCount:int = int(vertices[i++]); + bones.push(boneCount); + for (var nn:int = i + boneCount * 4; i < nn; i+=4) { + bones.push(int(vertices[i])); + weights.push(vertices[i + 1] * scale); + weights.push(vertices[i + 2] * scale); + weights.push(vertices[i + 3]); + } + } + attachment.bones = bones; + attachment.vertices = weights; + } - private function readAnimation (name:String, map:Object, skeletonData:SkeletonData) : void { + private function readAnimation (map:Object, name:String, skeletonData:SkeletonData) : void { + var scale:Number = this.scale; var timelines:Vector. = new Vector.(); var duration:Number = 0; @@ -369,11 +408,11 @@ public class SkeletonJson { var b:Number = toColor(color, 2); var a:Number = toColor(color, 3); colorTimeline.setFrame(frameIndex, valueMap["time"], r, g, b, a); - readCurve(colorTimeline, frameIndex, valueMap); + readCurve(valueMap, colorTimeline, frameIndex); frameIndex++; } timelines[timelines.length] = colorTimeline; - duration = Math.max(duration, colorTimeline.frames[colorTimeline.frameCount * 5 - 5]); + duration = Math.max(duration, colorTimeline.frames[(colorTimeline.frameCount - 1) * ColorTimeline.ENTRIES]); } else if (timelineName == "attachment") { var attachmentTimeline:AttachmentTimeline = new AttachmentTimeline(values.length); attachmentTimeline.slotIndex = slotIndex; @@ -403,32 +442,34 @@ public class SkeletonJson { frameIndex = 0; for each (valueMap in values) { rotateTimeline.setFrame(frameIndex, valueMap["time"], valueMap["angle"]); - readCurve(rotateTimeline, frameIndex, valueMap); + readCurve(valueMap, rotateTimeline, frameIndex); frameIndex++; } timelines[timelines.length] = rotateTimeline; - duration = Math.max(duration, rotateTimeline.frames[rotateTimeline.frameCount * 2 - 2]); - } else if (timelineName == "translate" || timelineName == "scale") { - var timeline:TranslateTimeline; + duration = Math.max(duration, rotateTimeline.frames[(rotateTimeline.frameCount - 1) * RotateTimeline.ENTRIES]); + } else if (timelineName == "translate" || timelineName == "scale" || timelineName == "shear") { + var translateTimeline:TranslateTimeline; var timelineScale:Number = 1; if (timelineName == "scale") - timeline = new ScaleTimeline(values.length); + translateTimeline = new ScaleTimeline(values.length); + else if (timelineName == "shear") + translateTimeline = new ShearTimeline(values.length); else { - timeline = new TranslateTimeline(values.length); + translateTimeline = new TranslateTimeline(values.length); timelineScale = scale; } - timeline.boneIndex = boneIndex; + translateTimeline.boneIndex = boneIndex; frameIndex = 0; for each (valueMap in values) { var x:Number = Number(valueMap["x"] || 0) * timelineScale; var y:Number = Number(valueMap["y"] || 0) * timelineScale; - timeline.setFrame(frameIndex, valueMap["time"], x, y); - readCurve(timeline, frameIndex, valueMap); + translateTimeline.setFrame(frameIndex, valueMap["time"], x, y); + readCurve(valueMap, translateTimeline, frameIndex); frameIndex++; } - timelines[timelines.length] = timeline; - duration = Math.max(duration, timeline.frames[timeline.frameCount * 3 - 3]); + timelines[timelines.length] = translateTimeline; + duration = Math.max(duration, translateTimeline.frames[(translateTimeline.frameCount - 1) * TranslateTimeline.ENTRIES]); } else throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); } @@ -445,67 +486,133 @@ public class SkeletonJson { var mix:Number = valueMap.hasOwnProperty("mix") ? valueMap["mix"] : 1; var bendDirection:int = (!valueMap.hasOwnProperty("bendPositive") || valueMap["bendPositive"]) ? 1 : -1; ikTimeline.setFrame(frameIndex, valueMap["time"], mix, bendDirection); - readCurve(ikTimeline, frameIndex, valueMap); + readCurve(valueMap, ikTimeline, frameIndex); frameIndex++; } timelines[timelines.length] = ikTimeline; - duration = Math.max(duration, ikTimeline.frames[ikTimeline.frameCount * 3 - 3]); + duration = Math.max(duration, ikTimeline.frames[(ikTimeline.frameCount - 1) * IkConstraintTimeline.ENTRIES]); } - - var ffd:Object = map["ffd"]; - for (var skinName:String in ffd) { + + var transformMap:Object = map["transform"]; + for (var transformName:String in transformMap) { + var transformConstraint:TransformConstraintData = skeletonData.findTransformConstraint(transformName); + values = transformMap[transformName]; + var transformTimeline:TransformConstraintTimeline = new TransformConstraintTimeline(values.length); + transformTimeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(transformConstraint); + frameIndex = 0; + for each (valueMap in values) { + var rotateMix:Number = valueMap.hasOwnProperty("rotateMix") ? valueMap["rotateMix"] : 1; + var translateMix:Number = valueMap.hasOwnProperty("translateMix") ? valueMap["translateMix"] : 1; + var scaleMix:Number = valueMap.hasOwnProperty("scaleMix") ? valueMap["scaleMix"] : 1; + var shearMix:Number = valueMap.hasOwnProperty("shearMix") ? valueMap["shearMix"] : 1; + transformTimeline.setFrame(frameIndex, valueMap["time"], rotateMix, translateMix, scaleMix, shearMix); + readCurve(valueMap, transformTimeline, frameIndex); + frameIndex++; + } + timelines.push(transformTimeline); + duration = Math.max(duration, transformTimeline.frames[(transformTimeline.frameCount - 1) * TransformConstraintTimeline.ENTRIES]); + } + + // Path constraint timelines. + var paths:Object = map["paths"]; + for (var pathName:String in paths) { + var index:int = skeletonData.findPathConstraintIndex(pathName); + if (index == -1) throw new Error("Path constraint not found: " + pathName); + var data:PathConstraintData = skeletonData.pathConstraints[index]; + + var pathMap:Object = paths[pathName]; + for (timelineName in pathMap) { + values = pathMap[timelineName]; + + if (timelineName == "position" || timelineName == "spacing") { + var pathTimeline:PathConstraintPositionTimeline; + timelineScale = 1; + if (timelineName == "spacing") { + pathTimeline = new PathConstraintSpacingTimeline(values.length); + if (data.spacingMode == SpacingMode.length || data.spacingMode == SpacingMode.fixed) timelineScale = scale; + } else { + pathTimeline = new PathConstraintPositionTimeline(values.length); + if (data.positionMode == PositionMode.fixed) timelineScale = scale; + } + pathTimeline.pathConstraintIndex = index; + frameIndex = 0; + for each (valueMap in values) { + var value:Number = valueMap[timelineName] || 0; + pathTimeline.setFrame(frameIndex, valueMap["time"], value * timelineScale); + readCurve(valueMap, pathTimeline, frameIndex); + frameIndex++; + } + timelines.push(pathTimeline); + duration = Math.max(duration, + pathTimeline.frames[(pathTimeline.frameCount - 1) * PathConstraintPositionTimeline.ENTRIES]); + } else if (timelineName == "mix") { + var pathMixTimeline:PathConstraintMixTimeline = new PathConstraintMixTimeline(values.length); + pathMixTimeline.pathConstraintIndex = index; + frameIndex = 0; + for each (valueMap in values) { + rotateMix = valueMap.hasOwnProperty("rotateMix") ? valueMap["rotateMix"] : 1; + translateMix = valueMap.hasOwnProperty("translateMix") ? valueMap["translateMix"] : 1; + pathMixTimeline.setFrame(frameIndex, valueMap["time"], rotateMix, translateMix); + readCurve(valueMap, pathMixTimeline, frameIndex); + frameIndex++; + } + timelines.push(pathMixTimeline); + duration = Math.max(duration, + pathMixTimeline.frames[(pathMixTimeline.frameCount - 1) * PathConstraintMixTimeline.ENTRIES]); + } + } + } + + var deformMap:Object = map["deform"]; + for (var skinName:String in deformMap) { var skin:Skin = skeletonData.findSkin(skinName); - slotMap = ffd[skinName]; + slotMap = deformMap[skinName]; for (slotName in slotMap) { slotIndex = skeletonData.findSlotIndex(slotName); - var meshMap:Object = slotMap[slotName]; - for (var meshName:String in meshMap) { - values = meshMap[meshName]; - var ffdTimeline:FfdTimeline = new FfdTimeline(values.length); - var attachment:Attachment = skin.getAttachment(slotIndex, meshName); - if (!attachment) throw new Error("FFD attachment not found: " + meshName); - ffdTimeline.slotIndex = slotIndex; - ffdTimeline.attachment = attachment; + var timelineMap:Object = slotMap[slotName]; + for (timelineName in timelineMap) { + values = timelineMap[timelineName]; - var vertexCount:int; - if (attachment is MeshAttachment) - vertexCount = (attachment as MeshAttachment).vertices.length; - else - vertexCount = (attachment as WeightedMeshAttachment).weights.length / 3 * 2; + var attachment:VertexAttachment = skin.getAttachment(slotIndex, timelineName) as VertexAttachment; + if (attachment == null) throw new Error("Deform attachment not found: " + timelineName); + var weighted:Boolean = attachment.bones != null; + var vertices:Vector. = attachment.vertices; + var deformLength:int = weighted ? vertices.length / 3 * 2 : vertices.length; + + var deformTimeline:DeformTimeline = new DeformTimeline(values.length); + deformTimeline.slotIndex = slotIndex; + deformTimeline.attachment = attachment; frameIndex = 0; for each (valueMap in values) { - var vertices:Vector.; - if (!valueMap["vertices"]) { - if (attachment is MeshAttachment) - vertices = (attachment as MeshAttachment).vertices; - else - vertices = new Vector.(vertexCount, true); - } else { - var verticesValue:Array = valueMap["vertices"]; - vertices = new Vector.(vertexCount, true); - var start:int = valueMap["offset"] || 0; - var n:int = verticesValue.length; - if (scale == 1) { - for (i = 0; i < n; i++) - vertices[i + start] = verticesValue[i]; - } else { - for (i = 0; i < n; i++) - vertices[i + start] = verticesValue[i] * scale; + var deform:Vector.; + var verticesValue:Object = valueMap["vertices"]; + if (verticesValue == null) + deform = weighted ? new Vector.(deformLength, true) : vertices; + else { + deform = new Vector.(deformLength, true); + var start:int = Number(valueMap["offset"] || 0); + var temp:Vector. = getFloatArray(valueMap, "vertices", 1); + for (i = 0; i < temp.length; i++) { + deform[start + i] = temp[i]; + } + if (scale != 1) { + var n:int; + for (i = start, n = i + temp.length; i < n; i++) + deform[i] *= scale; } - if (attachment is MeshAttachment) { - var meshVertices:Vector. = (attachment as MeshAttachment).vertices; - for (i = 0; i < vertexCount; i++) - vertices[i] += meshVertices[i]; + if (!weighted) { + for (i = 0; i < deformLength; i++) + deform[i] += vertices[i]; } } - ffdTimeline.setFrame(frameIndex, valueMap["time"], vertices); - readCurve(ffdTimeline, frameIndex, valueMap); + deformTimeline.setFrame(frameIndex, valueMap["time"], deform); + readCurve(valueMap, deformTimeline, frameIndex); frameIndex++; } - timelines[timelines.length] = ffdTimeline; - duration = Math.max(duration, ffdTimeline.frames[ffdTimeline.frameCount - 1]); + timelines[timelines.length] = deformTimeline; + duration = Math.max(duration, deformTimeline.frames[deformTimeline.frameCount - 1]); } } } @@ -567,8 +674,8 @@ public class SkeletonJson { skeletonData.animations[skeletonData.animations.length] = new Animation(name, timelines, duration); } - static private function readCurve (timeline:CurveTimeline, frameIndex:int, valueMap:Object) : void { - var curve:Object = valueMap["curve"]; + static private function readCurve (map:Object, timeline:CurveTimeline, frameIndex:int) : void { + var curve:Object = map["curve"]; if (!curve) return; if (curve == "stepped") timeline.setStepped(frameIndex); @@ -614,14 +721,14 @@ public class SkeletonJson { } -import spine.attachments.Attachment; +import spine.attachments.MeshAttachment; internal class LinkedMesh { internal var parent:String, skin:String; internal var slotIndex:int; - internal var mesh:Attachment; + internal var mesh:MeshAttachment; - public function LinkedMesh (mesh:Attachment, skin:String, slotIndex:int, parent:String) { + public function LinkedMesh (mesh:MeshAttachment, skin:String, slotIndex:int, parent:String) { this.mesh = mesh; this.skin = skin; this.slotIndex = slotIndex; diff --git a/spine-as3/spine-as3/src/spine/Slot.as b/spine-as3/spine-as3/src/spine/Slot.as index 5daf06b27..d178cb720 100644 --- a/spine-as3/spine-as3/src/spine/Slot.as +++ b/spine-as3/spine-as3/src/spine/Slot.as @@ -86,8 +86,7 @@ public class Slot { return _bone._skeleton.time - _attachmentTime; } - public function setToSetupPose () : void { - var slotIndex:int = _bone._skeleton.data.slots.indexOf(data); + public function setToSetupPose () : void { r = _data.r; g = _data.g; b = _data.b; @@ -96,7 +95,7 @@ public class Slot { attachment = null; else { _attachment = null; - attachment = _bone._skeleton.getAttachmentForSlotIndex(slotIndex, data.attachmentName); + attachment = _bone._skeleton.getAttachmentForSlotIndex(data.index, data.attachmentName); } } diff --git a/spine-as3/spine-as3/src/spine/SlotData.as b/spine-as3/spine-as3/src/spine/SlotData.as index 609edabaa..e81f59173 100644 --- a/spine-as3/spine-as3/src/spine/SlotData.as +++ b/spine-as3/spine-as3/src/spine/SlotData.as @@ -32,6 +32,7 @@ package spine { public class SlotData { + internal var _index:int; internal var _name:String; internal var _boneData:BoneData; public var r:Number = 1; @@ -41,12 +42,18 @@ public class SlotData { public var attachmentName:String; public var blendMode:BlendMode; - public function SlotData (name:String, boneData:BoneData) { + public function SlotData (index:int, name:String, boneData:BoneData) { + if (index < 0) throw new ArgumentError("index must be >= 0."); if (name == null) throw new ArgumentError("name cannot be null."); if (boneData == null) throw new ArgumentError("boneData cannot be null."); + _index = index; _name = name; _boneData = boneData; } + + public function get index () : int { + return _index; + } public function get name () : String { return _name; diff --git a/spine-as3/spine-as3/src/spine/SpacingMode.as b/spine-as3/spine-as3/src/spine/SpacingMode.as new file mode 100644 index 000000000..df9317e6f --- /dev/null +++ b/spine-as3/spine-as3/src/spine/SpacingMode.as @@ -0,0 +1,40 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine { + +public class SpacingMode { + public static const length:SpacingMode = new SpacingMode(); + public static const fixed:SpacingMode = new SpacingMode(); + public static const percent:SpacingMode = new SpacingMode(); +} + +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/TransformConstraint.as b/spine-as3/spine-as3/src/spine/TransformConstraint.as index a6db2bb75..b9c16f8a0 100644 --- a/spine-as3/spine-as3/src/spine/TransformConstraint.as +++ b/spine-as3/spine-as3/src/spine/TransformConstraint.as @@ -33,43 +33,97 @@ package spine { public class TransformConstraint implements Updatable { internal var _data:TransformConstraintData; - public var bone:Bone; + internal var _bones:Vector.; public var target:Bone; + public var rotateMix:Number; public var translateMix:Number; - public var x:Number; - public var y:Number; + public var scaleMix:Number; + public var shearMix:Number; + internal var _temp:Vector. = new Vector.(2); public function TransformConstraint (data:TransformConstraintData, skeleton:Skeleton) { if (data == null) throw new ArgumentError("data cannot be null."); if (skeleton == null) throw new ArgumentError("skeleton cannot be null."); _data = data; + rotateMix = data.rotateMix; translateMix = data.translateMix; - x = data.x; - y = data.y; - - bone = skeleton.findBone(data.bone._name); + scaleMix = data.scaleMix; + shearMix = data.shearMix; + _bones = new Vector.(); + for each (var boneData:BoneData in data.bones) + _bones.push(skeleton.findBone(boneData.name)); target = skeleton.findBone(data.target._name); - } + } public function apply () : void { update(); } public function update () : void { - var translateMix:Number = translateMix; - if (translateMix > 0) { - var local:Vector. = new Vector.(2, true); - local[0] = x; - local[1] = y; - target.localToWorld(local); - bone._worldX += (local[0] - bone._worldX) * translateMix; - bone._worldY += (local[1] - bone._worldY) * translateMix; + var rotateMix:Number = this.rotateMix, translateMix:Number = this.translateMix, scaleMix:Number = this.scaleMix, shearMix:Number = this.shearMix; + var target:Bone = this.target; + var ta:Number = target.a, tb:Number = target.b, tc:Number = target.c, td:Number = target.d; + var bones:Vector. = this._bones; + for (var i:int = 0, n:int = bones.length; i < n; i++) { + var bone:Bone = bones[i]; + + if (rotateMix > 0) { + var a:Number = bone.a, b:Number = bone.b, c:Number = bone.c, d:Number = bone.d; + var r:Number = Math.atan2(tc, ta) - Math.atan2(c, a) + data.offsetRotation * MathUtils.degRad; + if (r > Math.PI) + r -= Math.PI * 2; + else if (r < -Math.PI) r += Math.PI * 2; + r *= rotateMix; + var cos:Number = Math.cos(r), sin:Number = Math.sin(r); + bone._a = cos * a - sin * c; + bone._b = cos * b - sin * d; + bone._c = sin * a + cos * c; + bone._d = sin * b + cos * d; + } + + if (translateMix > 0) { + _temp[0] = data.offsetX; + _temp[1] = data.offsetY; + target.localToWorld(_temp); + bone._worldX += (_temp[0] - bone.worldX) * translateMix; + bone._worldY += (_temp[1] - bone.worldY) * translateMix; + } + + if (scaleMix > 0) { + var bs:Number = Math.sqrt(bone.a * bone.a + bone.c * bone.c); + var ts:Number = Math.sqrt(ta * ta + tc * tc); + var s:Number = bs > 0.00001 ? (bs + (ts - bs + data.offsetScaleX) * scaleMix) / bs : 0; + bone._a *= s; + bone._c *= s; + bs = Math.sqrt(bone.b * bone.b + bone.d * bone.d); + ts = Math.sqrt(tb * tb + td * td); + s = bs > 0.00001 ? (bs + (ts - bs + data.offsetScaleY) * scaleMix) / bs : 0; + bone._b *= s; + bone._d *= s; + } + + if (shearMix > 0) { + b = bone.b, d = bone.d; + var by:Number = Math.atan2(d, b); + r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); + if (r > Math.PI) + r -= Math.PI * 2; + else if (r < -Math.PI) r += Math.PI * 2; + r = by + (r + data.offsetShearY * MathUtils.degRad) * shearMix; + s = Math.sqrt(b * b + d * d); + bone._b = Math.cos(r) * s; + bone._d = Math.sin(r) * s; + } } } public function get data () : TransformConstraintData { return _data; } + + public function get bones () : Vector. { + return _bones; + } public function toString () : String { return _data._name; diff --git a/spine-as3/spine-as3/src/spine/TransformConstraintData.as b/spine-as3/spine-as3/src/spine/TransformConstraintData.as index 6e5ee6fef..4fd3b8fa6 100644 --- a/spine-as3/spine-as3/src/spine/TransformConstraintData.as +++ b/spine-as3/spine-as3/src/spine/TransformConstraintData.as @@ -33,16 +33,27 @@ package spine { public class TransformConstraintData { internal var _name:String; - public var bone:BoneData; + internal var _bones:Vector. = new Vector.(); public var target:BoneData; + public var rotateMix:Number; public var translateMix:Number; - public var x:Number; - public var y:Number; + public var scaleMix:Number; + public var shearMix:Number; + public var offsetRotation:Number; + public var offsetX:Number; + public var offsetY:Number; + public var offsetScaleX:Number; + public var offsetScaleY:Number; + public var offsetShearY:Number; public function TransformConstraintData (name:String) { if (name == null) throw new ArgumentError("name cannot be null."); _name = name; } + + public function get bones () : Vector. {; + return _bones; + } public function get name () : String { return _name; diff --git a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as index 85dfc212c..6b1491d2e 100644 --- a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as @@ -55,14 +55,13 @@ public class AttachmentTimeline implements Timeline { public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { var frames:Vector. = this.frames; - if (time < frames[0]) { - if (lastTime > time) apply(skeleton, lastTime, int.MAX_VALUE, null, 0); - return; - } else if (lastTime > time) // - lastTime = -1; + if (time < frames[0]) return; // Time is before first frame. - var frameIndex:int = time >= frames[frames.length - 1] ? frames.length - 1 : Animation.binarySearch1(frames, time) - 1; - if (frames[frameIndex] < lastTime) return; + var frameIndex:int; + if (time >= frames[frames.length - 1]) // Time is after last frame. + frameIndex = frames.length - 1; + else + frameIndex = Animation.binarySearch(frames, time, 1) - 1; var attachmentName:String = attachmentNames[frameIndex]; skeleton.slots[slotIndex].attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName); diff --git a/spine-as3/spine-as3/src/spine/animation/ColorTimeline.as b/spine-as3/spine-as3/src/spine/animation/ColorTimeline.as index eec6b79b9..b6b6848cd 100644 --- a/spine-as3/spine-as3/src/spine/animation/ColorTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/ColorTimeline.as @@ -35,11 +35,9 @@ import spine.Skeleton; import spine.Slot; public class ColorTimeline extends CurveTimeline { - static private const PREV_FRAME_TIME:int = -5; - static private const FRAME_R:int = 1; - static private const FRAME_G:int = 2; - static private const FRAME_B:int = 3; - static private const FRAME_A:int = 4; + static public const ENTRIES:int = 5; + static internal const PREV_TIME:int = -5, PREV_R:int = -4, PREV_G:int = -3, PREV_B:int = -2, PREV_A:int = -1; + static internal const R:int = 1, G:int = 2, B:int = 3, A:int = 4; public var slotIndex:int; public var frames:Vector.; // time, r, g, b, a, ... @@ -51,12 +49,12 @@ public class ColorTimeline extends CurveTimeline { /** Sets the time and value of the specified keyframe. */ public function setFrame (frameIndex:int, time:Number, r:Number, g:Number, b:Number, a:Number) : void { - frameIndex *= 5; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[int(frameIndex + 1)] = r; - frames[int(frameIndex + 2)] = g; - frames[int(frameIndex + 3)] = b; - frames[int(frameIndex + 4)] = a; + frames[int(frameIndex + R)] = r; + frames[int(frameIndex + G)] = g; + frames[int(frameIndex + B)] = b; + frames[int(frameIndex + A)] = a; } override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { @@ -64,28 +62,28 @@ public class ColorTimeline extends CurveTimeline { return; // Time is before first frame. var r:Number, g:Number, b:Number, a:Number; - if (time >= frames[int(frames.length - 5)]) { + if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame. - var i:int = frames.length - 1; - r = frames[int(i - 3)]; - g = frames[int(i - 2)]; - b = frames[int(i - 1)]; - a = frames[i]; + var i:int = frames.length; + r = frames[int(i + PREV_R)]; + g = frames[int(i + PREV_G)]; + b = frames[int(i + PREV_B)]; + a = frames[int(i + PREV_A)]; } else { // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch(frames, time, 5); - var prevFrameR:Number = frames[int(frameIndex - 4)]; - var prevFrameG:Number = frames[int(frameIndex - 3)]; - var prevFrameB:Number = frames[int(frameIndex - 2)]; - var prevFrameA:Number = frames[int(frameIndex - 1)]; - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime); - percent = getCurvePercent(frameIndex / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + r = frames[int(frame + PREV_R)]; + g = frames[int(frame + PREV_G)]; + b = frames[int(frame + PREV_B)]; + b = frames[int(frame + PREV_A)]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - r = prevFrameR + (frames[int(frameIndex + FRAME_R)] - prevFrameR) * percent; - g = prevFrameG + (frames[int(frameIndex + FRAME_G)] - prevFrameG) * percent; - b = prevFrameB + (frames[int(frameIndex + FRAME_B)] - prevFrameB) * percent; - a = prevFrameA + (frames[int(frameIndex + FRAME_A)] - prevFrameA) * percent; + r += (frames[frame + R] - r) * percent; + g += (frames[frame + G] - g) * percent; + b += (frames[frame + B] - b) * percent; + a += (frames[frame + A] - a) * percent; } var slot:Slot = skeleton.slots[slotIndex]; if (alpha < 1) { diff --git a/spine-as3/spine-as3/src/spine/animation/CurveTimeline.as b/spine-as3/spine-as3/src/spine/animation/CurveTimeline.as index d234d2ef8..9a213997f 100644 --- a/spine-as3/spine-as3/src/spine/animation/CurveTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/CurveTimeline.as @@ -30,6 +30,7 @@ *****************************************************************************/ package spine.animation { + import spine.MathUtils; import spine.Event; import spine.Skeleton; @@ -37,9 +38,8 @@ import spine.Skeleton; public class CurveTimeline implements Timeline { static private const LINEAR:Number = 0; static private const STEPPED:Number = 1; - static private const BEZIER:Number = 2; - static private const BEZIER_SEGMENTS:int = 10; - static private const BEZIER_SIZE:int = BEZIER_SEGMENTS * 2 - 1; + static private const BEZIER:Number = 2; + static private const BEZIER_SIZE:int = 10 * 2 - 1; private var curves:Vector.; // type, x, y, ... @@ -66,12 +66,10 @@ public class CurveTimeline implements Timeline { * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of * the difference between the keyframe's values. */ public function setCurve (frameIndex:int, cx1:Number, cy1:Number, cx2:Number, cy2:Number) : void { - var subdiv1:Number = 1 / BEZIER_SEGMENTS, subdiv2:Number = subdiv1 * subdiv1, subdiv3:Number = subdiv2 * subdiv1; - var pre1:Number = 3 * subdiv1, pre2:Number = 3 * subdiv2, pre4:Number = 6 * subdiv2, pre5:Number = 6 * subdiv3; - var tmp1x:Number = -cx1 * 2 + cx2, tmp1y:Number = -cy1 * 2 + cy2, tmp2x:Number = (cx1 - cx2) * 3 + 1, tmp2y:Number = (cy1 - cy2) * 3 + 1; - var dfx:Number = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv3, dfy:Number = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv3; - var ddfx:Number = tmp1x * pre4 + tmp2x * pre5, ddfy:Number = tmp1y * pre4 + tmp2y * pre5; - var dddfx:Number = tmp2x * pre5, dddfy:Number = tmp2y * pre5; + var tmpx:Number = (-cx1 * 2 + cx2) * 0.03, tmpy:Number = (-cy1 * 2 + cy2) * 0.03; + var dddfx:Number = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy:Number = ((cy1 - cy2) * 3 + 1) * 0.006; + var ddfx:Number = tmpx * 2 + dddfx, ddfy:Number = tmpy * 2 + dddfy; + var dfx:Number = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy:Number = cy1 * 0.3 + tmpy + dddfy * 0.16666667; var i:int = frameIndex * BEZIER_SIZE; var curves:Vector. = this.curves; @@ -91,6 +89,7 @@ public class CurveTimeline implements Timeline { } public function getCurvePercent (frameIndex:int, percent:Number) : Number { + percent = MathUtils.clamp(percent, 0, 1); var curves:Vector. = this.curves; var i:int = frameIndex * BEZIER_SIZE; var type:Number = curves[i]; diff --git a/spine-as3/spine-as3/src/spine/animation/FfdTimeline.as b/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as similarity index 83% rename from spine-as3/spine-as3/src/spine/animation/FfdTimeline.as rename to spine-as3/spine-as3/src/spine/animation/DeformTimeline.as index 8f87cd07b..f91ec9604 100644 --- a/spine-as3/spine-as3/src/spine/animation/FfdTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/DeformTimeline.as @@ -30,19 +30,18 @@ *****************************************************************************/ package spine.animation { -import spine.attachments.FfdAttachment; +import spine.attachments.VertexAttachment; import spine.Event; import spine.Skeleton; import spine.Slot; -import spine.attachments.Attachment; -public class FfdTimeline extends CurveTimeline { +public class DeformTimeline extends CurveTimeline { public var slotIndex:int; public var frames:Vector.; public var frameVertices:Vector.>; - public var attachment:Attachment; + public var attachment:VertexAttachment; - public function FfdTimeline (frameCount:int) { + public function DeformTimeline (frameCount:int) { super(frameCount); frames = new Vector.(frameCount, true); frameVertices = new Vector.>(frameCount, true); @@ -56,8 +55,8 @@ public class FfdTimeline extends CurveTimeline { override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { var slot:Slot = skeleton.slots[slotIndex]; - var slotAttachment:FfdAttachment = slot.attachment as FfdAttachment; - if (!slotAttachment || !slotAttachment.applyFFD(attachment)) return; + var slotAttachment:VertexAttachment = slot.attachment as VertexAttachment; + if (!slotAttachment || !slotAttachment.applyDeform(attachment)) return; var frames:Vector. = this.frames; if (time < frames[0]) return; // Time is before first frame. @@ -83,13 +82,11 @@ public class FfdTimeline extends CurveTimeline { } // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch1(frames, time); - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex - 1)] - frameTime); - percent = getCurvePercent(frameIndex - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); - - var prevVertices:Vector. = frameVertices[int(frameIndex - 1)]; - var nextVertices:Vector. = frameVertices[frameIndex]; + var frame:int = Animation.binarySearch1(frames, time); + var prevVertices:Vector. = frameVertices[int(frame - 1)]; + var nextVertices:Vector. = frameVertices[frame]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); var prev:Number; if (alpha < 1) { diff --git a/spine-as3/spine-as3/src/spine/animation/EventTimeline.as b/spine-as3/spine-as3/src/spine/animation/EventTimeline.as index 832d34c74..01e8615f7 100644 --- a/spine-as3/spine-as3/src/spine/animation/EventTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/EventTimeline.as @@ -63,19 +63,19 @@ public class EventTimeline implements Timeline { return; if (time < frames[0]) return; // Time is before first frame. - var frameIndex:int; + var frame:int; if (lastTime < frames[0]) - frameIndex = 0; + frame = 0; else { - frameIndex = Animation.binarySearch1(frames, lastTime); - var frame:Number = frames[frameIndex]; - while (frameIndex > 0) { // Fire multiple events with the same frame. - if (frames[int(frameIndex - 1)] != frame) break; - frameIndex--; + frame = Animation.binarySearch1(frames, lastTime); + var frameTime:Number = frames[frame]; + while (frame > 0) { // Fire multiple events with the same frame. + if (frames[int(frame - 1)] != frameTime) break; + frame--; } } - for (; frameIndex < frameCount && time >= frames[frameIndex]; frameIndex++) - firedEvents[firedEvents.length] = events[frameIndex]; + for (; frame < frameCount && time >= frames[frame]; frame++) + firedEvents[firedEvents.length] = events[frame]; } } diff --git a/spine-as3/spine-as3/src/spine/animation/IkConstraintTimeline.as b/spine-as3/spine-as3/src/spine/animation/IkConstraintTimeline.as index ad6f6014f..444163d7b 100644 --- a/spine-as3/spine-as3/src/spine/animation/IkConstraintTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/IkConstraintTimeline.as @@ -35,48 +35,45 @@ import spine.IkConstraint; import spine.Skeleton; public class IkConstraintTimeline extends CurveTimeline { - static private const PREV_FRAME_TIME:int = -3; - static private const PREV_FRAME_MIX:int = -2; - static private const PREV_FRAME_BEND_DIRECTION:int = -1; - static private const FRAME_MIX:int = 1; + static public const ENTRIES:int = 3; + static internal const PREV_TIME:int = -3, PREV_MIX:int = -2, PREV_BEND_DIRECTION:int = -1; + static internal const MIX:int = 1, BEND_DIRECTION:int = 2; public var ikConstraintIndex:int; public var frames:Vector.; // time, mix, bendDirection, ... public function IkConstraintTimeline (frameCount:int) { super(frameCount); - frames = new Vector.(frameCount * 3, true); + frames = new Vector.(frameCount * ENTRIES, true); } /** Sets the time, mix and bend direction of the specified keyframe. */ public function setFrame (frameIndex:int, time:Number, mix:Number, bendDirection:int) : void { - frameIndex *= 3; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[int(frameIndex + 1)] = mix; - frames[int(frameIndex + 2)] = bendDirection; + frames[int(frameIndex + MIX)] = mix; + frames[int(frameIndex + BEND_DIRECTION)] = bendDirection; } override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { if (time < frames[0]) return; // Time is before first frame. - var ikConstraint:IkConstraint = skeleton.ikConstraints[ikConstraintIndex]; + var constraint:IkConstraint = skeleton.ikConstraints[ikConstraintIndex]; - if (time >= frames[int(frames.length - 3)]) { // Time is after last frame. - ikConstraint.mix += (frames[int(frames.length - 2)] - ikConstraint.mix) * alpha; - ikConstraint.bendDirection = int(frames[int(frames.length - 1)]); + if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame. + constraint.mix += (frames[int(frames.length + PREV_MIX)] - constraint.mix) * alpha; + constraint.bendDirection = int(frames[int(frames.length + PREV_BEND_DIRECTION)]); return; } // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch(frames, time, 3); - var prevFrameMix:Number = frames[int(frameIndex + PREV_FRAME_MIX)]; - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime); - percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var mix:Number = frames[int(frame + PREV_MIX)]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - var mix:Number = prevFrameMix + (frames[int(frameIndex + FRAME_MIX)] - prevFrameMix) * percent; - ikConstraint.mix += (mix - ikConstraint.mix) * alpha; - ikConstraint.bendDirection = int(frames[int(frameIndex + PREV_FRAME_BEND_DIRECTION)]); + constraint.mix += (mix + (frames[frame + MIX] - mix) * percent - constraint.mix) * alpha; + constraint.bendDirection = int(frames[frame + PREV_BEND_DIRECTION]); } } diff --git a/spine-as3/spine-as3/src/spine/animation/Listeners.as b/spine-as3/spine-as3/src/spine/animation/Listeners.as index f517c40e6..7e7062b4f 100644 --- a/spine-as3/spine-as3/src/spine/animation/Listeners.as +++ b/spine-as3/spine-as3/src/spine/animation/Listeners.as @@ -33,6 +33,9 @@ package spine.animation { public class Listeners { private var _listeners:Vector. = new Vector.(); + public function Listeners () { + } + public function get listeners () : Vector. { return _listeners; } diff --git a/spine-as3/spine-as3/src/spine/animation/PathConstraintMixTimeline.as b/spine-as3/spine-as3/src/spine/animation/PathConstraintMixTimeline.as new file mode 100644 index 000000000..1fb9c0315 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/animation/PathConstraintMixTimeline.as @@ -0,0 +1,83 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.animation { +import spine.Event; +import spine.Skeleton; +import spine.PathConstraint; + +public class PathConstraintMixTimeline extends CurveTimeline { + static public const ENTRIES:int = 3; + static internal const PREV_TIME:int = -3, PREV_ROTATE:int = -2, PREV_TRANSLATE:int = -1; + static internal const ROTATE:int = 1, TRANSLATE:int = 2; + + public var pathConstraintIndex:int; + + public var frames:Vector.; // time, rotate mix, translate mix, ... + + public function PathConstraintMixTimeline (frameCount:int) { + super(frameCount); + frames = new Vector.(frameCount * ENTRIES, true); + } + + /** Sets the time and mixes of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, rotateMix:Number, translateMix:Number) : void { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + } + + override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { + if (time < frames[0]) return; // Time is before first frame. + + var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; + + if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. + var i:int = frames.length; + constraint.rotateMix += (frames[i + PREV_ROTATE] - constraint.rotateMix) * alpha; + constraint.translateMix += (frames[i + PREV_TRANSLATE] - constraint.translateMix) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var rotate:Number = frames[frame + PREV_ROTATE]; + var translate:Number = frames[frame + PREV_TRANSLATE]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.rotateMix += (rotate + (frames[frame + ROTATE] - rotate) * percent - constraint.rotateMix) * alpha; + constraint.translateMix += (translate + (frames[frame + TRANSLATE] - translate) * percent - constraint.translateMix) + * alpha; + } +} +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/animation/PathConstraintPositionTimeline.as b/spine-as3/spine-as3/src/spine/animation/PathConstraintPositionTimeline.as new file mode 100644 index 000000000..ba013f3e6 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/animation/PathConstraintPositionTimeline.as @@ -0,0 +1,78 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.animation { +import spine.PathConstraint; +import spine.Event; +import spine.Skeleton; + +public class PathConstraintPositionTimeline extends CurveTimeline { + static public const ENTRIES:int = 2; + static internal const PREV_TIME:int = -2, PREV_VALUE:int = -1; + static internal const VALUE:int = 1; + + public var pathConstraintIndex:int; + + public var frames:Vector.; // time, position, ... + + public function PathConstraintPositionTimeline (frameCount:int) { + super(frameCount); + frames = new Vector.(frameCount * ENTRIES, true); + } + + /** Sets the time and value of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, value:Number) : void { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + VALUE] = value; + } + + override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { + if (time < frames[0]) return; // Time is before first frame. + + var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; + + if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. + var i:int = frames.length; + constraint.position += (frames[i + PREV_VALUE] - constraint.position) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var position:Number = frames[frame + PREV_VALUE]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.position += (position + (frames[frame + VALUE] - position) * percent - constraint.position) * alpha; + } +} +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/animation/PathConstraintSpacingTimeline.as b/spine-as3/spine-as3/src/spine/animation/PathConstraintSpacingTimeline.as new file mode 100644 index 000000000..8a2a39e9e --- /dev/null +++ b/spine-as3/spine-as3/src/spine/animation/PathConstraintSpacingTimeline.as @@ -0,0 +1,62 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.animation { +import spine.Skeleton; +import spine.Event; +import spine.PathConstraint; + +public class PathConstraintSpacingTimeline extends PathConstraintPositionTimeline { + public function PathConstraintSpacingTimeline (frameCount:int) { + super(frameCount); + } + + override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { + if (time < frames[0]) return; // Time is before first frame. + + var constraint:PathConstraint = skeleton.pathConstraints[pathConstraintIndex]; + + if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. + var i:int = frames.length; + constraint.spacing += (frames[i + PREV_VALUE] - constraint.spacing) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var spacing:Number = frames[frame + PREV_VALUE]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.spacing += (spacing + (frames[frame + VALUE] - spacing) * percent - constraint.spacing) * alpha; + } +} +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/animation/RotateTimeline.as b/spine-as3/spine-as3/src/spine/animation/RotateTimeline.as index 765fb5a21..524ad946e 100644 --- a/spine-as3/spine-as3/src/spine/animation/RotateTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/RotateTimeline.as @@ -35,8 +35,9 @@ import spine.Event; import spine.Skeleton; public class RotateTimeline extends CurveTimeline { - static private const PREV_FRAME_TIME:int = -2; - static private const FRAME_VALUE:int = 1; + static public const ENTRIES:int = 2; + static private const PREV_TIME:int = -2, PREV_ROTATION:int = -1; + static private const ROTATION:int = 1; public var boneIndex:int; public var frames:Vector.; // time, value, ... @@ -47,10 +48,10 @@ public class RotateTimeline extends CurveTimeline { } /** Sets the time and angle of the specified keyframe. */ - public function setFrame (frameIndex:int, time:Number, angle:Number) : void { - frameIndex *= 2; + public function setFrame (frameIndex:int, time:Number, degrees:Number) : void { + frameIndex <<= 1; frames[frameIndex] = time; - frames[int(frameIndex + 1)] = angle; + frames[int(frameIndex + ROTATION)] = degrees; } override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { @@ -58,10 +59,9 @@ public class RotateTimeline extends CurveTimeline { return; // Time is before first frame. var bone:Bone = skeleton.bones[boneIndex]; - - var amount:Number; + if (time >= frames[int(frames.length - 2)]) { // Time is after last frame. - amount = bone.data.rotation + frames[int(frames.length - 1)] - bone.rotation; + var amount:Number = bone.data.rotation + frames[int(frames.length + PREV_ROTATION)] - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) @@ -71,18 +71,17 @@ public class RotateTimeline extends CurveTimeline { } // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch(frames, time, 2); - var prevFrameValue:Number = frames[int(frameIndex - 1)]; - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime); - percent = getCurvePercent(frameIndex / 2 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var prevRotation:Number = frames[int(frame + PREV_ROTATION)]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - amount = frames[int(frameIndex + FRAME_VALUE)] - prevFrameValue; + amount = frames[int(frame + ROTATION)] - prevRotation; while (amount > 180) amount -= 360; while (amount < -180) amount += 360; - amount = bone.data.rotation + (prevFrameValue + amount * percent) - bone.rotation; + amount = bone.data.rotation + (prevRotation + amount * percent) - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) diff --git a/spine-as3/spine-as3/src/spine/animation/ScaleTimeline.as b/spine-as3/spine-as3/src/spine/animation/ScaleTimeline.as index 5c3004ae5..ec5dd47f1 100644 --- a/spine-as3/spine-as3/src/spine/animation/ScaleTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/ScaleTimeline.as @@ -44,22 +44,21 @@ public class ScaleTimeline extends TranslateTimeline { return; // Time is before first frame. var bone:Bone = skeleton.bones[boneIndex]; - if (time >= frames[int(frames.length - 3)]) { // Time is after last frame. - bone.scaleX += (bone.data.scaleX * frames[int(frames.length - 2)] - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * frames[int(frames.length - 1)] - bone.scaleY) * alpha; + if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame. + bone.scaleX += (bone.data.scaleX * frames[int(frames.length + PREV_X)] - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY * frames[int(frames.length + PREV_Y)] - bone.scaleY) * alpha; return; } // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch(frames, time, 3); - var prevFrameX:Number = frames[int(frameIndex - 2)]; - var prevFrameY:Number = frames[int(frameIndex - 1)]; - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime); - percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var prevX:Number = frames[frame + PREV_X]; + var prevY:Number = frames[frame + PREV_Y]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - bone.scaleX += (bone.data.scaleX * (prevFrameX + (frames[int(frameIndex + FRAME_X)] - prevFrameX) * percent) - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * (prevFrameY + (frames[int(frameIndex + FRAME_Y)] - prevFrameY) * percent) - bone.scaleY) * alpha; + bone.scaleX += (bone.data.scaleX * (prevX + (frames[frame + X] - prevX) * percent) - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY * (prevY + (frames[frame + Y] - prevY) * percent) - bone.scaleY) * alpha; } } diff --git a/spine-as3/spine-as3/src/spine/animation/ShearTimeline.as b/spine-as3/spine-as3/src/spine/animation/ShearTimeline.as new file mode 100644 index 000000000..7c9fdf0f3 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/animation/ShearTimeline.as @@ -0,0 +1,34 @@ +package spine.animation { + import spine.Event; + import spine.Skeleton; + import spine.Bone; + +public class ShearTimeline extends TranslateTimeline { + public function ShearTimeline (frameCount:int) { + super(frameCount); + } + + override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { + var frames:Vector. = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + var bone:Bone = skeleton.bones[boneIndex]; + if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. + bone.shearX += (bone.data.shearX + frames[frames.length + PREV_X] - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + frames[frames.length + PREV_Y] - bone.shearY) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var prevX:Number = frames[frame + PREV_X]; + var prevY:Number = frames[frame + PREV_Y]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + bone.shearX += (bone.data.shearX + (prevX + (frames[frame + X] - prevX) * percent) - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + (prevY + (frames[frame + Y] - prevY) * percent) - bone.shearY) * alpha; + } +} + +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/animation/TrackEntry.as b/spine-as3/spine-as3/src/spine/animation/TrackEntry.as index 4eecb3dc5..8112bba58 100644 --- a/spine-as3/spine-as3/src/spine/animation/TrackEntry.as +++ b/spine-as3/spine-as3/src/spine/animation/TrackEntry.as @@ -40,6 +40,9 @@ public class TrackEntry { internal var mixTime:Number, mixDuration:Number, mix:Number = 1; public var onStart:Function, onEnd:Function, onComplete:Function, onEvent:Function; + public function TrackEntry () { + } + public function toString () : String { return animation == null ? "" : animation.name; } diff --git a/spine-as3/spine-as3/src/spine/animation/TransformConstraintTimeline.as b/spine-as3/spine-as3/src/spine/animation/TransformConstraintTimeline.as new file mode 100644 index 000000000..72de9dff1 --- /dev/null +++ b/spine-as3/spine-as3/src/spine/animation/TransformConstraintTimeline.as @@ -0,0 +1,90 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.animation { +import spine.Event; +import spine.Skeleton; +import spine.TransformConstraint; + +public class TransformConstraintTimeline extends CurveTimeline { + static public const ENTRIES:int = 5; + static internal const PREV_TIME:int = -5, PREV_ROTATE:int = -4, PREV_TRANSLATE:int = -3, PREV_SCALE:int = -2, PREV_SHEAR:int = -1; + static internal const ROTATE:int = 1, TRANSLATE:int = 2, SCALE:int = 3, SHEAR:int = 4; + + public var transformConstraintIndex:int; + public var frames:Vector.; // time, rotate mix, translate mix, scale mix, shear mix, ... + + public function TransformConstraintTimeline (frameCount:int) { + super(frameCount); + frames = new Vector.(frameCount * ENTRIES, true); + } + + /** Sets the time and mixes of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, rotateMix:Number, translateMix:Number, scaleMix:Number, shearMix:Number) : void { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + frames[frameIndex + SCALE] = scaleMix; + frames[frameIndex + SHEAR] = shearMix; + } + + override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { + if (time < frames[0]) return; // Time is before first frame. + + var constraint:TransformConstraint = skeleton.transformConstraints[transformConstraintIndex]; + + if (time >= frames[frames.length - ENTRIES]) { // Time is after last frame. + var i:int = frames.length; + constraint.rotateMix += (frames[i + PREV_ROTATE] - constraint.rotateMix) * alpha; + constraint.translateMix += (frames[i + PREV_TRANSLATE] - constraint.translateMix) * alpha; + constraint.scaleMix += (frames[i + PREV_SCALE] - constraint.scaleMix) * alpha; + constraint.shearMix += (frames[i + PREV_SHEAR] - constraint.shearMix) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + var rotate:Number = frames[frame + PREV_ROTATE]; + var translate:Number = frames[frame + PREV_TRANSLATE]; + var scale:Number = frames[frame + PREV_SCALE]; + var shear:Number = frames[frame + PREV_SHEAR]; + constraint.rotateMix += (rotate + (frames[frame + ROTATE] - rotate) * percent - constraint.rotateMix) * alpha; + constraint.translateMix += (translate + (frames[frame + TRANSLATE] - translate) * percent - constraint.translateMix) + * alpha; + constraint.scaleMix += (scale + (frames[frame + SCALE] - scale) * percent - constraint.scaleMix) * alpha; + constraint.shearMix += (shear + (frames[frame + SHEAR] - shear) * percent - constraint.shearMix) * alpha; + } +} +} \ No newline at end of file diff --git a/spine-as3/spine-as3/src/spine/animation/TranslateTimeline.as b/spine-as3/spine-as3/src/spine/animation/TranslateTimeline.as index 9e49eb923..d9c7dc537 100644 --- a/spine-as3/spine-as3/src/spine/animation/TranslateTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/TranslateTimeline.as @@ -35,24 +35,24 @@ import spine.Event; import spine.Skeleton; public class TranslateTimeline extends CurveTimeline { - static internal const PREV_FRAME_TIME:int = -3; - static internal const FRAME_X:int = 1; - static internal const FRAME_Y:int = 2; + static public const ENTRIES:int = 3; + static internal const PREV_TIME:int = -3, PREV_X:int = -2, PREV_Y:int = -1; + static internal const X:int = 1, Y:int = 2; public var boneIndex:int; public var frames:Vector.; // time, value, value, ... public function TranslateTimeline (frameCount:int) { super(frameCount); - frames = new Vector.(frameCount * 3, true); + frames = new Vector.(frameCount * ENTRIES, true); } /** Sets the time and value of the specified keyframe. */ public function setFrame (frameIndex:int, time:Number, x:Number, y:Number) : void { - frameIndex *= 3; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[int(frameIndex + 1)] = x; - frames[int(frameIndex + 2)] = y; + frames[int(frameIndex + X)] = x; + frames[int(frameIndex + Y)] = y; } override public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { @@ -61,22 +61,21 @@ public class TranslateTimeline extends CurveTimeline { var bone:Bone = skeleton.bones[boneIndex]; - if (time >= frames[int(frames.length - 3)]) { // Time is after last frame. - bone.x += (bone.data.x + frames[int(frames.length - 2)] - bone.x) * alpha; - bone.y += (bone.data.y + frames[int(frames.length - 1)] - bone.y) * alpha; + if (time >= frames[int(frames.length - ENTRIES)]) { // Time is after last frame. + bone.x += (bone.data.x + frames[int(frames.length + PREV_X)] - bone.x) * alpha; + bone.y += (bone.data.y + frames[int(frames.length + PREV_Y)] - bone.y) * alpha; return; } // Interpolate between the previous frame and the current frame. - var frameIndex:int = Animation.binarySearch(frames, time, 3); - var prevFrameX:Number = frames[int(frameIndex - 2)]; - var prevFrameY:Number = frames[int(frameIndex - 1)]; - var frameTime:Number = frames[frameIndex]; - var percent:Number = 1 - (time - frameTime) / (frames[int(frameIndex + PREV_FRAME_TIME)] - frameTime); - percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + var frame:int = Animation.binarySearch(frames, time, ENTRIES); + var prevX:Number = frames[frame + PREV_X]; + var prevY:Number = frames[frame + PREV_Y]; + var frameTime:Number = frames[frame]; + var percent:Number = getCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - bone.x += (bone.data.x + prevFrameX + (frames[int(frameIndex + FRAME_X)] - prevFrameX) * percent - bone.x) * alpha; - bone.y += (bone.data.y + prevFrameY + (frames[int(frameIndex + FRAME_Y)] - prevFrameY) * percent - bone.y) * alpha; + bone.x += (bone.data.x + prevX + (frames[frame + X] - prevX) * percent - bone.x) * alpha; + bone.y += (bone.data.y + prevY + (frames[frame + Y] - prevY) * percent - bone.y) * alpha; } } diff --git a/spine-as3/spine-as3/src/spine/atlas/AtlasPage.as b/spine-as3/spine-as3/src/spine/atlas/AtlasPage.as index e11edacd2..cc0bf3dbb 100644 --- a/spine-as3/spine-as3/src/spine/atlas/AtlasPage.as +++ b/spine-as3/spine-as3/src/spine/atlas/AtlasPage.as @@ -41,6 +41,9 @@ public class AtlasPage { public var rendererObject:Object; public var width:int; public var height:int; + + public function AtlasPage () { + } } } diff --git a/spine-as3/spine-as3/src/spine/atlas/AtlasRegion.as b/spine-as3/spine-as3/src/spine/atlas/AtlasRegion.as index 553d2abfa..7e3e9488e 100644 --- a/spine-as3/spine-as3/src/spine/atlas/AtlasRegion.as +++ b/spine-as3/spine-as3/src/spine/atlas/AtlasRegion.as @@ -51,6 +51,9 @@ public class AtlasRegion { public var splits:Vector.; public var pads:Vector.; public var rendererObject:Object; + + public function AtlasRegion () { + } } } diff --git a/spine-as3/spine-as3/src/spine/attachments/AtlasAttachmentLoader.as b/spine-as3/spine-as3/src/spine/attachments/AtlasAttachmentLoader.as index 82ff1a52a..31e1f225b 100644 --- a/spine-as3/spine-as3/src/spine/attachments/AtlasAttachmentLoader.as +++ b/spine-as3/spine-as3/src/spine/attachments/AtlasAttachmentLoader.as @@ -82,32 +82,14 @@ public class AtlasAttachmentLoader implements AttachmentLoader { attachment.regionOriginalHeight = region.originalHeight; return attachment; } - - public function newWeightedMeshAttachment (skin:Skin, name:String, path:String) : WeightedMeshAttachment { - var region:AtlasRegion = atlas.findRegion(path); - if (region == null) - throw new Error("Region not found in atlas: " + path + " (weighted mesh attachment: " + name + ")"); - var attachment:WeightedMeshAttachment = new WeightedMeshAttachment(name); - attachment.rendererObject = region; - var scaleX:Number = region.page.width / nextPOT(region.page.width); - var scaleY:Number = region.page.height / nextPOT(region.page.height); - attachment.regionU = region.u * scaleX; - attachment.regionV = region.v * scaleY; - attachment.regionU2 = region.u2 * scaleX; - attachment.regionV2 = region.v2 * scaleY; - attachment.regionRotate = region.rotate; - attachment.regionOffsetX = region.offsetX; - attachment.regionOffsetY = region.offsetY; - attachment.regionWidth = region.width; - attachment.regionHeight = region.height; - attachment.regionOriginalWidth = region.originalWidth; - attachment.regionOriginalHeight = region.originalHeight; - return attachment; - } public function newBoundingBoxAttachment (skin:Skin, name:String) : BoundingBoxAttachment { return new BoundingBoxAttachment(name); } + + public function newPathAttachment(skin:Skin, name:String) : PathAttachment { + return new PathAttachment(name); + } static public function nextPOT (value:int) : int { value--; diff --git a/spine-as3/spine-as3/src/spine/attachments/AttachmentLoader.as b/spine-as3/spine-as3/src/spine/attachments/AttachmentLoader.as index c5bec787b..002952f67 100644 --- a/spine-as3/spine-as3/src/spine/attachments/AttachmentLoader.as +++ b/spine-as3/spine-as3/src/spine/attachments/AttachmentLoader.as @@ -39,11 +39,11 @@ public interface AttachmentLoader { /** @return May be null to not load an attachment. */ function newMeshAttachment (skin:Skin, name:String, path:String) : MeshAttachment; - /** @return May be null to not load an attachment. */ - function newWeightedMeshAttachment (skin:Skin, name:String, path:String) : WeightedMeshAttachment; - /** @return May be null to not load an attachment. */ function newBoundingBoxAttachment (skin:Skin, name:String) : BoundingBoxAttachment; + + /** @return May be null to not load an attachment */ + function newPathAttachment(skin:Skin, name:String): PathAttachment; } } diff --git a/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as b/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as index 786afb086..68a301444 100644 --- a/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as +++ b/spine-as3/spine-as3/src/spine/attachments/AttachmentType.as @@ -35,10 +35,9 @@ public class AttachmentType { public static const region:AttachmentType = new AttachmentType(0, "region"); public static const regionsequence:AttachmentType = new AttachmentType(1, "regionsequence"); public static const boundingbox:AttachmentType = new AttachmentType(2, "boundingbox"); - public static const mesh:AttachmentType = new AttachmentType(3, "mesh"); - public static const weightedmesh:AttachmentType = new AttachmentType(4, "weightedmesh"); + public static const mesh:AttachmentType = new AttachmentType(3, "mesh"); public static const linkedmesh:AttachmentType = new AttachmentType(3, "linkedmesh"); - public static const weightedlinkedmesh:AttachmentType = new AttachmentType(4, "weightedlinkedmesh"); + public static const path:AttachmentType = new AttachmentType(4, "path"); public var ordinal:int; public var name:String; diff --git a/spine-as3/spine-as3/src/spine/attachments/BoundingBoxAttachment.as b/spine-as3/spine-as3/src/spine/attachments/BoundingBoxAttachment.as index 916ae9e9c..a27590c8f 100644 --- a/spine-as3/spine-as3/src/spine/attachments/BoundingBoxAttachment.as +++ b/spine-as3/spine-as3/src/spine/attachments/BoundingBoxAttachment.as @@ -30,31 +30,10 @@ *****************************************************************************/ package spine.attachments { -import spine.Bone; - -public dynamic class BoundingBoxAttachment extends Attachment { - public var vertices:Vector. = new Vector.(); +public dynamic class BoundingBoxAttachment extends VertexAttachment { public function BoundingBoxAttachment (name:String) { super(name); - } - - public function computeWorldVertices (x:Number, y:Number, bone:Bone, worldVertices:Vector.) : void { - x += bone.worldX; - y += bone.worldY; - var m00:Number = bone.a; - var m01:Number = bone.b; - var m10:Number = bone.c; - var m11:Number = bone.d; - var vertices:Vector. = this.vertices; - for (var i:int = 0, n:int = vertices.length; i < n; i += 2) { - var ii:int = i + 1; - var px:Number = vertices[i]; - var py:Number = vertices[ii]; - worldVertices[i] = px * m00 + py * m01 + x; - worldVertices[ii] = px * m10 + py * m11 + y; - } - } + } } - } diff --git a/spine-as3/spine-as3/src/spine/attachments/MeshAttachment.as b/spine-as3/spine-as3/src/spine/attachments/MeshAttachment.as index e0f61b199..3f7147265 100644 --- a/spine-as3/spine-as3/src/spine/attachments/MeshAttachment.as +++ b/spine-as3/spine-as3/src/spine/attachments/MeshAttachment.as @@ -30,21 +30,19 @@ *****************************************************************************/ package spine.attachments { -import spine.Slot; -import spine.Bone; -public dynamic class MeshAttachment extends Attachment implements FfdAttachment { - public var vertices:Vector.; +public dynamic class MeshAttachment extends VertexAttachment { + public var worldVertices:Vector.; public var uvs:Vector.; public var regionUVs:Vector.; - public var triangles:Vector.; - public var hullLength:int; + public var triangles:Vector.; public var r:Number = 1; public var g:Number = 1; public var b:Number = 1; public var a:Number = 1; + public var hullLength:int; private var _parentMesh:MeshAttachment; - public var inheritFFD:Boolean; + public var inheritDeform:Boolean; public var path:String; public var rendererObject:Object; @@ -86,27 +84,8 @@ public dynamic class MeshAttachment extends Attachment implements FfdAttachment } } - public function computeWorldVertices (x:Number, y:Number, slot:Slot, worldVertices:Vector.) : void { - var bone:Bone = slot.bone; - x += bone.worldX; - y += bone.worldY; - var m00:Number = bone.a; - var m01:Number = bone.b; - var m10:Number = bone.c; - var m11:Number = bone.d; - var vertices:Vector. = this.vertices; - var verticesCount:int = vertices.length; - if (slot.attachmentVertices.length == verticesCount) vertices = slot.attachmentVertices; - for (var i:int = 0, ii:int = 0; i < verticesCount; i += 2, ii += 2) { - var vx:Number = vertices[i]; - var vy:Number = vertices[int(i + 1)]; - worldVertices[ii] = vx * m00 + vy * m01 + x; - worldVertices[int(ii + 1)] = vx * m10 + vy * m11 + y; - } - } - public function applyFFD (sourceAttachment:Attachment) : Boolean { - return this == sourceAttachment || (inheritFFD && _parentMesh == sourceAttachment); + return this == sourceAttachment || (inheritDeform && _parentMesh == sourceAttachment); } public function get parentMesh () : MeshAttachment { @@ -116,7 +95,9 @@ public dynamic class MeshAttachment extends Attachment implements FfdAttachment public function set parentMesh (parentMesh:MeshAttachment) : void { _parentMesh = parentMesh; if (parentMesh != null) { + bones = parentMesh.bones; vertices = parentMesh.vertices; + worldVerticesLength = parentMesh.worldVerticesLength; regionUVs = parentMesh.regionUVs; triangles = parentMesh.triangles; hullLength = parentMesh.hullLength; diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonImage.as b/spine-as3/spine-as3/src/spine/attachments/PathAttachment.as similarity index 80% rename from spine-starling/spine-starling/src/spine/starling/SkeletonImage.as rename to spine-as3/spine-as3/src/spine/attachments/PathAttachment.as index dc98c00df..96a0cd817 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonImage.as +++ b/spine-as3/spine-as3/src/spine/attachments/PathAttachment.as @@ -29,27 +29,14 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine.starling { +package spine.attachments { -import starling.display.Image; -import starling.textures.Texture; -import starling.utils.VertexData; +public dynamic class PathAttachment extends VertexAttachment { + public var lengths:Vector.; + public var closed:Boolean, constantSpeed:Boolean; -public class SkeletonImage extends Image { - public function SkeletonImage (texture:Texture) { - super(texture); - } - - public function get vertexData () : VertexData { - return mVertexData; - } - - public function updateVertices () : void { - onVertexDataChanged(); - } - - override public function get tinted () : Boolean { - return true; + public function PathAttachment (name:String) { + super(name); } } diff --git a/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as b/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as new file mode 100644 index 000000000..936657ffc --- /dev/null +++ b/spine-as3/spine-as3/src/spine/attachments/VertexAttachment.as @@ -0,0 +1,127 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.attachments { + import spine.Bone; + import spine.Skeleton; + import spine.Slot; + +public dynamic class VertexAttachment extends Attachment { + public var bones:Vector.; + public var vertices:Vector.; + public var worldVerticesLength:int; + + public function VertexAttachment (name:String) { + super(name); + } + + public function computeWorldVertices (slot:Slot, worldVertices:Vector.): void { + computeWorldVertices2(slot, 0, worldVerticesLength, worldVertices, 0); + } + + /** Transforms local vertices to world coordinates. + * @param start The index of the first local vertex value to transform. Each vertex has 2 values, x and y. + * @param count The number of world vertex values to output. Must be <= {@link #getWorldVerticesLength()} - start. + * @param worldVertices The output world vertices. Must have a length >= offset + count. + * @param offset The worldVertices index to begin writing values. */ + public function computeWorldVertices2 (slot:Slot, start:int, count:int, worldVertices:Vector., offset:int): void { + count += offset; + var skeleton:Skeleton = slot.skeleton; + var x:Number = skeleton.x, y:Number = skeleton.y; + var deformArray:Vector. = slot.attachmentVertices; + var vertices:Vector. = this.vertices; + var bones:Vector. = this.bones; + var deform:Vector.; + + var v:int, w:int, n:int, i:int, skip:int, b:int, f:int; + var vx:Number, vy:Number; + var wx:Number, wy:Number; + var bone:Bone; + + if (bones == null) { + if (deformArray.length > 0) vertices = deformArray; + bone = slot.bone; + x += bone.worldX; + y += bone.worldY; + var a:Number = bone.a, bb:Number = bone.b, c:Number = bone.c, d:Number = bone.d; + for (v = start, w = offset; w < count; v += 2, w += 2) { + vx = vertices[v], vy = vertices[v + 1]; + worldVertices[w] = vx * a + vy * bb + x; + worldVertices[w + 1] = vx * c + vy * d + y; + } + return; + } + v = 0, skip = 0; + for (i = 0; i < start; i += 2) { + n = bones[v]; + v += n + 1; + skip += n; + } + var skeletonBones:Vector. = skeleton.bones; + if (deformArray.length == 0) { + for (w = offset, b = skip * 3; w < count; w += 2) { + wx = x, wy = y; + n = bones[v++]; + n += v; + for (; v < n; v++, b += 3) { + bone = skeletonBones[bones[v]]; + vx = vertices[b]; vy = vertices[b + 1]; var weight:Number = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } else { + deform = deformArray; + for (w = offset, b = skip * 3, f = skip << 1; w < count; w += 2) { + wx = x; wy = y; + n = bones[v++]; + n += v; + for (; v < n; v++, b += 3, f += 2) { + bone = skeletonBones[bones[v]]; + vx = vertices[b] + deform[f]; vy = vertices[b + 1] + deform[f + 1]; weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + } + + /** Returns true if a deform originally applied to the specified attachment should be applied to this attachment. */ + public function applyDeform (sourceAttachment:VertexAttachment): Boolean { + return this == sourceAttachment; + } +} + +} diff --git a/spine-as3/spine-as3/src/spine/attachments/WeightedMeshAttachment.as b/spine-as3/spine-as3/src/spine/attachments/WeightedMeshAttachment.as deleted file mode 100644 index b1862a582..000000000 --- a/spine-as3/spine-as3/src/spine/attachments/WeightedMeshAttachment.as +++ /dev/null @@ -1,156 +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. - *****************************************************************************/ - -package spine.attachments { -import spine.Slot; -import spine.Bone; - -public dynamic class WeightedMeshAttachment extends Attachment implements FfdAttachment { - public var bones:Vector.; - public var weights:Vector.; - public var uvs:Vector.; - public var regionUVs:Vector.; - public var triangles:Vector.; - public var hullLength:int; - public var r:Number = 1; - public var g:Number = 1; - public var b:Number = 1; - public var a:Number = 1; - private var _parentMesh:WeightedMeshAttachment; - public var inheritFFD:Boolean; - - public var path:String; - public var rendererObject:Object; - public var regionU:Number; - public var regionV:Number; - public var regionU2:Number; - public var regionV2:Number; - public var regionRotate:Boolean; - public var regionOffsetX:Number; // Pixels stripped from the bottom left, unrotated. - public var regionOffsetY:Number; - public var regionWidth:Number; // Unrotated, stripped size. - public var regionHeight:Number; - public var regionOriginalWidth:Number; // Unrotated, unstripped size. - public var regionOriginalHeight:Number; - - // Nonessential. - public var edges:Vector.; - public var width:Number; - public var height:Number; - - public function WeightedMeshAttachment (name:String) { - super(name); - } - - public function updateUVs () : void { - var width:Number = regionU2 - regionU, height:Number = regionV2 - regionV; - var i:int, n:int = regionUVs.length; - if (!uvs || uvs.length != n) uvs = new Vector.(n, true); - if (regionRotate) { - for (i = 0; i < n; i += 2) { - uvs[i] = regionU + regionUVs[int(i + 1)] * width; - uvs[int(i + 1)] = regionV + height - regionUVs[i] * height; - } - } else { - for (i = 0; i < n; i += 2) { - uvs[i] = regionU + regionUVs[i] * width; - uvs[int(i + 1)] = regionV + regionUVs[int(i + 1)] * height; - } - } - } - - public function computeWorldVertices (x:Number, y:Number, slot:Slot, worldVertices:Vector.) : void { - var skeletonBones:Vector. = slot.skeleton.bones; - var weights:Vector. = this.weights; - var bones:Vector. = this.bones; - - var w:int = 0, v:int = 0, b:int = 0, f:int = 0, n:int = bones.length, nn:int; - var wx:Number, wy:Number, bone:Bone, vx:Number, vy:Number, weight:Number; - if (slot.attachmentVertices.length == 0) { - for (; v < n; w += 2) { - wx = 0; - wy = 0; - nn = bones[v++] + v; - for (; v < nn; v++, b += 3) { - bone = skeletonBones[bones[v]]; - vx = weights[b]; - vy = weights[int(b + 1)]; - weight = weights[int(b + 2)]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx + x; - worldVertices[int(w + 1)] = wy + y; - } - } else { - var ffd:Vector. = slot.attachmentVertices; - for (; v < n; w += 2) { - wx = 0; - wy = 0; - nn = bones[v++] + v; - for (; v < nn; v++, b += 3, f += 2) { - bone = skeletonBones[bones[v]]; - vx = weights[b] + ffd[f]; - vy = weights[int(b + 1)] + ffd[int(f + 1)]; - weight = weights[int(b + 2)]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx + x; - worldVertices[int(w + 1)] = wy + y; - } - } - } - - public function applyFFD (sourceAttachment:Attachment) : Boolean { - return this == sourceAttachment || (inheritFFD && _parentMesh == sourceAttachment); - } - - public function get parentMesh () : WeightedMeshAttachment { - return _parentMesh; - } - - public function set parentMesh (parentMesh:WeightedMeshAttachment) : void { - _parentMesh = parentMesh; - if (parentMesh != null) { - bones = parentMesh.bones; - weights = parentMesh.weights; - regionUVs = parentMesh.regionUVs; - triangles = parentMesh.triangles; - hullLength = parentMesh.hullLength; - edges = parentMesh.edges; - width = parentMesh.width; - height = parentMesh.height; - } - } -} - -} diff --git a/spine-starling/README.md b/spine-starling/README.md index 9b7500bc5..9fa83a91f 100644 --- a/spine-starling/README.md +++ b/spine-starling/README.md @@ -1,6 +1,6 @@ # spine-starling -The spine-starling runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [Starling](http://gamua.com/starling/). spine-starling is based on [spine-as3](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-as3). +The spine-starling runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [Starling 2.0](http://gamua.com/starling/). spine-starling is based on [spine-as3](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-as3). ## Licensing @@ -10,18 +10,34 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-starling works with data exported from Spine 3.1.08. Updating spine-starling 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-starling works with data exported from the latest Spine version. spine-starling supports all Spine features. spine-starling does not yet support loading the binary format. -## Setup +# Usage +1. Create a new Starling 2.0 project as per the [documentation]. +2. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip). +3. Copy the sources in `spine-as3/spine-as3/src/` and `spine-starling/spine-starling/src/` into your project's source directory -1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip). -1. Using [FDT](http://fdt.powerflasher.com/), import the spine-as3 and spine-starling projects by choosing File -> Import -> Existing projects. For other IDEs you will need to create new projects and import the source. +## Example +The Spine AS3 example works on Windows, Linux and Mac OS X. This guide assumes you are using [FDT Free](http://fdt.powerflasher.com/) as your development environment. -Alternatively, the contents of the `spine-as3/src` and `spine-starling/src` directories can be copied into your project. +1. Download [FDT free](http://fdt.powerflasher.com/buy-download/) for your operating system. +3. Download and install Adobe Flash Player 22 with debugging support](https://www.adobe.com/support/flashplayer/debug_downloads.html#fp15) +2. Download the latest [Flex SDK](http://www.adobe.com/devnet/flex/flex-sdk-download.html). We assume it will be installed to some folder on your disk called `flex_sdk`. +3. Download the latest [Adobe AIR SDK](http://www.adobe.com/devnet/air/air-sdk-download.html) +4. Extract the AIR SDK contents, and copy them to your `flex_sdk` folder. This will replace the Adobe AIR version shipped with Flex. +5. Open FDT, go to `Preferences -> FDT -> Installed SDKs` +6. Click `Add` and browse to `flex_sdk` +7. Go to `File -> Import -> General -> Existing Projects into Workspace` +6. Browse to `spine-as3/`. You should see both the `spine-as3` and `spine-as3-example` project in the import dialog. Click `Finish` +7. Go to `File -> Import -> General -> Existing Projects into Workspace` +6. Browse to `spine-starling/`. You should see both the `spine-starling` and `spine-starling-example` project in the import dialog. Click `Finish` +8. Right click the `Main.as` file in `spine-starling-example/src/spine` in the FDT explorer and select `Debug As -> FDT SWF Application` + +**Note**: FDT Free does not allow project dependencies. If you modify the sources of `spine-as3` or `spine-starling`, you will have to compile the project to an `.swc` and place it in `spine-starling-example/libs`. ## Examples diff --git a/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.classpath b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.classpath index e81cadb11..c35f9e0ac 100644 --- a/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.classpath +++ b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.classpath @@ -3,7 +3,7 @@ lib frameworks/libs/player/{playerVersion}/playerglobal.swc src - lib/spine-starling.swc + lib/starling-2.0.1.swc lib/spine-as3.swc - lib/starling-1.7.swc + lib/spine-starling.swc diff --git a/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.core.prefs b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.core.prefs index d1623e619..403470f21 100644 --- a/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.core.prefs +++ b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.core.prefs @@ -3,6 +3,7 @@ com.powerflasher.fdt.core.CompilerArguments=-static-link-runtime-shared-librarie com.powerflasher.fdt.core.CompilerConstants=CONFIG\:\:AUTHOR\!"{user.name}"\nCONFIG\:\:DEBUG\!{debug} com.powerflasher.fdt.core.DefaultOutputFolder=bin com.powerflasher.fdt.core.DefaultPlayer=External_SWF_Viewer +com.powerflasher.fdt.core.IncludeTestResources=false com.powerflasher.fdt.core.Language=AS3 com.powerflasher.fdt.core.Manifests= com.powerflasher.fdt.core.PassClasspath=true @@ -13,7 +14,7 @@ com.powerflasher.fdt.core.PassManifests=true com.powerflasher.fdt.core.PassRsls=false com.powerflasher.fdt.core.PassSwcs=true com.powerflasher.fdt.core.PlatformType=WEB -com.powerflasher.fdt.core.PlayerVersion=11.1 +com.powerflasher.fdt.core.PlayerVersion=22.0 com.powerflasher.fdt.core.ProjectTypeHint=Web com.powerflasher.fdt.core.Runtime=Flash_Player com.powerflasher.fdt.core.SdkName=Flex 4.6.0 diff --git a/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.ui.sourceLocation.prefs b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.ui.sourceLocation.prefs new file mode 100644 index 000000000..6cc33682a --- /dev/null +++ b/spine-starling/spine-starling-example/.settings/com.powerflasher.fdt.ui.sourceLocation.prefs @@ -0,0 +1,2 @@ +//lib/starling-2.0.1.swc=/Applications/flash/starling/src +eclipse.preferences.version=1 diff --git a/spine-starling/spine-starling-example/.settings/launch/spine-starling-example.launch b/spine-starling/spine-starling-example/.settings/launch/spine-starling-example.launch index fd22c65ed..a58d277bf 100644 --- a/spine-starling/spine-starling-example/.settings/launch/spine-starling-example.launch +++ b/spine-starling/spine-starling-example/.settings/launch/spine-starling-example.launch @@ -8,12 +8,15 @@ - + + + + - + diff --git a/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs b/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs index 99f26c020..c8ffeb576 100644 --- a/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs +++ b/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,3 @@ eclipse.preferences.version=1 +encoding//src/spine/examples/TankExample.as=UTF-8 encoding/=UTF-8 diff --git a/spine-starling/spine-starling-example/lib/spine-as3.swc b/spine-starling/spine-starling-example/lib/spine-as3.swc index 3f90b6481..109a011b5 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-as3.swc and b/spine-starling/spine-starling-example/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling-example/lib/spine-starling.swc b/spine-starling/spine-starling-example/lib/spine-starling.swc index b22d2786c..938f57656 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-starling.swc and b/spine-starling/spine-starling-example/lib/spine-starling.swc differ diff --git a/spine-starling/spine-starling-example/lib/starling-1.7.swc b/spine-starling/spine-starling-example/lib/starling-1.7.swc deleted file mode 100644 index dd36fb67a..000000000 Binary files a/spine-starling/spine-starling-example/lib/starling-1.7.swc and /dev/null differ diff --git a/spine-starling/spine-starling-example/lib/starling-2.0.1.swc b/spine-starling/spine-starling-example/lib/starling-2.0.1.swc new file mode 100644 index 000000000..eb24c27fa Binary files /dev/null and b/spine-starling/spine-starling-example/lib/starling-2.0.1.swc differ diff --git a/spine-starling/spine-starling-example/src/goblins-mesh.atlas b/spine-starling/spine-starling-example/src/goblins-mesh.atlas index d0ddb80c6..0f57a0f6a 100644 --- a/spine-starling/spine-starling-example/src/goblins-mesh.atlas +++ b/spine-starling/spine-starling-example/src/goblins-mesh.atlas @@ -1,5 +1,6 @@ -goblins-mesh.png +goblins.png +size: 1024,128 format: RGBA8888 filter: Linear,Linear repeat: none diff --git a/spine-starling/spine-starling-example/src/goblins-mesh.json b/spine-starling/spine-starling-example/src/goblins-mesh.json index 67a624a36..82da6832a 100644 --- a/spine-starling/spine-starling-example/src/goblins-mesh.json +++ b/spine-starling/spine-starling-example/src/goblins-mesh.json @@ -1,26 +1,27 @@ { +"skeleton": { "hash": "P7CQ4ImK+tcAICATgSttlZ5HOSM", "spine": "3.4.00", "width": 0, "height": 0, "images": "./images/" }, "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": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 }, + { "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 }, + { "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 }, + { "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 }, + { "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 }, + { "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 }, + { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 }, + { "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 }, + { "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 }, { "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 }, - { "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 }, - { "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 }, - { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 }, - { "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 }, - { "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 }, - { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 }, - { "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 }, - { "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 }, - { "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 }, - { "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 }, - { "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 }, - { "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 }, - { "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 }, - { "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }, - { "name": "spear1", "parent": "left hand", "length": 65.06, "x": 0.48, "y": 17.03, "rotation": 102.43 }, - { "name": "spear2", "parent": "spear1", "length": 61.41, "x": 65.05, "y": 0.04, "rotation": 0.9 }, - { "name": "spear3", "parent": "spear2", "length": 76.79, "x": 61.88, "y": 0.57, "rotation": -0.9 } + { "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 }, + { "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 }, + { "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 }, + { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 }, + { "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 }, + { "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 }, + { "name": "spear1", "parent": "left hand", "length": 65.06, "rotation": 102.43, "x": 0.48, "y": 17.03 }, + { "name": "spear2", "parent": "spear1", "length": 61.41, "rotation": 0.9, "x": 65.05, "y": 0.04 }, + { "name": "spear3", "parent": "spear2", "length": 76.79, "rotation": -0.9, "x": 61.88, "y": 0.57 } ], "slots": [ { "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" }, @@ -52,12 +53,12 @@ "left hand item": { "dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 }, "spear": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.76608, 0.21781, 0.75642, 0.386, 0.74723, 0.54607, 0.72117, 1, 0.28838, 1, 0.24208, 0.54327, 0.22589, 0.38361, 0.2089, 0.21605, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ], "triangles": [ 4, 7, 3, 6, 7, 4, 5, 6, 4, 10, 11, 12, 1, 13, 0, 12, 13, 1, 10, 12, 1, 9, 10, 1, 2, 9, 1, 8, 9, 2, 3, 8, 2, 7, 8, 3 ], - "vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.51, 20, -0.31, -6.16, 0.48, 2, 18, 64.73, -5.03, 0.5, 19, -0.4, -5.06, 0.49, 1, 16, 4.56, 23.91, 1, 1, 16, 41.7, -138.95, 1, 1, 16, 32.42, -141.1, 1, 1, 16, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.5, 19, 0.53, 6.59, 0.49, 2, 19, 62.18, 6.66, 0.51, 20, 0.2, 6.09, 0.48, 1, 20, 30.96, 6.61, 1, 1, 20, 37.26, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ], - "edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ], + "vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.5116, 20, -0.31, -6.16, 0.48839, 2, 18, 64.73, -5.03, 0.50272, 19, -0.4, -5.06, 0.49728, 1, 10, 4.56, 23.91, 1, 1, 10, 41.7, -138.95, 1, 1, 10, 32.41999, -141.1, 1, 1, 10, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.50272, 19, 0.52999, 6.59, 0.49728, 2, 19, 62.18, 6.66, 0.5116, 20, 0.2, 6.09, 0.48839, 1, 20, 30.96, 6.61, 1, 1, 20, 37.25999, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ], "hull": 14, + "edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ], "width": 22, "height": 368 } @@ -66,10 +67,10 @@ "dagger": { "type": "mesh", "uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ], - "triangles": [ 5, 7, 8, 4, 8, 3, 4, 5, 8, 5, 6, 7, 9, 11, 8, 8, 11, 3, 3, 0, 2, 3, 11, 0, 9, 10, 11, 0, 1, 2, 11, 12, 0, 0, 12, 13 ], + "triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ], "vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ], - "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], "hull": 14, + "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], "width": 26, "height": 108 } @@ -88,9 +89,9 @@ "type": "mesh", "uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ], "triangles": [ 5, 27, 6, 7, 27, 8, 7, 6, 27, 4, 24, 5, 5, 24, 27, 4, 3, 24, 27, 29, 8, 8, 29, 9, 24, 28, 27, 24, 25, 28, 24, 3, 25, 29, 28, 30, 29, 27, 28, 25, 2, 26, 25, 3, 2, 9, 29, 10, 0, 23, 1, 28, 25, 30, 29, 11, 10, 29, 30, 11, 2, 21, 26, 2, 1, 21, 23, 22, 1, 1, 22, 21, 30, 16, 11, 30, 17, 16, 30, 25, 17, 17, 26, 18, 18, 26, 19, 26, 17, 25, 11, 15, 12, 11, 16, 15, 12, 15, 13, 15, 14, 13, 21, 20, 26, 26, 20, 19 ], - "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], + "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.45999, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.59999, 23.41, 35.89, 40.16999, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.79999, -24.31, 17.2, -40.65, 20.68, -33.02 ], "hull": 24, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], "width": 103, "height": 66 } @@ -101,9 +102,9 @@ "type": "mesh", "uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ], "triangles": [ 3, 4, 2, 4, 5, 2, 5, 0, 2, 0, 1, 2, 0, 5, 8, 5, 6, 8, 6, 7, 8 ], - "vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], + "vertices": [ 18.6, 8.81, 32.18999, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], "width": 37, "height": 35 } @@ -113,10 +114,10 @@ "name": "goblin/left-foot", "type": "mesh", "uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ], - "triangles": [ 2, 1, 3, 3, 10, 4, 4, 11, 5, 4, 10, 11, 3, 1, 10, 11, 6, 5, 1, 0, 10, 11, 7, 6, 11, 10, 7, 10, 8, 7, 10, 0, 8, 0, 9, 8 ], + "triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ], "vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], "width": 65, "height": 31 } @@ -126,10 +127,10 @@ "name": "goblin/left-hand", "type": "mesh", "uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ], - "triangles": [ 2, 3, 0, 4, 5, 0, 3, 4, 0, 0, 7, 8, 6, 7, 0, 0, 5, 6, 2, 0, 1 ], - "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], - "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], + "triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ], + "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.47999, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], "hull": 9, + "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], "width": 36, "height": 41 } @@ -139,10 +140,10 @@ "name": "goblin/left-lower-leg", "type": "mesh", "uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ], - "triangles": [ 1, 3, 4, 7, 4, 5, 5, 6, 7, 3, 1, 2, 1, 4, 7, 0, 1, 10, 7, 8, 10, 1, 7, 10, 10, 8, 9 ], - "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ], - "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], + "triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ], + "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.18999, -18.29 ], "hull": 11, + "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], "width": 33, "height": 70 } @@ -153,9 +154,9 @@ "type": "mesh", "uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ], "triangles": [ 3, 1, 2, 3, 0, 1, 3, 4, 0, 4, 7, 0, 4, 5, 7, 5, 6, 7 ], - "vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ], - "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], + "vertices": [ 15.18, 5.74, 32.16999, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.73999, -4.66, 6.54 ], "hull": 8, + "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], "width": 29, "height": 44 } @@ -165,10 +166,10 @@ "name": "goblin/left-upper-leg", "type": "mesh", "uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ], - "triangles": [ 3, 4, 2, 2, 4, 1, 1, 4, 7, 4, 5, 7, 0, 1, 7, 5, 6, 7, 7, 8, 0 ], + "triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ], "vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ], - "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], "hull": 9, + "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], "width": 33, "height": 73 } @@ -179,9 +180,9 @@ "type": "mesh", "uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ], "triangles": [ 3, 5, 2, 2, 10, 1, 2, 5, 10, 3, 4, 5, 10, 0, 1, 0, 10, 6, 10, 5, 6, 7, 8, 6, 6, 9, 0, 6, 8, 9 ], - "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], - "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], + "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.04999, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], "hull": 10, + "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], "width": 36, "height": 41 } @@ -191,10 +192,10 @@ "name": "goblin/pelvis", "type": "mesh", "uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ], - "triangles": [ 1, 3, 0, 1, 2, 3 ], + "triangles": [ 1, 2, 3, 1, 3, 0 ], "vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], "hull": 4, + "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], "width": 62, "height": 43 } @@ -205,9 +206,9 @@ "type": "mesh", "uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ], "triangles": [ 1, 2, 6, 6, 2, 5, 1, 6, 0, 4, 5, 3, 2, 3, 5, 6, 7, 0 ], - "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ], - "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], + "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.17999 ], "hull": 8, + "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], "width": 23, "height": 50 } @@ -217,10 +218,10 @@ "name": "goblin/right-foot", "type": "mesh", "uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ], - "triangles": [ 4, 5, 15, 7, 14, 6, 5, 6, 15, 6, 14, 15, 14, 7, 9, 7, 8, 9, 15, 3, 4, 9, 10, 14, 15, 2, 3, 15, 14, 2, 14, 10, 1, 12, 1, 11, 1, 12, 13, 14, 1, 2, 1, 13, 0, 1, 10, 11 ], + "triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ], "vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ], - "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], "hull": 14, + "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], "width": 63, "height": 33 } @@ -230,10 +231,10 @@ "name": "goblin/right-hand", "type": "mesh", "uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ], - "triangles": [ 4, 7, 5, 5, 7, 6, 4, 3, 7, 3, 2, 8, 7, 3, 8, 8, 1, 10, 8, 2, 1, 0, 10, 1, 8, 10, 9 ], - "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], + "triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ], + "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.87999, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], "width": 36, "height": 37 } @@ -243,10 +244,10 @@ "name": "goblin/right-hand", "type": "mesh", "uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ], - "triangles": [ 3, 2, 4, 2, 1, 4, 1, 0, 4 ], + "triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ], "vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ], - "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], "hull": 5, + "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], "width": 36, "height": 37 } @@ -256,10 +257,10 @@ "name": "goblin/right-lower-leg", "type": "mesh", "uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ], - "triangles": [ 4, 5, 2, 2, 5, 8, 5, 6, 8, 6, 7, 8, 4, 2, 3, 2, 8, 1, 8, 9, 1, 9, 10, 1, 1, 10, 0 ], - "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], + "triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ], + "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.09999, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.76999, -1.03, 58.99, -9.18999, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], "width": 36, "height": 76 } @@ -271,8 +272,8 @@ "uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ], "triangles": [ 4, 6, 7, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 0, 1, 2, 3, 0 ], "vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ], - "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], "hull": 8, + "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], "width": 39, "height": 45 } @@ -282,10 +283,10 @@ "name": "goblin/right-upper-leg", "type": "mesh", "uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ], - "triangles": [ 5, 4, 6, 6, 4, 2, 4, 3, 2, 2, 1, 6, 6, 1, 9, 6, 9, 7, 9, 1, 0, 9, 8, 7 ], - "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], + "triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ], + "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.50999, 10.18, 19.12999, 18.46999, 2.85, 16.32, -8.39999, 6.14 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], "width": 34, "height": 63 } @@ -296,9 +297,9 @@ "type": "mesh", "uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ], "triangles": [ 5, 16, 6, 6, 16, 7, 4, 17, 5, 5, 17, 16, 4, 3, 17, 17, 21, 16, 16, 21, 7, 3, 2, 17, 21, 19, 18, 21, 17, 19, 17, 2, 19, 21, 8, 7, 21, 18, 8, 18, 9, 8, 19, 22, 18, 18, 10, 9, 18, 22, 10, 2, 1, 19, 19, 20, 22, 19, 1, 20, 22, 11, 10, 22, 20, 11, 20, 1, 14, 20, 12, 11, 1, 0, 14, 20, 13, 12, 20, 14, 13, 0, 15, 14 ], - "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], + "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.87999, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], "hull": 16, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], "width": 68, "height": 96 } @@ -308,10 +309,10 @@ "name": "goblin/undie-straps", "type": "mesh", "uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ], - "triangles": [ 5, 1, 4, 4, 1, 3, 6, 0, 5, 5, 0, 1, 3, 1, 2, 6, 8, 0, 6, 7, 8 ], - "vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], + "triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ], + "vertices": [ -10.56, 12.87, 6.53, 9.89999, 25.62, 17.70999, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], "width": 55, "height": 19 } @@ -321,10 +322,10 @@ "name": "goblin/undies", "type": "mesh", "uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ], - "triangles": [ 3, 10, 4, 4, 10, 5, 10, 3, 1, 3, 2, 1, 1, 11, 10, 1, 0, 11, 10, 11, 5, 5, 11, 6, 0, 8, 11, 11, 8, 6, 0, 9, 8, 6, 8, 7 ], - "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ], - "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], + "triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ], + "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.58999, 22.22, 6.11, 22.92, 14.05, 3.75, 9.43999, -13.08, 13.71, 4.21, -2.58999, 4.03, 2.05 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], "width": 36, "height": 29 } @@ -757,7 +758,7 @@ ] } }, - "ffd": { + "deform": { "default": { "left hand item": { "spear": [ @@ -769,19 +770,19 @@ { "time": 0, "offset": 26, - "vertices": [ 2.34, 0.14 ], + "vertices": [ 2.34754, 0.14469 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.5, "offset": 8, - "vertices": [ -1.19, 4.31, 0.07, 6.41, 1.66, 6.18, 1.75, 3.59 ], + "vertices": [ -1.19415, 4.31531, 0.07279, 6.41351, 1.66048, 6.18882, 1.75232, 3.59555 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1, "offset": 26, - "vertices": [ 2.34, 0.14 ] + "vertices": [ 2.34754, 0.14469 ] } ] } @@ -795,22 +796,22 @@ }, { "time": 0.2, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08, -1.08, 0.08, -1.08, 0.08, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08 ], + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391, -1.08534, 0.08391, -1.08534, 0.08391, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.3666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09, 1.47, 0.09, 1.47, 0.09, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09 ], + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017, 1.47305, 0.09017, 1.47305, 0.09017, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017 ], "curve": [ 0.621, 0, 0.75, 1 ] }, { "time": 0.7, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17, -1.17, -0.17, -1.17, -0.17, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17 ], + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183, -1.1755, -0.17182, -1.1755, -0.17183, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.8666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08, 0.38, 0.08, 0.38, 0.08, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08 ], + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1 } @@ -821,35 +822,35 @@ { "time": 0, "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] }, { "time": 0.1333 }, { "time": 0.2333, "offset": 8, - "vertices": [ -3.96, -2.34, -5.8, -12.47, -2.23, -12.99, 2.02, -9.1, 0, 0, 0, 0, 0, 0, -1.35, -5.28 ] + "vertices": [ -3.96072, -2.34594, -5.80445, -12.47629, -2.23129, -12.99037, 2.02941, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ] }, { "time": 0.3666, "offset": 8, - "vertices": [ 0.66, 0.33, 0.33, 2.69, -0.48, 2.54, -1.13, 1.38, 0, 0, 0, 0, 0, 0, -0.11, 0.79 ] + "vertices": [ 0.66504, 0.33548, 0.33902, 2.69014, -0.4817, 2.54524, -1.13592, 1.38562, 0, 0, 0, 0, 0, 0, -0.11907, 0.79273 ] }, { "time": 0.5, "curve": "stepped" }, { "time": 0.6333 }, { "time": 0.7333, "offset": 8, - "vertices": [ -2.97, 9.4, -6.91, 19.92, -10.55, 18.41, -12.37, 12.38, -4.72, 6.3, 0, 0, -1.48, 4.88, -7.06, 10.7 ] + "vertices": [ -2.97737, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72606, 6.30798, 0, 0, -1.48902, 4.88944, -7.06773, 10.70101 ] }, { "time": 0.8333, "offset": 6, - "vertices": [ 1.05, 1.56, -2.52, 7.99, -5.52, 17.14, -8.93, 15.79, -10.73, 10.22, -4.23, 5.36, 0, 0, 0, 0, -5.83, 8.55 ] + "vertices": [ 1.05318, 1.56361, -2.52722, 7.9974, -5.5203, 17.14136, -8.93317, 15.79635, -10.73747, 10.22055, -4.23801, 5.36992, 0, 0, 0, 0, -5.83147, 8.55531 ] }, { "time": 1, "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] } ] }, @@ -859,22 +860,22 @@ { "time": 0.1333, "offset": 6, - "vertices": [ -0.68, -4.13 ] + "vertices": [ -0.68989, -4.13283 ] }, { "time": 0.3333, "offset": 6, - "vertices": [ -1.04, -3.1 ] + "vertices": [ -1.04945, -3.10476 ] }, { "time": 0.7, "offset": 6, - "vertices": [ -1.42, -6.3 ] + "vertices": [ -1.4245, -6.30616 ] }, { "time": 0.8666, "offset": 6, - "vertices": [ -1.13, -1.79 ] + "vertices": [ -1.13541, -1.79035 ] }, { "time": 1 } ] @@ -885,38 +886,38 @@ { "time": 0.1333, "offset": 2, - "vertices": [ -2.81, 2.63, -2.35, 3.89, -1.99, 4.86, -0.93, 5.57, -0.48, 5.09, -0.34, 3.42, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31, 1.91, -1.32, 3.65 ] + "vertices": [ -2.81258, 2.63114, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09854, -0.34812, 3.42912, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91371, -1.32986, 3.65703 ] }, { "time": 0.2333, "offset": 2, - "vertices": [ -6.39, 6.41, -7.74, 8.27, -7.02, 11.35, -4.03, 13.93, -2.5, 12.62, -1.46, 7.58, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84, 2.61, -4.53, 7.92 ] + "vertices": [ -6.39088, 6.41245, -7.74575, 8.27191, -7.02471, 11.35894, -4.0347, 13.93454, -2.50399, 12.62962, -1.46124, 7.58915, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84765, 2.61215, -4.53955, 7.92357 ] }, { "time": 0.3, "offset": 2, - "vertices": [ -8.27, 6.68, -9.29, 10.13, -8.62, 14.71, -4.58, 18.81, -2.2, 17.1, -0.07, 9.9, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94, 2.38, -4.59, 10.01 ] + "vertices": [ -8.27184, 6.68821, -9.29764, 10.13797, -8.62231, 14.71339, -4.58629, 18.81939, -2.20304, 17.10709, -0.07794, 9.9046, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94624, 2.38007, -4.59398, 10.01888 ] }, { "time": 0.3666, "offset": 2, - "vertices": [ -10.47, 9.44, -13.36, 12.4, -14.32, 16.94, -9.24, 23.55, -5.51, 21.51, -1.19, 11.53, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14, 2.29, -6.63, 11.37 ] + "vertices": [ -10.47683, 9.44175, -13.36882, 12.40982, -14.32568, 16.94392, -9.24462, 23.55674, -5.51711, 21.51377, -1.19581, 11.53192, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14847, 2.29389, -6.63418, 11.37127 ] }, { "time": 0.5, "offset": 2, - "vertices": [ -5.42, 4.36, -10.59, 7.04, -11.64, 11.55, -6.19, 20.12, -1.45, 18.05, 4.86, 6.41, 2.81, 0.27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96, 4.94 ] + "vertices": [ -5.42473, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12805, -1.45497, 18.05411, 4.86619, 6.41678, 2.81462, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.94829 ] }, { "time": 0.6333 }, { "time": 0.7333, "offset": 4, - "vertices": [ 1.31, -6.84, -0.87, -12.54, -5.98, -14.08, -7.15, -11.63, -5.67, -4.83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06, -6.93 ] + "vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08367, -7.15892, -11.63193, -5.6792, -4.83544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06163, -6.93844 ] }, { "time": 0.8, "offset": 4, - "vertices": [ 0.65, -3.42, -0.43, -6.27, -2.99, -7.04, -3.57, -5.81, -2.83, -2.41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79, -1.28, 0, 0, 0, 0, -1.03, -3.46 ] + "vertices": [ 0.65731, -3.42049, -0.43952, -6.27239, -2.99255, -7.04183, -3.57946, -5.81596, -2.83959, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79687, -1.2802, 0, 0, 0, 0, -1.03081, -3.46922 ] }, { "time": 0.8666 } ] @@ -926,13 +927,13 @@ { "time": 0, "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] }, { "time": 0.5 }, { "time": 1, "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] } ] }, @@ -942,7 +943,7 @@ { "time": 0.6, "offset": 6, - "vertices": [ 1.8, -1.56 ] + "vertices": [ 1.80396, -1.56552 ] }, { "time": 1 } ] @@ -951,17 +952,17 @@ "right upper leg": [ { "time": 0, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] }, { "time": 0.3333 }, { "time": 0.8666, "offset": 14, - "vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ] + "vertices": [ 0.13424, -2.35377, -1.33317, -5.99572, -1.35861, -4.43323 ] }, { "time": 1, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] } ] }, @@ -970,37 +971,37 @@ { "time": 0, "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] }, { "time": 0.1333, "offset": 14, - "vertices": [ 1.31, -0.59, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] + "vertices": [ 1.31318, -0.59727, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] }, { "time": 0.3, "offset": 14, - "vertices": [ 6.03, -3.13, 7.55, -1.38, 6.79, 0.31, 4.23, 1.14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07, -5.16, 0, 0, 4, 0.27, 0, 0, 0, 0, 3.43, -3.52 ] + "vertices": [ 6.03761, -3.13561, 7.55475, -1.38111, 6.79747, 0.31171, 4.23503, 1.14012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07575, -5.16824, 0, 0, 4.0041, 0.27245, 0, 0, 0, 0, 3.4376, -3.52286 ] }, { "time": 0.5, "offset": 14, - "vertices": [ 2.25, -0.87, 2.57, -0.56, 3.17, -0.57, 1.48, 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22, -4.43, 0, 0, 1.48, 0.01, 0, 0, 0, 0, 0.31, -3.28, -1.53, 0.17 ] + "vertices": [ 2.25942, -0.87202, 2.575, -0.56861, 3.17112, -0.57003, 1.48704, 0.9924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22451, -4.43862, 0, 0, 1.48691, 0.01586, 0, 0, 0, 0, 0.31388, -3.28095, -1.53797, 0.17803 ] }, { "time": 0.6333, "offset": 14, - "vertices": [ 0.75, -1.51, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] + "vertices": [ 0.75002, -1.51701, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] }, { "time": 0.8666, "offset": 14, - "vertices": [ 0.62, -1.26, 0.38, -2.2, 3.25, -0.5, 2.41, 2.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.66, -3.1, 0, 0, 2.3, -1.15, 0, 0, 0, 0, -0.07, -3.63, -0.93, 0.1 ] + "vertices": [ 0.62202, -1.26262, 0.38489, -2.20701, 3.25048, -0.50042, 2.41108, 2.39315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6639, -3.10099, 0, 0, 2.30655, -1.15196, 0, 0, 0, 0, -0.07676, -3.63497, -0.9321, 0.1079 ] }, { "time": 1, "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] } ] }, @@ -1009,32 +1010,32 @@ { "time": 0, "offset": 2, - "vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ] + "vertices": [ -1.77696, 0.54759, -0.96145, -1.03793, -0.39148, -0.24071, -1.77696, 0.54759 ] }, { "time": 0.1333, "offset": 2, - "vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ] + "vertices": [ -2.25683, -1.03177, -1.49719, -4.23861, -0.74469, -2.84906, -1.90072, 0.54477 ] }, { "time": 0.3333, "offset": 2, - "vertices": [ -2.37, -0.05, -0.49, 0.19, -0.9, 1.16, -1.6, 2.7, 0.96, 0.8 ] + "vertices": [ -2.37974, -0.05431, -0.49433, 0.19436, -0.90861, 1.16519, -1.60956, 2.70798, 0.96186, 0.80615 ] }, { "time": 0.7, "offset": 2, - "vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ] + "vertices": [ -0.91714, -2.76567, -0.62214, -3.63489, -0.8494, -2.26772, -2.56076, 0.5297 ] }, { "time": 0.8666, "offset": 2, - "vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ] + "vertices": [ -2.56076, 0.5297, -1.58064, 0.32031, -1.3847, 0.32476, -2.56076, 0.5297 ] }, { "time": 1, "offset": 2, - "vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ] + "vertices": [ -1.77696, 0.54759, -0.80128, 0.53413, -0.80128, 0.53413, -1.77696, 0.54759 ] } ] }, @@ -1042,35 +1043,35 @@ "undies": [ { "time": 0, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] }, { "time": 0.1333, - "vertices": [ 0.72, 0.43, 7.2, -0.16, 1.37, 0, 1.37, 0, 1.37, 0, 1.25, 0.04, -0.99, -2.95, -1.37, -3.07, 1.37, 0, 0.35, -0.29, 2.99, -0.07, 3.9, -0.14 ] + "vertices": [ 0.72659, 0.43319, 7.20416, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99861, -2.95085, -1.37542, -3.07404, 1.37759, 0, 0.35279, -0.29279, 2.99218, -0.07019, 3.90478, -0.14039 ] }, { "time": 0.3333, - "vertices": [ 1.16, 0, 2.1, -0.23, 0, 0, 0, 0, 0, 0, 2.24, -0.24, -0.43, 0.6, -1.55, 0.48 ] + "vertices": [ 1.16999, 0, 2.10599, -0.234, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ] }, { "time": 0.5333, - "vertices": [ 1.16, 0, -0.23, -0.93, -2.92, 0.35, 0, 0, 0, 0, 0.49, -0.24, -0.64, -2.07, -0.64, -2.07 ] + "vertices": [ 1.16999, 0, -0.234, -0.93599, -2.92499, 0.35099, 0, 0, 0, 0, 0.49999, -0.24999, -0.64078, -2.07914, -0.64078, -2.07914 ] }, { "time": 0.7, - "vertices": [ 1.86, -0.11, 4.66, -0.09, -1.76, 0.21, 0, 0, -0.56, 0.32, -1.13, -1.15, -2.19, -3.47, -1.29, -3.47, 0, 0, 0, 0, 1.58, -0.04, 2.65, 0.16 ] + "vertices": [ 1.8627, -0.11514, 4.66326, -0.09099, -1.76428, 0.21171, 0, 0, -0.56832, 0.32832, -1.13833, -1.1511, -2.19996, -3.47068, -1.29718, -3.47068, 0, 0, 0, 0, 1.58785, -0.04642, 2.65941, 0.16714 ] }, { "time": 0.8333, - "vertices": [ 2.41, -0.2, 8.58, 0.58, -0.83, 0.1, 0, 0, -1.02, 0.59, -2.44, -1.87, -1.62, 0, 0, 0, 0, 0, 0, 0, 2.85, -0.08, 4.78, 0.3 ] + "vertices": [ 2.41687, -0.20725, 8.58108, 0.585, -0.83571, 0.10028, 0, 0, -1.02299, 0.59098, -2.44899, -1.872, -1.62499, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08356, 4.78695, 0.30086 ] }, { "time": 0.8666, - "vertices": [ 2.01, -0.02, 8.98, 0.44, -0.2, 0.08, 0.45, 0, -0.35, 0.47, -1.84, -1.44, -0.79, 1.26, 0.53, 1.23, 0.45, 0, 0.11, -0.09, 3.28, -0.09, 5.13, 0.19 ] + "vertices": [ 2.01969, -0.0214, 8.98545, 0.4446, -0.20937, 0.08022, 0.45919, 0, -0.35919, 0.47279, -1.84159, -1.4488, -0.79153, 1.2642, 0.53285, 1.23981, 0.45919, 0, 0.11759, -0.09759, 3.2839, -0.09025, 5.13115, 0.19388 ] }, { "time": 1, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] } ] } diff --git a/spine-starling/spine-starling-example/src/goblins-mesh.png b/spine-starling/spine-starling-example/src/goblins-mesh.png index a3daf0010..9d1ae572a 100644 Binary files a/spine-starling/spine-starling-example/src/goblins-mesh.png and b/spine-starling/spine-starling-example/src/goblins-mesh.png differ diff --git a/spine-starling/spine-starling-example/src/raptor.atlas b/spine-starling/spine-starling-example/src/raptor.atlas index c90da0078..11728a52d 100644 --- a/spine-starling/spine-starling-example/src/raptor.atlas +++ b/spine-starling/spine-starling-example/src/raptor.atlas @@ -1,26 +1,26 @@ raptor.png -size: 1022,1022 +size: 1024,1024 format: RGBA8888 filter: Linear,Linear repeat: none back_arm - rotate: false - xy: 410, 545 + rotate: true + xy: 140, 191 size: 46, 29 orig: 46, 29 offset: 0, 0 index: -1 back_bracer - rotate: false - xy: 540, 548 + rotate: true + xy: 167, 317 size: 39, 28 orig: 39, 28 offset: 0, 0 index: -1 back_hand - rotate: true - xy: 504, 538 + rotate: false + xy: 167, 358 size: 36, 34 orig: 36, 34 offset: 0, 0 @@ -34,49 +34,63 @@ back_knee index: -1 back_thigh rotate: true - xy: 140, 247 + xy: 167, 437 size: 39, 24 orig: 39, 24 offset: 0, 0 index: -1 -eyes_open +eyes_closed rotate: true xy: 2, 2 size: 47, 45 orig: 47, 45 offset: 0, 0 index: -1 +eyes_open + rotate: true + xy: 49, 2 + size: 47, 45 + orig: 47, 45 + offset: 0, 0 + index: -1 +eyes_surprised + rotate: true + xy: 96, 2 + size: 47, 45 + orig: 47, 45 + offset: 0, 0 + index: -1 front_arm rotate: false - xy: 360, 544 + xy: 419, 544 size: 48, 30 orig: 48, 30 offset: 0, 0 index: -1 front_bracer rotate: false - xy: 538, 578 + xy: 880, 695 size: 41, 29 orig: 41, 29 offset: 0, 0 index: -1 front_hand - rotate: false - xy: 538, 609 + rotate: true + xy: 167, 394 size: 41, 38 orig: 41, 38 offset: 0, 0 index: -1 front_open_hand rotate: false - xy: 894, 782 + xy: 880, 726 size: 43, 44 orig: 43, 44 offset: 0, 0 index: -1 front_thigh rotate: false - xy: 942, 849 + xy: 360, 545 size: 57, 29 orig: 57, 29 offset: 0, 0 @@ -109,16 +123,30 @@ lower_leg orig: 73, 98 offset: 0, 0 index: -1 +mouth_grind + rotate: false + xy: 469, 544 + size: 47, 30 + orig: 47, 30 + offset: 0, 0 + index: -1 +mouth_oooo + rotate: true + xy: 894, 772 + size: 105, 30 + orig: 105, 30 + offset: 0, 0 + index: -1 mouth_smile rotate: true - xy: 49, 2 + xy: 140, 239 size: 47, 30 orig: 47, 30 offset: 0, 0 index: -1 neck rotate: true - xy: 1001, 860 + xy: 538, 577 size: 18, 21 orig: 18, 21 offset: 0, 0 @@ -215,22 +243,22 @@ raptor_tongue offset: 0, 0 index: -1 stirrup_back - rotate: false - xy: 458, 539 + rotate: true + xy: 140, 145 size: 44, 35 orig: 44, 35 offset: 0, 0 index: -1 stirrup_front - rotate: true - xy: 81, 4 + rotate: false + xy: 538, 597 size: 45, 50 orig: 45, 50 offset: 0, 0 index: -1 stirrup_strap - rotate: true - xy: 894, 828 + rotate: false + xy: 350, 497 size: 49, 46 orig: 49, 46 offset: 0, 0 diff --git a/spine-starling/spine-starling-example/src/raptor.json b/spine-starling/spine-starling-example/src/raptor.json index df9892de6..f1b4aee9e 100644 --- a/spine-starling/spine-starling-example/src/raptor.json +++ b/spine-starling/spine-starling-example/src/raptor.json @@ -1,167 +1,202 @@ { -"skeleton": { "hash": "r3IJRaLbaxgEoW1YBAOrYT69jB4", "spine": "Dev", "width": 1224.2, "height": 1052.38 }, +"skeleton": { "hash": "BhDanzAnuitcp4TvGXMQuSCPJ6I", "spine": "3.4.00", "width": 0, "height": 0, "images": "./images/" }, "bones": [ { "name": "root" }, - { "name": "front_foot_goal", "parent": "root", "x": -45.79, "y": -28.67, "rotation": -0.94 }, - { "name": "hip", "parent": "root", "x": -136.78, "y": 415.47, "rotation": 3.15 }, - { "name": "rear_foot_goal", "parent": "root", "x": 33.43, "y": 30.81 }, - { "name": "front_leg1", "parent": "hip", "length": 251.74, "x": 27.36, "y": -28.27, "rotation": -51.5 }, - { "name": "front_leg_goal", "parent": "front_foot_goal", "x": -106.06, "y": 115.58 }, - { "name": "rear_leg1", "parent": "hip", "length": 226.27, "x": 55.19, "y": -71.25, "rotation": -54.76 }, - { "name": "rear_leg_goal", "parent": "rear_foot_goal", "x": -127.51, "y": 75.99 }, - { "name": "tail1", "parent": "hip", "length": 162.53, "x": -20.86, "y": 6.87, "rotation": 162.92 }, - { "name": "torso1", "parent": "hip", "length": 126.25, "x": 30.03, "y": -0.4, "rotation": -4.97 }, - { "name": "front_leg2", "parent": "front_leg1", "length": 208.54, "x": 251.03, "y": 0.16, "rotation": 261.93 }, - { "name": "rear_leg2", "parent": "rear_leg1", "length": 172.58, "x": 226.32, "y": 0.23, "rotation": -92.25 }, - { "name": "saddle", "parent": "torso1", "length": 50.91, "x": 4.56, "y": 71.86, "rotation": 91.8 }, - { "name": "tail2", "parent": "tail1", "length": 130.02, "x": 162.53, "y": -0.82, "rotation": 30.3 }, - { "name": "torso2", "parent": "torso1", "length": 121.2, "x": 126.25, "y": -0.37, "rotation": 39.84 }, - { "name": "front_arm1", "parent": "torso2", "length": 109.99, "x": 46.37, "y": -84.61, "rotation": 224.54 }, - { "name": "front_leg3", "parent": "front_leg2", "length": 118.18, "x": 208.5, "y": -1.63, "rotation": 85.46 }, - { "name": "neck", "parent": "torso2", "length": 70.59, "x": 121.19, "y": 0.34, "rotation": 41.37 }, - { "name": "rear_arm1", "parent": "torso2", "length": 109.56, "x": 57.05, "y": -95.38, "rotation": -124.71 }, - { "name": "rear_leg3", "parent": "rear_leg2", "length": 103.05, "x": 172.31, "y": 2.21, "rotation": 82.81 }, - { "name": "saddle_strap_front1", "parent": "saddle", "length": 97.27, "x": -27.36, "y": -73.38, "rotation": -148.11 }, - { "name": "saddle_strap_rear1", "parent": "saddle", "length": 38.62, "x": -33.34, "y": 87.32, "rotation": 151.13 }, - { "name": "spineboy_front_arm_goal", "parent": "saddle", "x": -50.7, "y": -96.93 }, - { "name": "spineboy_hip", "parent": "saddle", "length": 0.52, "x": 81.88, "y": 2.68, "rotation": 90.01 }, - { "name": "spineboy_rear_arm_goal", "parent": "saddle", "x": -30.43, "y": -100.08 }, - { "name": "stirrup", "parent": "saddle", "length": 78.17, "x": -81.94, "y": -103.38, "rotation": -68.85 }, - { "name": "stirrup_strap1", "parent": "saddle", "length": 43.69, "x": -20.38, "y": -29.37, "rotation": -135 }, - { "name": "tail3", "parent": "tail2", "length": 141.06, "x": 130.02, "y": 0.1, "rotation": 6.88 }, - { "name": "back_thigh", "parent": "spineboy_hip", "length": 71.15, "x": -9.57, "y": 2.31, "rotation": 160.75 }, - { "name": "front_arm2", "parent": "front_arm1", "length": 86.33, "x": 109.99, "y": 0.2, "rotation": 105.23 }, - { "name": "front_foot1", "parent": "front_leg3", "length": 57.79, "x": 118.19, "y": -0.79, "scaleX": 1.126, "rotation": 54.46 }, - { "name": "front_thigh", "parent": "spineboy_hip", "length": 77.79, "x": 15.51, "y": 17.01, "rotation": 163.34 }, + { "name": "hip", "parent": "root", "rotation": 3.15, "x": -136.78, "y": 415.47, "color": "fbff00ff" }, + { "name": "torso1", "parent": "hip", "length": 126.25, "rotation": -4.97, "x": 30.03, "y": -0.4, "color": "eaff00ff" }, + { "name": "saddle", "parent": "torso1", "length": 50.91, "rotation": 91.8, "x": 4.56, "y": 71.86, "color": "ff7300ff" }, + { "name": "spineboy_hip", "parent": "saddle", "length": 0.52, "rotation": 90.01, "x": 81.88, "y": 2.68, "color": "ffffffff" }, { - "name": "gun", + "name": "spineboy_torso", "parent": "spineboy_hip", - "length": 181.35, - "x": 16.86, - "y": -7.89, - "scaleX": 0.816, - "scaleY": 0.816, - "rotation": 107.11 + "length": 122.45, + "rotation": -75.85, + "x": 1.05, + "y": -2.1, + "color": "ffffffff" + }, + { + "name": "back_arm", + "parent": "spineboy_torso", + "length": 67.21, + "rotation": -120.89, + "x": 96.33, + "y": -38.46, + "color": "ffffffff" + }, + { "name": "back_bracer", "parent": "back_arm", "length": 43.68, "rotation": 17.48, "x": 67.21, "y": -0.31, "color": "ffffffff" }, + { + "name": "back_hand", + "parent": "back_bracer", + "length": 41.97, + "rotation": 9.2, + "x": 43.68, + "y": 0.06, + "inheritRotation": false, + "color": "ffffffff" + }, + { "name": "back_thigh", "parent": "spineboy_hip", "length": 71.15, "rotation": 160.75, "x": -9.57, "y": 2.31, "color": "ffffffff" }, + { "name": "back_knee", "parent": "back_thigh", "length": 97.17, "rotation": -54.97, "x": 71.15, "y": -0.28, "color": "ffffffff" }, + { + "name": "front_arm", + "parent": "spineboy_torso", + "length": 74.51, + "rotation": -118.16, + "x": 101.37, + "y": 9.78, + "color": "ffffffff" + }, + { "name": "torso2", "parent": "torso1", "length": 121.2, "rotation": 39.84, "x": 126.25, "y": -0.37, "color": "eaff00ff" }, + { "name": "front_arm1", "parent": "torso2", "length": 109.99, "rotation": 224.54, "x": 46.37, "y": -84.61, "color": "15ff00ff" }, + { "name": "front_arm2", "parent": "front_arm1", "length": 86.33, "rotation": 105.23, "x": 109.99, "y": 0.2, "color": "15ff00ff" }, + { "name": "neck", "parent": "torso2", "length": 70.59, "rotation": 41.37, "x": 121.19, "y": 0.34, "color": "eaff00ff" }, + { "name": "head", "parent": "neck", "length": 105.5, "rotation": 9.82, "x": 70.59, "y": 0.03, "color": "eaff00ff" }, + { "name": "horn_front", "parent": "head", "length": 87.48, "rotation": 49.36, "x": 82.09, "y": -221.36, "color": "15ff00ff" }, + { "name": "front_arm_target", "parent": "horn_front", "rotation": -138.59, "x": 294.58, "y": 234.17, "color": "15ff00ff" }, + { "name": "front_bracer", "parent": "front_arm", "length": 39.85, "rotation": 20.3, "x": 74.52, "y": -0.41, "color": "ffffffff" }, + { "name": "front_leg1", "parent": "hip", "length": 251.74, "rotation": -51.5, "x": 27.36, "y": -28.27, "color": "15ff00ff" }, + { "name": "front_leg2", "parent": "front_leg1", "length": 208.54, "rotation": 261.93, "x": 251.03, "y": 0.16, "color": "15ff00ff" }, + { "name": "front_leg3", "parent": "front_leg2", "length": 118.18, "rotation": 85.46, "x": 208.5, "y": -1.63, "color": "15ff00ff" }, + { + "name": "front_foot1", + "parent": "front_leg3", + "length": 57.79, + "rotation": 54.46, + "x": 118.19, + "y": -0.79, + "scaleX": 1.126, + "color": "15ff00ff" }, - { "name": "head", "parent": "neck", "length": 105.5, "x": 70.59, "y": 0.03, "rotation": 9.82 }, - { "name": "rear_arm2", "parent": "rear_arm1", "length": 85.8, "x": 109.56, "rotation": 123.56 }, - { "name": "rear_foot1", "parent": "rear_leg3", "length": 84.51, "x": 102.37, "y": -0.02, "rotation": 75.43 }, - { "name": "saddle_strap_front2", "parent": "saddle_strap_front1", "length": 102.74, "x": 97.29, "y": 0.3, "rotation": -11.13 }, - { "name": "saddle_strap_rear2", "parent": "saddle_strap_rear1", "length": 54.36, "x": 38.63, "y": -0.02 }, - { "name": "spineboy_torso", "parent": "spineboy_hip", "length": 122.45, "x": 1.05, "y": -2.1, "rotation": -75.85 }, - { "name": "stirrup_strap2", "parent": "stirrup_strap1", "length": 51.62, "x": 43.7, "rotation": 9.38 }, - { "name": "tail4", "parent": "tail3", "length": 126.25, "x": 141.05, "y": 0.64, "rotation": -18.86 }, - { "name": "back_arm", "parent": "spineboy_torso", "length": 67.21, "x": 96.33, "y": -38.46, "rotation": -120.89 }, - { "name": "back_knee", "parent": "back_thigh", "length": 97.17, "x": 71.15, "y": -0.28, "rotation": -54.97 }, - { "name": "front_arm", "parent": "spineboy_torso", "length": 74.51, "x": 101.37, "y": 9.78, "rotation": -118.16 }, { "name": "front_foot2", "parent": "front_foot1", "length": 56.19, + "rotation": -2.15, "x": 57.78, "y": -0.02, "scaleX": 0.73, "scaleY": 0.823, - "rotation": -0.46, - "inheritRotation": false + "inheritRotation": false, + "color": "15ff00ff" }, - { "name": "front_hand", "parent": "front_arm2", "length": 47.55, "x": 86.33, "y": 0.06, "rotation": -56.83 }, - { "name": "horn_front", "parent": "head", "length": 87.48, "x": 82.09, "y": -221.36, "rotation": 49.36 }, - { "name": "horn_rear", "parent": "head", "length": 73.78, "x": 99.27, "y": -226.79, "rotation": 44.31 }, - { "name": "jaw", "parent": "head", "length": 203.76, "x": 29.36, "y": -40.15, "rotation": -140.14, "inheritScale": false }, - { "name": "lower_leg", "parent": "front_thigh", "length": 111.5, "x": 77.92, "y": -0.1, "rotation": -49.62 }, - { "name": "neck2", "parent": "spineboy_torso", "length": 32.04, "x": 113.44, "y": -15.21, "rotation": -45.22 }, - { - "name": "rear_foot2", - "parent": "rear_foot1", - "length": 102.31, - "x": 84.49, - "y": -0.34, - "rotation": -6.13, - "inheritRotation": false - }, - { "name": "rear_hand", "parent": "rear_arm2", "length": 45.8, "x": 85.8, "y": 0.1, "rotation": -76.28 }, - { "name": "saddle_strap_rear3", "parent": "saddle_strap_rear2", "length": 44.04, "x": 54.86, "y": 0.19, "rotation": 3.63 }, - { "name": "tail5", "parent": "tail4", "length": 91.06, "x": 126.25, "y": -0.47, "rotation": -22.34 }, - { "name": "tongue1", "parent": "head", "length": 55.11, "x": 20.81, "y": -104.75, "rotation": -129.04 }, - { "name": "back_bracer", "parent": "back_arm", "length": 43.68, "x": 67.21, "y": -0.31, "rotation": 17.48 }, - { "name": "bone", "parent": "horn_front", "x": 294.58, "y": 234.17, "rotation": -138.59 }, - { "name": "bone2", "parent": "horn_rear", "x": 232.68, "y": 245.84, "rotation": -133.55 }, - { "name": "front_bracer", "parent": "front_arm", "length": 39.85, "x": 74.52, "y": -0.41, "rotation": 20.3 }, { "name": "front_foot3", "parent": "front_foot2", "length": 129.88, + "rotation": -2.7, "x": 49.71, "y": 20.65, "scaleX": 1.154, - "rotation": -3.16, - "inheritRotation": false + "color": "15ff00ff" }, - { "name": "head2", "parent": "neck2", "length": 249.64, "x": 23.01, "y": 3.47, "rotation": 11.65 }, - { "name": "tongue2", "parent": "tongue1", "length": 44.66, "x": 55.59, "y": 0.93, "rotation": 8.93 }, - { "name": "back_hand", "parent": "back_bracer", "length": 41.97, "x": 43.68, "y": 0.06, "rotation": 9.2, "inheritRotation": false }, + { "name": "front_foot_goal", "parent": "root", "rotation": -0.94, "x": -45.79, "y": -28.67, "color": "ff0000ff" }, + { "name": "front_hand", "parent": "front_arm2", "length": 47.55, "rotation": -56.83, "x": 86.33, "y": 0.06, "color": "15ff00ff" }, { "name": "front_hand2", "parent": "front_bracer", "length": 58.18, + "rotation": 13.9, "x": 39.98, "y": -0.89, - "rotation": 13.9, - "inheritRotation": false + "inheritRotation": false, + "color": "ffffffff" }, - { "name": "tongue3", "parent": "tongue2", "length": 43.64, "x": 44.26, "y": -0.2, "rotation": 12.86 } -], -"ik": [ + { "name": "front_leg_goal", "parent": "front_foot_goal", "x": -106.06, "y": 115.58, "color": "ff0000ff" }, { - "name": "front_leg_goal", - "bones": [ "front_leg1", "front_leg2" ], - "target": "front_leg_goal", - "bendPositive": false + "name": "front_thigh", + "parent": "spineboy_hip", + "length": 77.79, + "rotation": 163.34, + "x": 15.51, + "y": 17.01, + "color": "ffffffff" }, { - "name": "rear_leg_goal", - "bones": [ "rear_leg1", "rear_leg2" ], - "target": "rear_leg_goal", - "bendPositive": false + "name": "gun", + "parent": "spineboy_hip", + "length": 181.35, + "rotation": 107.11, + "x": 16.86, + "y": -7.89, + "scaleX": 0.816, + "scaleY": 0.816, + "color": "ffffffff" + }, + { "name": "neck2", "parent": "spineboy_torso", "length": 32.04, "rotation": -45.22, "x": 113.44, "y": -15.21, "color": "ffffffff" }, + { "name": "head2", "parent": "neck2", "length": 249.64, "rotation": 11.65, "x": 23.01, "y": 3.47, "color": "ffffffff" }, + { "name": "horn_rear", "parent": "head", "length": 73.78, "rotation": 44.31, "x": 99.27, "y": -226.79, "color": "e07800ff" }, + { "name": "jaw", "parent": "head", "length": 203.76, "rotation": -140.14, "x": 29.36, "y": -40.15, "color": "ffff00ff" }, + { "name": "lower_leg", "parent": "front_thigh", "length": 111.5, "rotation": -49.62, "x": 77.92, "y": -0.1, "color": "ffffffff" }, + { "name": "rear_arm1", "parent": "torso2", "length": 109.56, "rotation": -124.71, "x": 57.05, "y": -95.38, "color": "e07800ff" }, + { "name": "rear_arm2", "parent": "rear_arm1", "length": 85.8, "rotation": 123.56, "x": 109.56, "color": "e07800ff" }, + { "name": "rear_arm_target", "parent": "horn_rear", "rotation": -133.55, "x": 232.68, "y": 245.84, "color": "e07800ff" }, + { "name": "rear_leg1", "parent": "hip", "length": 226.27, "rotation": -54.76, "x": 55.19, "y": -71.25, "color": "e07800ff" }, + { "name": "rear_leg2", "parent": "rear_leg1", "length": 172.58, "rotation": -92.25, "x": 226.32, "y": 0.23, "color": "e07800ff" }, + { "name": "rear_leg3", "parent": "rear_leg2", "length": 103.05, "rotation": 82.81, "x": 172.31, "y": 2.21, "color": "e07800ff" }, + { "name": "rear_foot1", "parent": "rear_leg3", "length": 84.51, "rotation": 75.43, "x": 102.37, "y": -0.02, "color": "e07800ff" }, + { + "name": "rear_foot2", + "parent": "rear_foot1", + "length": 102.31, + "rotation": -6.13, + "x": 84.49, + "y": -0.34, + "inheritRotation": false, + "color": "e07800ff" + }, + { "name": "rear_foot_goal", "parent": "root", "x": 33.43, "y": 30.81, "color": "ff0000ff" }, + { "name": "rear_hand", "parent": "rear_arm2", "length": 45.8, "rotation": -76.28, "x": 85.8, "y": 0.1, "color": "e07800ff" }, + { "name": "rear_leg_goal", "parent": "rear_foot_goal", "x": -127.51, "y": 75.99, "color": "ff0000ff" }, + { + "name": "saddle_strap_front1", + "parent": "saddle", + "length": 97.27, + "rotation": -148.11, + "x": -27.36, + "y": -73.38, + "color": "ff7300ff" }, { - "name": "front_foot_goal", - "bones": [ "front_leg3", "front_foot1" ], - "target": "front_foot_goal" + "name": "saddle_strap_front2", + "parent": "saddle_strap_front1", + "length": 102.74, + "rotation": -11.13, + "x": 97.29, + "y": 0.3, + "color": "ff7300ff" }, { - "name": "rear_foot_goal", - "bones": [ "rear_leg3", "rear_foot1" ], - "target": "rear_foot_goal" + "name": "saddle_strap_rear1", + "parent": "saddle", + "length": 38.62, + "rotation": 151.13, + "x": -33.34, + "y": 87.32, + "color": "ff7300ff" }, + { "name": "saddle_strap_rear2", "parent": "saddle_strap_rear1", "length": 54.36, "x": 38.63, "y": -0.02, "color": "ff7300ff" }, { - "name": "stirrup", - "bones": [ "stirrup_strap1", "stirrup_strap2" ], - "target": "stirrup" + "name": "saddle_strap_rear3", + "parent": "saddle_strap_rear2", + "length": 44.04, + "rotation": 3.63, + "x": 54.86, + "y": 0.19, + "color": "ff7300ff" }, - { - "name": "spineboy_rear_leg_goal", - "bones": [ "back_thigh", "back_knee" ], - "target": "spineboy_rear_arm_goal", - "bendPositive": false - }, - { - "name": "spineboy_front_leg_goal", - "bones": [ "front_thigh", "lower_leg" ], - "target": "spineboy_front_arm_goal", - "bendPositive": false - }, - { - "name": "rear_arm_goal", - "bones": [ "back_arm", "back_bracer" ], - "target": "bone2" - }, - { - "name": "front_arm_goal", - "bones": [ "front_arm", "front_bracer" ], - "target": "bone" - } + { "name": "spineboy_front_arm_goal", "parent": "saddle", "x": -50.7, "y": -96.93, "color": "ff0004ff" }, + { "name": "spineboy_rear_arm_goal", "parent": "saddle", "x": -30.43, "y": -100.08, "color": "ff0001ff" }, + { "name": "stirrup", "parent": "saddle", "length": 78.17, "rotation": -68.85, "x": -81.94, "y": -103.38, "color": "ff7300ff" }, + { "name": "stirrup_strap1", "parent": "saddle", "length": 43.69, "rotation": -135, "x": -20.38, "y": -29.37, "color": "ff7300ff" }, + { "name": "stirrup_strap2", "parent": "stirrup_strap1", "length": 51.62, "rotation": 9.38, "x": 43.7, "color": "ff7300ff" }, + { "name": "tail1", "parent": "hip", "length": 162.53, "rotation": 162.92, "x": -20.86, "y": 6.87, "color": "eaff00ff" }, + { "name": "tail2", "parent": "tail1", "length": 130.02, "rotation": 30.3, "x": 162.53, "y": -0.82, "color": "eaff00ff" }, + { "name": "tail3", "parent": "tail2", "length": 141.06, "rotation": 6.88, "x": 130.02, "y": 0.1, "color": "eaff00ff" }, + { "name": "tail4", "parent": "tail3", "length": 126.25, "rotation": -18.86, "x": 141.05, "y": 0.64, "color": "eaff00ff" }, + { "name": "tail5", "parent": "tail4", "length": 91.06, "rotation": -22.34, "x": 126.25, "y": -0.47, "color": "eaff00ff" }, + { "name": "tongue1", "parent": "head", "length": 55.11, "rotation": -129.04, "x": 20.81, "y": -104.75, "color": "ffff00ff" }, + { "name": "tongue2", "parent": "tongue1", "length": 44.66, "rotation": 8.93, "x": 55.59, "y": 0.93, "color": "fff200ff" }, + { "name": "tongue3", "parent": "tongue2", "length": 43.64, "rotation": 12.86, "x": 44.26, "y": -0.2, "color": "fff200ff" } ], "slots": [ { "name": "back_hand", "bone": "back_hand", "attachment": "back_hand" }, @@ -198,6 +233,57 @@ { "name": "front_bracer", "bone": "front_bracer", "attachment": "front_bracer" }, { "name": "front_hand", "bone": "front_hand2", "attachment": "front_hand" } ], +"ik": [ + { + "name": "front_arm_goal", + "bones": [ "front_arm", "front_bracer" ], + "target": "front_arm_target" + }, + { + "name": "front_foot_goal", + "bones": [ "front_leg3", "front_foot1" ], + "target": "front_foot_goal" + }, + { + "name": "front_leg_goal", + "bones": [ "front_leg1", "front_leg2" ], + "target": "front_leg_goal", + "bendPositive": false + }, + { + "name": "rear_arm_goal", + "bones": [ "back_arm", "back_bracer" ], + "target": "rear_arm_target" + }, + { + "name": "rear_foot_goal", + "bones": [ "rear_leg3", "rear_foot1" ], + "target": "rear_foot_goal" + }, + { + "name": "rear_leg_goal", + "bones": [ "rear_leg1", "rear_leg2" ], + "target": "rear_leg_goal", + "bendPositive": false + }, + { + "name": "spineboy_front_leg_goal", + "bones": [ "front_thigh", "lower_leg" ], + "target": "spineboy_front_arm_goal", + "bendPositive": false + }, + { + "name": "spineboy_rear_leg_goal", + "bones": [ "back_thigh", "back_knee" ], + "target": "spineboy_rear_arm_goal", + "bendPositive": false + }, + { + "name": "stirrup", + "bones": [ "stirrup_strap1", "stirrup_strap2" ], + "target": "stirrup" + } +], "skins": { "default": { "back_arm": { @@ -236,9 +322,12 @@ "gun_nohand": { "type": "mesh", "uvs": [ 0.71081, 0.16149, 0.85807, 0.41784, 1, 0.6649, 1, 1, 0.71457, 1, 0.49802, 0.6905, 0.30182, 0.41009, 0, 0.58226, 0, 0.1174, 0.27187, 0.12429, 0.24857, 0, 0.36658, 0, 0.61804, 0, 0.70575, 0.53546, 0.53668, 0.26855 ], - "triangles": [ 9, 10, 11, 14, 11, 12, 14, 12, 0, 9, 11, 14, 6, 9, 14, 14, 0, 1, 13, 14, 1, 6, 7, 8, 6, 8, 9, 13, 1, 2, 13, 5, 6, 13, 6, 14, 3, 4, 13, 5, 13, 4, 3, 13, 2 ], + "triangles": [ 3, 13, 2, 5, 13, 4, 3, 4, 13, 13, 6, 14, 13, 5, 6, 13, 1, 2, 6, 8, 9, 6, 7, 8, 13, 14, 1, 14, 0, 1, 6, 9, 14, 9, 11, 14, 14, 12, 0, 14, 11, 12, 9, 10, 11 ], "vertices": [ 23.48, 50.63, 83.86, 46.32, 142.05, 42.17, 197.91, 3.34, 163.7, -45.86, 86.15, -47.34, 15.9, -48.68, 8.42, -120.68, -69.06, -66.81, -35.32, -20.73, -58.83, -10.35, -44.69, 9.99, -14.55, 53.35, 85.21, 6.43, 20.45, 8.2 ], - "hull": 13 + "hull": 13, + "edges": [ 14, 12, 6, 8, 6, 4, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 8, 10, 10, 12, 6, 26, 10, 26, 4, 2, 26, 2, 22, 28, 28, 26, 12, 28, 2, 0, 0, 24, 28, 0, 18, 12 ], + "width": 210, + "height": 203 } }, "head": { @@ -255,47 +344,62 @@ }, "raptor_arm_back": { "raptor_arm_back": { - "type": "skinnedmesh", - "uvs": [ 0.38711, 0.29362, 0.31382, 0.46513, 0.29242, 0.51521, 0.32475, 0.4931, 0.57587, 0.32138, 0.63254, 0.28263, 0.71632, 0.34507, 0.94948, 0.51888, 1, 0.65257, 1, 0.90624, 0.95462, 0.99934, 0.88957, 0.83204, 0.80294, 0.99998, 0.75236, 0.75696, 0.6654, 0.713, 0.62288, 0.63242, 0.58194, 0.65031, 0.22478, 0.80641, 0.07791, 0.73315, 0.07825, 0.66549, 0.07984, 0.34306, 0, 0.29728, 0, 0, 0.32334, 0, 0.94947, 0.60129 ], - "triangles": [ 6, 14, 15, 5, 6, 15, 5, 15, 4, 6, 7, 14, 24, 7, 8, 24, 14, 7, 13, 14, 24, 11, 13, 24, 11, 24, 8, 11, 8, 9, 10, 11, 9, 12, 13, 11, 15, 16, 4, 18, 19, 2, 16, 3, 4, 17, 18, 2, 17, 2, 3, 17, 3, 16, 20, 21, 22, 23, 20, 22, 0, 20, 23, 1, 20, 0, 1, 19, 20, 2, 19, 1 ], - "vertices": [ 2, 18, 36.95, 33.31, 0.91666, 34, 68.53, 41.05, 0.08333, 2, 18, 66.02, 20.35, 0.76813, 34, 41.41, 24.39, 0.23186, 2, 18, 74.51, 16.57, 0.64468, 34, 33.49, 19.53, 0.35531, 3, 18, 70.89, 21.97, 0.27669, 34, 39.99, 19.46, 0.67508, 52, -29.67, -39.91, 0.04822, 3, 18, 42.77, 63.89, 0.11483, 34, 90.47, 18.95, 0.60854, 52, -17.2, 9, 0.27661, 2, 34, 101.86, 18.83, 0.45955, 52, -14.38, 20.04, 0.54044, 2, 34, 106.47, 2.08, 0.0625, 52, 2.98, 20.56, 0.9375, 1, 52, 51.32, 21.98, 1, 1, 52, 72.39, 9.61, 1, 1, 52, 100.37, -23.87, 1, 1, 52, 104.96, -40.9, 1, 1, 52, 78.37, -25.61, 1, 1, 52, 86.05, -56.84, 1, 1, 52, 52.92, -30.04, 1, 2, 34, 62.24, -43.92, 0.0625, 52, 37.19, -33.33, 0.9375, 2, 34, 64.89, -28.65, 0.3125, 52, 22.98, -27.14, 0.6875, 2, 34, 57.69, -27.17, 0.30612, 52, 19.83, -33.78, 0.69387, 2, 18, 124.19, 3.83, 0.19395, 34, -5.09, -14.23, 0.80604, 2, 18, 110.77, -19.65, 0.3125, 34, -16.88, 10.1, 0.6875, 2, 18, 99.14, -19.2, 0.51613, 34, -9.93, 19.44, 0.48386, 2, 18, 43.73, -17.03, 0.9375, 34, 23.17, 63.92, 0.0625, 1, 18, 35.41, -29.77, 1, 1, 18, -15.68, -28.02, 1, 1, 18, -13.87, 24.65, 1, 1, 52, 60.41, 11.1, 1 ], - "hull": 24 + "type": "mesh", + "uvs": [ 0.38711, 0.29362, 0.31382, 0.46513, 0.29242, 0.51521, 0.32475, 0.4931, 0.57587, 0.32138, 0.63254, 0.28263, 0.71632, 0.34507, 0.94948, 0.51888, 0.94947, 0.60129, 1, 0.65257, 1, 0.90624, 0.95462, 0.99934, 0.88957, 0.83204, 0.80294, 0.99998, 0.75236, 0.75696, 0.6654, 0.713, 0.62288, 0.63242, 0.58194, 0.65031, 0.22478, 0.80641, 0.07791, 0.73315, 0.07825, 0.66549, 0.07984, 0.34306, 0, 0.29728, 0, 0, 0.32334, 0 ], + "triangles": [ 13, 14, 12, 11, 12, 10, 12, 9, 10, 12, 8, 9, 12, 14, 8, 14, 15, 8, 8, 15, 7, 16, 17, 4, 6, 7, 15, 5, 16, 4, 5, 6, 16, 6, 15, 16, 18, 3, 17, 18, 2, 3, 18, 19, 2, 19, 20, 2, 17, 3, 4, 2, 20, 1, 1, 20, 21, 1, 21, 0, 0, 21, 24, 24, 21, 23, 21, 22, 23 ], + "vertices": [ 2, 37, 36.95, 33.31, 0.91666, 38, 68.53, 41.05, 0.08333, 2, 37, 66.01999, 20.35, 0.76813, 38, 41.41, 24.39, 0.23186, 2, 37, 74.51, 16.57, 0.64468, 38, 33.49, 19.53, 0.35531, 2, 37, 70.89, 21.97, 0.29071, 38, 39.99, 19.45999, 0.70928, 3, 37, 42.77, 63.89, 0.11483, 38, 90.47, 18.95, 0.60854, 46, -17.2, 9, 0.2766, 2, 38, 101.86, 18.83, 0.45955, 46, -14.38, 20.04, 0.54044, 2, 38, 106.47, 2.08, 0.0625, 46, 2.98, 20.56, 0.9375, 1, 46, 51.32, 21.98, 1, 1, 46, 60.41, 11.1, 1, 1, 46, 72.39, 9.60999, 1, 1, 46, 100.37, -23.87, 1, 1, 46, 104.96, -40.9, 1, 1, 46, 78.37, -25.61, 1, 1, 46, 86.05, -56.84, 1, 1, 46, 52.92, -30.04, 1, 2, 38, 62.24, -43.92, 0.0625, 46, 37.18999, -33.33, 0.9375, 2, 38, 64.89, -28.65, 0.3125, 46, 22.98, -27.14, 0.6875, 2, 38, 57.69, -27.17, 0.30612, 46, 19.83, -33.78, 0.69387, 2, 37, 124.19, 3.83, 0.19395, 38, -5.09, -14.23, 0.80604, 2, 37, 110.77, -19.65, 0.3125, 38, -16.87999, 10.1, 0.6875, 2, 37, 99.14, -19.2, 0.51612, 38, -9.93, 19.44, 0.48386, 2, 37, 43.73, -17.03, 0.9375, 38, 23.17, 63.92, 0.0625, 1, 37, 35.41, -29.77, 1, 1, 37, -15.68, -28.02, 1, 1, 37, -13.87, 24.65, 1 ], + "hull": 25, + "edges": [ 44, 46, 44, 42, 38, 36, 32, 30, 30, 28, 28, 26, 24, 22, 18, 16, 16, 14, 46, 48, 38, 4, 6, 4, 6, 36, 42, 40, 40, 38, 4, 2, 2, 0, 40, 2, 10, 32, 36, 34, 34, 32, 10, 8, 8, 6, 34, 8, 14, 12, 12, 10, 12, 30, 18, 20, 22, 20, 26, 24, 48, 0 ], + "width": 163, + "height": 172 } }, "raptor_body": { "raptor_body": { - "type": "skinnedmesh", - "uvs": [ 0.89014, 0.11136, 1, 0.22194, 1, 0.42847, 0.88179, 0.38589, 0.874, 0.47986, 0.84783, 0.51728, 0.82504, 0.54984, 0.82403, 0.61606, 0.82305, 0.67972, 0.74042, 0.86709, 0.61596, 0.93097, 0.49649, 0.90968, 0.41186, 0.71379, 0.36955, 0.70086, 0.32823, 0.68824, 0.27515, 0.71028, 0.25301, 0.71948, 0.22568, 0.73082, 0.19092, 0.7164, 0.15952, 0.70337, 0.1301, 0.69116, 0.09227, 0.67546, 0.06029, 0.63165, 0.02855, 0.58817, 0, 0.49874, 0.05045, 0.53494, 0.08267, 0.54507, 0.11815, 0.55623, 0.14733, 0.54161, 0.17913, 0.52568, 0.20324, 0.5136, 0.22867, 0.50087, 0.24871, 0.47664, 0.27523, 0.44458, 0.32026, 0.39015, 0.37517, 0.35747, 0.43476, 0.32201, 0.4893, 0.35534, 0.56021, 0.39867, 0.61587, 0.40674, 0.67769, 0.4157, 0.69094, 0.31314, 0.69362, 0.14742, 0.79219, 0.08354, 0.51541, 0.74573, 0.62393, 0.75425, 0.70856, 0.7287, 0.76132, 0.63288, 0.7566, 0.49454, 0.80613, 0.27517, 0.65885, 0.59037, 0.53929, 0.54937, 0.42632, 0.52207, 0.3246, 0.55241, 0.22715, 0.618, 0.10574, 0.61341, 0.03969, 0.56109, 0.77916, 0.39461, 0.37556, 0.53721, 0.27743, 0.58416, 0.16958, 0.61582, 0.07259, 0.58715, 0.87545, 0.31683, 0.85488, 0.21417, 0.81012, 0.17403, 0.83214, 0.25662, 0.83823, 0.32214, 0.84622, 0.41719, 0.59954, 0.57003, 0.49074, 0.53763, 0.76917, 0.43888, 0.75912, 0.56845, 0.871, 0.3701, 0.85431, 0.43545, 0.89558, 0.32412, 0.90105, 0.22877, 0.91523, 0.20564, 0.93086, 0.219, 0.93446, 0.25858, 0.91956, 0.2776, 0.9061, 0.26423, 0.9415, 0.25929, 0.93589, 0.21545, 0.91669, 0.19192, 0.89297, 0.22201, 0.90245, 0.28513, 0.92006, 0.281, 0.92143, 0.29619, 0.94856, 0.2643, 0.19894, 0.61694, 0.13973, 0.61469, 0.25158, 0.60156 ], - "triangles": [ 10, 11, 45, 45, 11, 44, 11, 12, 44, 44, 68, 45, 12, 69, 44, 12, 58, 52, 21, 22, 55, 22, 61, 55, 22, 23, 61, 55, 61, 27, 23, 56, 61, 23, 24, 56, 61, 56, 26, 61, 26, 27, 26, 56, 25, 56, 24, 25, 19, 60, 89, 19, 20, 60, 60, 20, 90, 20, 21, 90, 90, 21, 55, 89, 60, 29, 90, 28, 60, 60, 28, 29, 55, 27, 90, 90, 27, 28, 16, 17, 54, 91, 15, 16, 18, 54, 17, 54, 18, 89, 16, 54, 91, 18, 19, 89, 15, 91, 59, 31, 91, 54, 89, 30, 54, 89, 29, 30, 32, 59, 91, 30, 31, 54, 32, 91, 31, 33, 59, 32, 14, 15, 59, 33, 53, 59, 13, 58, 12, 58, 13, 53, 59, 53, 14, 13, 14, 53, 34, 58, 53, 35, 52, 58, 34, 53, 33, 58, 34, 35, 44, 69, 51, 12, 52, 69, 51, 38, 39, 51, 69, 38, 38, 69, 37, 69, 52, 37, 36, 52, 35, 36, 37, 52, 4, 5, 70, 4, 57, 73, 73, 57, 67, 4, 73, 3, 3, 73, 72, 3, 74, 2, 74, 87, 2, 87, 88, 2, 88, 1, 2, 73, 67, 72, 72, 67, 66, 67, 57, 66, 57, 49, 66, 57, 41, 49, 3, 72, 74, 72, 62, 74, 72, 66, 62, 74, 85, 87, 85, 74, 84, 49, 65, 66, 66, 65, 62, 84, 74, 62, 63, 62, 65, 84, 62, 63, 41, 42, 49, 85, 86, 87, 88, 86, 81, 88, 87, 86, 85, 84, 80, 85, 80, 79, 80, 84, 75, 79, 80, 78, 49, 64, 65, 64, 49, 43, 1, 88, 82, 80, 75, 78, 82, 88, 81, 75, 77, 78, 82, 81, 77, 81, 78, 77, 65, 64, 63, 75, 76, 77, 75, 84, 76, 76, 84, 83, 76, 83, 82, 83, 0, 1, 0, 83, 84, 63, 0, 84, 63, 64, 0, 1, 82, 83, 49, 42, 43, 64, 43, 0, 57, 4, 70, 45, 50, 46, 46, 47, 8, 46, 50, 47, 8, 47, 7, 50, 71, 47, 47, 71, 7, 7, 71, 6, 71, 50, 48, 48, 50, 40, 50, 68, 40, 71, 48, 6, 6, 48, 5, 5, 48, 70, 48, 40, 70, 70, 40, 57, 57, 40, 41, 10, 45, 9, 45, 46, 9, 9, 46, 8, 45, 68, 50, 44, 51, 68, 68, 39, 40, 68, 51, 39 ], - "vertices": [ 1, 33, 147.48, -145.48, 1, 1, 33, 89.4, -281.62, 1, 1, 33, -28.24, -285.93, 1, 1, 33, -14.58, -194.68, 1, 5, 9, 363.21, 87.73, 0.02179, 14, 238.39, -84.13, 0.20397, 17, 32.1, -140.85, 0.18915, 33, -61.96, -132.26, 0.41197, 48, 129.57, 6.39, 0.1731, 5, 9, 332.7, 63.71, 0.06905, 14, 199.57, -83.03, 0.29424, 17, 3.69, -114.37, 0.2194, 33, -85.43, -101.32, 0.30859, 48, 127.34, -26.64, 0.1087, 5, 9, 307.08, 43.5, 0.11018, 14, 166.95, -82.13, 0.37282, 17, -20.18, -92.14, 0.24572, 33, -105.18, -75.34, 0.21862, 48, 123.08, -64.79, 0.05264, 5, 9, 307.75, 5.7, 0.18146, 14, 143.25, -111.59, 0.56512, 17, -57.43, -98.57, 0.12044, 33, -142.98, -75.33, 0.10715, 48, 154.85, -83.49, 0.0258, 2, 9, 308.7, -30.55, 0.25, 14, 120.75, -140.04, 0.75, 2, 9, 213.94, -142.7, 0.75, 14, -23.83, -165.45, 0.25, 3, 9, 64.45, -187.34, 0.31139, 8, -158.45, 158.33, 0.10379, 2, 84.16, -190.98, 0.5848, 1, 2, -61.47, -178.84, 1, 1, 2, -166.91, -67.95, 1, 6, 9, -246.26, -74, 0.04136, 8, 170.4, 123.13, 0.2858, 13, 66.71, 104.77, 0.57052, 27, -53.08, 110.21, 0.10163, 40, -220.11, 35.3, 5.1E-4, 54, -331.4, -106.89, 1.5E-4, 6, 9, -297.45, -69.74, 0.01855, 8, 221.11, 131.31, 0.14592, 13, 115.07, 87.47, 0.47026, 27, -6.58, 88.39, 0.30085, 40, -168.92, 31, 0.06162, 54, -282.82, -90.19, 0.00276, 6, 9, -359.24, -85.1, 0.00915, 8, 277.38, 161.09, 0.07914, 13, 178.73, 86.41, 0.35008, 27, 56.68, 81.29, 0.38638, 40, -107.13, 46.31, 0.15555, 54, -232.44, -51.26, 0.01966, 6, 9, -376.16, -107.83, 0.0043, 8, 294.31, 176.47, 0.03904, 13, 203.26, 86.51, 0.25323, 27, 83.06, 77.02, 0.42283, 40, -79.56, 53.53, 0.23684, 54, -210.89, -28.3, 0.04374, 6, 9, -416.83, -99.41, 0.00211, 8, 329.83, 188.85, 0.0196, 13, 238.06, 85.41, 0.18217, 27, 115.65, 74.66, 0.41374, 40, -49.53, 60.58, 0.30031, 54, -185.49, -14.98, 0.08205, 6, 9, -449.42, -116.23, 0.00122, 8, 364.17, 200.07, 0.01106, 13, 275.48, 71.62, 0.13243, 27, 152.97, 53.58, 0.37336, 40, -5.82, 53.94, 0.34144, 54, -142.85, 0.11, 0.14047, 6, 9, -498.22, -88.19, 7.8E-4, 8, 411.52, 197.55, 0.00669, 13, 313.81, 53.61, 0.09623, 27, 188.04, 35.82, 0.32105, 40, 31.84, 49.3, 0.36432, 54, -106.46, 7.49, 0.21089, 6, 9, -524.31, -113.4, 5.8E-4, 8, 437.98, 213.03, 0.00423, 13, 345.74, 45.54, 0.06864, 27, 219.6, 19.28, 0.26387, 40, 68.31, 43.02, 0.36996, 54, -70.13, 18.19, 0.2927, 6, 9, -580.94, -76.79, 4.7E-4, 8, 494.56, 206.4, 0.00237, 13, 390.81, 21.3, 0.0452, 27, 261.62, -3.66, 0.20066, 40, 114.55, 37.83, 0.35931, 54, -26.15, 30.34, 0.39196, 6, 9, -621.23, -53.98, 4.4E-4, 8, 539.16, 193.96, 0.00115, 13, 423.87, -11.11, 0.02629, 27, 291.46, -39.06, 0.13478, 40, 154.83, 14.99, 0.33453, 54, 19.91, 25.67, 0.50278, 6, 9, -661.22, -31.34, 4.6E-4, 8, 583.41, 181.62, 5.6E-4, 13, 456.68, -43.27, 0.01512, 27, 321.06, -74.2, 0.08778, 40, 194.79, -7.66, 0.31014, 54, 65.62, 21.04, 0.58591, 6, 9, -698.76, 17.64, 4.7E-4, 8, 631.64, 143.1, 4.0E-4, 13, 480.34, -100.28, 0.01183, 27, 339.2, -133.2, 0.07247, 40, 232.3, -56.69, 0.30126, 54, 119.7, -8.69, 0.61353, 6, 9, -636.21, 0.4, 4.5E-4, 8, 566.79, 144.78, 5.5E-4, 13, 424.34, -67.52, 0.01513, 27, 286.57, -95.27, 0.08778, 40, 169.77, -39.4, 0.31045, 54, 55.51, -18.08, 0.5856, 6, 9, -596.68, -3.21, 4.2E-4, 8, 527.55, 138.78, 0.00111, 13, 387.08, -53.84, 0.02607, 27, 250.77, -78.11, 0.13421, 40, 130.24, -35.75, 0.33502, 54, 17.87, -30.67, 0.50314, 6, 9, -553.14, -7.2, 4.2E-4, 8, 484.33, 132.17, 0.00229, 13, 346.04, -38.78, 0.04477, 27, 211.34, -59.22, 0.19954, 40, 86.7, -31.72, 0.3598, 54, -23.59, -44.54, 0.39316, 6, 9, -516.96, -25.93, 4.7E-4, 8, 449.17, 125.97, 0.00408, 13, 311.45, -35.25, 0.06808, 27, 175.89, -56.83, 0.26228, 40, 51.53, -43.14, 0.37032, 54, -52.88, -67.87, 0.29473, 6, 9, -479.88, 14.24, 6.0E-4, 8, 418.38, 93.72, 0.00651, 13, 269.72, -40.64, 0.09608, 27, 135.19, -53.82, 0.32015, 40, 13.42, -53.11, 0.36453, 54, -82.03, -93.66, 0.21211, 6, 9, -451.64, 0.32, 8.3E-4, 8, 390.82, 86.58, 0.01046, 13, 241.19, -39.8, 0.13162, 27, 105.59, -52.93, 0.37317, 40, -16.25, -62.16, 0.34265, 54, -108.34, -111.24, 0.14123, 6, 9, -420.35, 31.66, 0.00137, 8, 364.8, 62.48, 0.01849, 13, 207.71, -42.14, 0.18078, 27, 73.33, -49.43, 0.41415, 40, -46.11, -70.49, 0.30264, 54, -129.51, -133.56, 0.08254, 6, 9, -399.11, 28.98, 0.00258, 8, 345.49, 47.53, 0.03705, 13, 182.34, -50.62, 0.25183, 27, 45.87, -56.62, 0.4234, 40, -71.57, -84.96, 0.24035, 54, -150.85, -153.35, 0.04477, 6, 9, -365.43, 66.79, 0.00485, 8, 319.95, 15.15, 0.07594, 13, 145.6, -61.95, 0.35325, 27, 9.61, -63.26, 0.38742, 40, -101.06, -105.58, 0.15807, 54, -165.65, -187.83, 0.02044, 6, 9, -312.31, 100.78, 0.00731, 8, 276.58, -30.61, 0.13928, 13, 85.52, -81.11, 0.48508, 27, -52.01, -76.62, 0.30338, 40, -154.2, -139.52, 0.06214, 54, -200.6, -240.31, 0.00279, 6, 9, -242.48, 124.41, 0.00974, 8, 214.5, -70.36, 0.27055, 13, 11.97, -85.98, 0.61489, 27, -125.69, -74.48, 0.10409, 40, -224.04, -163.1, 5.4E-4, 54, -255.01, -290.05, 1.5E-4, 6, 9, -166.71, 150.07, 0.02469, 8, 147.14, -113.5, 0.57033, 13, -67.84, -91.26, 0.38714, 27, -205.65, -72.16, 0.01755, 40, -299.83, -188.7, 2.0E-4, 54, -314.05, -344.03, 5.0E-5, 2, 9, -113.14, 135.84, 0.24192, 8, 91.72, -112.59, 0.75807, 2, 9, -42.12, 116.77, 0.14515, 8, 18.2, -111.17, 0.85484, 1, 9, 44.2, 107.1, 1, 2, 9, 140.09, 96.35, 0.22579, 14, 72.59, 65.41, 0.7742, 4, 9, 137.69, 169.35, 0.05644, 14, 117.5, 123, 0.24355, 17, 78.3, 94.48, 0.2125, 33, 23.7, 91.74, 0.4875, 2, 17, 171.15, 111.98, 0.25, 33, 118.17, 93.15, 0.75, 1, 33, 158.96, -25.58, 1, 1, 2, -40.63, -86.01, 1, 3, 9, 67.34, -86.66, 0.33215, 8, -137.02, 59.92, 0.08303, 2, 92.54, -90.61, 0.5848, 2, 9, 170.13, -66.29, 0.75, 14, -8.53, -78.72, 0.25, 2, 9, 231.74, -8.12, 0.4, 14, 76.03, -73.52, 0.6, 5, 9, 222.04, 70.41, 0.16894, 14, 118.9, -7, 0.5373, 17, -6.58, -3.99, 0.17075, 33, -76.73, 9.18, 0.08551, 48, 45.05, -108.02, 0.03748, 1, 33, 50.43, -46.56, 1, 1, 14, -9.88, 20.65, 1, 2, 9, -53.22, 20.53, 0.2, 8, 5.8, -15.09, 0.8, 6, 9, -180.71, 32.22, 0.0849, 8, 132.35, 4.24, 0.55723, 13, -23.98, 19.01, 0.34911, 27, -151.51, 33.44, 0.0085, 40, -285.75, -70.86, 1.8E-4, 54, -348.66, -230.51, 5.0E-5, 6, 9, -304.22, 7.95, 0.01243, 8, 246.39, 57.53, 0.13635, 13, 101.61, 10.65, 0.48532, 27, -27.28, 13.2, 0.30559, 40, -162.22, -46.69, 0.05823, 54, -245.36, -158.59, 0.00205, 6, 9, -418.56, -35.1, 0.00168, 8, 346.99, 126.85, 0.01839, 13, 223.17, 22.83, 0.18014, 27, 94.88, 13.77, 0.41602, 40, -47.85, -3.72, 0.30281, 54, -158.02, -73.16, 0.08093, 6, 9, -566.47, -40.57, 4.4E-4, 8, 489.24, 167.77, 0.00225, 13, 367.51, -9.96, 0.04446, 27, 235.45, -32.57, 0.20024, 40, 100.06, 1.62, 0.36103, 54, -24.81, -8.63, 0.39156, 6, 9, -648.5, -15.19, 4.5E-4, 8, 574.96, 162.88, 5.5E-4, 13, 440.24, -55.6, 0.01566, 27, 303.52, -84.91, 0.09149, 40, 182.07, -23.8, 0.3135, 54, 60.48, 1.14, 0.57832, 3, 14, 174.99, 22.22, 0.2, 17, 54.82, -19.14, 0.6, 33, -18.8, -16.2, 0.2, 6, 9, -242.34, 20.11, 0.02478, 8, 189.25, 30.83, 0.26443, 13, 38.68, 14.84, 0.61556, 27, -89.52, 23.34, 0.09454, 40, -224.1, -58.8, 5.1E-4, 54, -297.11, -194.62, 1.4E-4, 6, 9, -359.57, -12.88, 0.00674, 8, 295.08, 91.08, 0.07453, 13, 160.45, 16.54, 0.35139, 27, 31.85, 13.48, 0.39116, 40, -106.86, -25.89, 0.15674, 54, -203.08, -117.24, 0.01941, 6, 9, -488.69, -37.69, 6.7E-4, 8, 414.43, 146.25, 0.00642, 13, 291.61, 7.27, 0.09534, 27, 161.53, -8.2, 0.32068, 40, 22.27, -1.18, 0.36568, 54, -94.86, -42.56, 0.21117, 6, 9, -607.64, -27.83, 4.3E-4, 8, 532.26, 165.32, 0.00108, 13, 404.01, -32.87, 0.02584, 27, 269.61, -58.84, 0.13469, 40, 141.21, -11.13, 0.33582, 54, 17.98, -3.72, 0.50211, 1, 33, 26.4, -166.06, 1, 1, 33, 87.21, -106.12, 1, 1, 33, 108.19, -49.62, 1, 2, 33, 61.73, -82.13, 0.50021, 48, 4.42, 52.83, 0.49978, 2, 33, 22.84, -109.4, 0.50021, 48, 51.52, 46.73, 0.49978, 5, 9, 348.39, 119.13, 0.00694, 14, 247.12, -50.52, 0.065, 17, 60.86, -121.4, 0.06027, 33, -30.3, -118, 0.48738, 48, 96.58, 17.22, 0.38039, 1, 9, 26.73, 14.8, 1, 2, 9, -107.97, 25.67, 0.24192, 8, 60.17, -6.91, 0.75807, 5, 9, 235.53, 102.96, 0.07484, 14, 150.1, 9.35, 0.34943, 17, 27.64, -12.34, 0.40983, 33, -44.43, -4.87, 0.14928, 48, 34.03, -74.39, 0.0166, 5, 9, 227.15, 28.49, 0.29239, 14, 95.96, -42.46, 0.5708, 17, -47.23, -15.44, 0.07952, 33, -118.74, 4.84, 0.03982, 48, 84.85, -129.5, 0.01745, 2, 33, 5.19, -153.1, 0.87618, 48, 90.96, 71.21, 0.12381, 5, 9, 351.78, 108.85, 0.01127, 14, 243.13, -60.59, 0.10548, 17, 51.21, -126.33, 0.09782, 33, -40.65, -121.21, 0.46541, 48, 105.71, 17.33, 0.32, 1, 33, 23.69, -185.21, 1, 1, 33, 79.64, -175.94, 1, 1, 33, 93.96, -187.56, 1, 1, 33, 87.07, -206.55, 1, 1, 33, 64.2, -216.74, 1, 1, 33, 52.23, -203.68, 1, 1, 33, 59.24, -187.03, 1, 1, 33, 64.26, -223.8, 1, 1, 33, 89.44, -211.41, 1, 1, 33, 102.04, -186.95, 1, 1, 33, 83.1, -166.14, 1, 1, 33, 46.84, -186.41, 1, 1, 33, 50.32, -204.36, 1, 1, 33, 41.7, -206.59, 1, 1, 33, 61.87, -230.97, 1, 6, 9, -448.12, -58.75, 9.7E-4, 8, 374.97, 143.6, 0.01016, 13, 256.29, 17.42, 0.13074, 27, 127.43, 2.07, 0.37548, 40, -13.35, -3.05, 0.34387, 54, -128.14, -55.46, 0.13875, 6, 9, -519.55, -68.54, 5.1E-4, 8, 442.75, 168.18, 0.00402, 13, 327.21, 4.42, 0.06791, 27, 196.28, -19.32, 0.26429, 40, 58.71, -1.05, 0.3719, 54, -62.24, -26.21, 0.29134, 6, 9, -386.43, -41.35, 0.00321, 8, 318.32, 113.62, 0.03567, 13, 192.26, 20.14, 0.25008, 27, 64.19, 12.44, 0.42824, 40, -76.55, -13.67, 0.24036, 54, -182.56, -89.31, 0.0424 ], - "hull": 44 + "type": "mesh", + "uvs": [ 0.89014, 0.11136, 1, 0.22194, 1, 0.42847, 0.88179, 0.38589, 0.874, 0.47986, 0.84783, 0.51728, 0.82504, 0.54984, 0.82403, 0.61606, 0.82305, 0.67972, 0.74042, 0.86709, 0.61596, 0.93097, 0.49649, 0.90968, 0.41186, 0.71379, 0.36955, 0.70086, 0.32823, 0.68824, 0.30082, 0.69962, 0.27515, 0.71028, 0.25301, 0.71948, 0.22568, 0.73082, 0.20832, 0.72362, 0.19092, 0.7164, 0.15952, 0.70337, 0.1301, 0.69116, 0.09227, 0.67546, 0.06029, 0.63165, 0.02855, 0.58817, 0, 0.49874, 0.05045, 0.53494, 0.08267, 0.54507, 0.11815, 0.55623, 0.14733, 0.54161, 0.17913, 0.52568, 0.20324, 0.5136, 0.22867, 0.50087, 0.24871, 0.47664, 0.27523, 0.44458, 0.32026, 0.39015, 0.37517, 0.35747, 0.43476, 0.32201, 0.4893, 0.35534, 0.56021, 0.39867, 0.61587, 0.40674, 0.67769, 0.4157, 0.69094, 0.31314, 0.69362, 0.14742, 0.79219, 0.08354, 0.51541, 0.74573, 0.62393, 0.75425, 0.70856, 0.7287, 0.76132, 0.63288, 0.7566, 0.49454, 0.80613, 0.27517, 0.65885, 0.59037, 0.53929, 0.54937, 0.42632, 0.52207, 0.3246, 0.55241, 0.22715, 0.618, 0.10574, 0.61341, 0.03969, 0.56109, 0.77916, 0.39461, 0.37556, 0.53721, 0.27743, 0.58416, 0.16958, 0.61582, 0.07259, 0.58715, 0.87545, 0.31683, 0.85488, 0.21417, 0.81012, 0.17403, 0.83214, 0.25662, 0.83823, 0.32214, 0.84622, 0.41719, 0.59954, 0.57003, 0.49074, 0.53763, 0.76917, 0.43888, 0.75912, 0.56845, 0.871, 0.3701, 0.85431, 0.43545, 0.89558, 0.32412, 0.90105, 0.22877, 0.91523, 0.20564, 0.93086, 0.219, 0.93446, 0.25858, 0.91956, 0.2776, 0.9061, 0.26423, 0.9415, 0.25929, 0.93589, 0.21545, 0.91669, 0.19192, 0.89297, 0.22201, 0.90245, 0.28513, 0.92006, 0.281, 0.92143, 0.29619, 0.94856, 0.2643, 0.19894, 0.61694, 0.13973, 0.61469, 0.25158, 0.60156, 0.88779, 0.26675 ], + "triangles": [ 16, 56, 15, 15, 93, 14, 13, 14, 55, 10, 11, 47, 47, 11, 46, 11, 12, 46, 46, 70, 47, 12, 71, 46, 13, 60, 12, 91, 21, 62, 92, 30, 62, 20, 21, 91, 21, 22, 62, 62, 22, 92, 22, 23, 92, 92, 23, 57, 23, 24, 57, 24, 63, 57, 24, 25, 63, 57, 29, 92, 92, 29, 30, 57, 63, 29, 25, 58, 63, 25, 26, 58, 63, 58, 28, 63, 28, 29, 28, 58, 27, 58, 26, 27, 18, 19, 17, 17, 19, 56, 56, 19, 20, 20, 91, 56, 31, 32, 93, 91, 62, 31, 62, 30, 31, 12, 60, 54, 60, 13, 55, 93, 61, 14, 61, 55, 14, 60, 55, 35, 54, 60, 36, 60, 35, 36, 36, 37, 54, 16, 17, 56, 56, 93, 15, 56, 91, 93, 93, 32, 61, 61, 32, 33, 61, 33, 55, 33, 34, 55, 55, 34, 35, 93, 91, 31, 46, 71, 53, 12, 54, 71, 53, 40, 41, 53, 71, 40, 40, 71, 39, 71, 54, 39, 39, 37, 38, 39, 54, 37, 5, 72, 75, 5, 75, 4, 75, 72, 69, 4, 75, 3, 75, 69, 3, 3, 76, 2, 76, 89, 2, 89, 90, 2, 90, 1, 2, 69, 74, 3, 74, 69, 68, 69, 59, 68, 59, 51, 68, 59, 43, 51, 3, 74, 76, 74, 64, 76, 74, 68, 64, 76, 87, 89, 76, 64, 87, 51, 67, 68, 68, 67, 64, 64, 94, 87, 64, 67, 94, 43, 44, 51, 90, 88, 83, 80, 83, 81, 87, 88, 89, 88, 90, 89, 87, 81, 88, 87, 82, 81, 87, 94, 82, 83, 88, 81, 81, 82, 80, 51, 66, 67, 51, 44, 66, 67, 65, 94, 94, 77, 82, 94, 86, 77, 94, 65, 86, 1, 90, 84, 82, 77, 80, 84, 90, 83, 77, 79, 80, 84, 83, 79, 83, 80, 79, 67, 66, 65, 77, 78, 79, 77, 86, 78, 78, 86, 85, 79, 78, 84, 78, 85, 84, 85, 0, 1, 85, 86, 65, 0, 85, 65, 65, 66, 0, 1, 84, 85, 44, 45, 66, 66, 45, 0, 72, 59, 69, 47, 52, 48, 48, 49, 8, 48, 52, 49, 8, 49, 7, 52, 73, 49, 49, 73, 7, 7, 73, 6, 73, 52, 50, 50, 52, 42, 52, 70, 42, 73, 50, 6, 6, 50, 5, 50, 72, 5, 50, 42, 72, 72, 42, 59, 59, 42, 43, 10, 47, 9, 47, 48, 9, 9, 48, 8, 47, 70, 52, 46, 53, 70, 70, 41, 42, 70, 53, 41 ], + "vertices": [ 1, 16, 147.48, -145.48, 1, 1, 16, 89.4, -281.62, 1, 1, 16, -28.24, -285.93, 1, 1, 16, -14.58, -194.68, 1, 4, 12, 238.39, -84.13, 0.20851, 15, 32.09999, -140.85, 0.19336, 16, -61.96, -132.26, 0.42115, 35, 129.57, 6.39, 0.17696, 5, 2, 332.7, 63.71, 0.06905, 12, 199.57, -83.03, 0.29424, 15, 3.69, -114.37, 0.2194, 16, -85.43, -101.32, 0.30859, 35, 127.34, -26.64, 0.1087, 5, 2, 307.08, 43.5, 0.11018, 12, 166.95, -82.12999, 0.37282, 15, -20.18, -92.14, 0.24572, 16, -105.18, -75.33999, 0.21862, 35, 123.08, -64.79, 0.05264, 4, 2, 307.75, 5.7, 0.18627, 12, 143.25, -111.59, 0.58009, 15, -57.43, -98.57, 0.12363, 16, -142.98, -75.33, 0.10999, 2, 2, 308.7, -30.55, 0.25, 12, 120.75, -140.04, 0.75, 2, 2, 213.94, -142.7, 0.75, 12, -23.83, -165.45, 0.25, 3, 2, 64.44999, -187.34, 0.31139, 58, -158.45, 158.33, 0.10379, 1, 84.16, -190.98, 0.5848, 1, 1, -61.47, -178.84, 1, 4, 58, 118.47, 114.74, 0.07383, 59, 17.17, 122.49, 0.17504, 60, -100.71, 132.55, 0.06818, 1, -166.91, -67.94999, 0.68294, 4, 58, 170.4, 123.13, 0.06537, 59, 66.71, 104.77, 0.20999, 60, -53.08, 110.21, 0.12016, 1, -217.69, -61.33, 0.60447, 6, 58, 221.11, 131.31, 0.02179, 59, 115.07, 87.47, 0.23058, 60, -6.58, 88.39, 0.16258, 61, -168.92, 31, 0.02826, 62, -282.82, -90.19, 0.029, 1, -267.66, -55.14, 0.52776, 5, 59, 146.51, 86.08, 0.23635, 60, 26.66, 83.39, 0.19338, 61, -134.99, 41.34, 0.06624, 62, -257.52, -60.65, 0.06962, 1, -298.87, -61.99, 0.43436, 5, 59, 178.73, 86.41, 0.22521, 60, 56.68, 81.29, 0.20997, 61, -107.13, 46.31, 0.11271, 62, -232.44, -51.26, 0.12148, 1, -328.68, -69.24, 0.3306, 5, 59, 203.26, 86.51, 0.21603, 60, 83.06, 77.01999, 0.22457, 61, -79.56, 53.53, 0.13939, 62, -210.89, -28.3, 0.15618, 1, -354.01, -75.41, 0.26379, 5, 59, 238.06, 85.41, 0.20114, 60, 115.65, 74.66, 0.2315, 61, -49.53, 60.58, 0.16455, 62, -185.49, -14.98, 0.19123, 1, -385.33, -83.15, 0.21156, 5, 59, 255.33, 78.85, 0.18224, 60, 133.83, 63.18, 0.23194, 61, -27.04, 56.84, 0.18907, 62, -163.58, -5.26, 0.22658, 1, -406.45, -79.89, 0.17015, 5, 59, 275.48, 71.62, 0.16169, 60, 152.97, 53.58, 0.22885, 61, -5.82, 53.94, 0.21292, 62, -142.85, 0.11, 0.26159, 1, -427.72, -77.47, 0.13493, 5, 59, 313.81, 53.61, 0.14198, 60, 188.04, 35.82, 0.22293, 61, 31.84, 49.3, 0.23478, 62, -106.46, 7.49, 0.29326, 1, -465.96, -72.58999, 0.10702, 5, 59, 345.74, 45.54, 0.12502, 60, 219.6, 19.28, 0.2179, 61, 68.31, 43.02, 0.25622, 62, -70.12999, 18.19, 0.32248, 1, -502.09, -68.19, 0.07835, 4, 59, 390.81, 21.3, 0.11758, 60, 261.62, -3.66, 0.22607, 61, 114.55, 37.83, 0.29087, 62, -26.15, 30.34, 0.36547, 4, 59, 423.87, -11.11, 0.10536, 60, 291.46, -39.06, 0.21954, 61, 154.83, 14.99, 0.30098, 62, 19.91, 25.67, 0.37409, 4, 59, 456.68, -43.27, 0.09949, 60, 321.06, -74.19999, 0.21749, 61, 194.79, -7.66, 0.30788, 62, 65.62, 21.04, 0.37513, 4, 59, 480.34, -100.28, 0.10045, 60, 339.2, -133.2, 0.22026, 61, 232.3, -56.69, 0.31103, 62, 119.7, -8.68999, 0.36824, 4, 59, 424.34, -67.51999, 0.10379, 60, 286.57, -95.27, 0.23087, 61, 169.77, -39.4, 0.30828, 62, 55.51, -18.08, 0.35705, 4, 59, 387.08, -53.84, 0.11505, 60, 250.77, -78.11, 0.2454, 61, 130.24, -35.75, 0.30092, 62, 17.87, -30.67, 0.3386, 4, 59, 346.04, -38.78, 0.13471, 60, 211.34, -59.22, 0.26271, 61, 86.7, -31.72, 0.2888, 62, -23.59, -44.54, 0.31376, 5, 58, 449.17, 125.97, 0.02419, 59, 311.45, -35.25, 0.16384, 60, 175.89, -56.83, 0.2727, 61, 51.53, -43.14, 0.26317, 62, -52.88, -67.87, 0.27607, 5, 58, 418.38, 93.72, 0.05913, 59, 269.72, -40.64, 0.19681, 60, 135.19, -53.82, 0.27688, 61, 13.42, -53.11, 0.23219, 62, -82.03, -93.66, 0.23497, 5, 58, 390.82, 86.58, 0.10638, 59, 241.19, -39.8, 0.2354, 60, 105.59, -52.93, 0.27331, 61, -16.25, -62.16, 0.19459, 62, -108.34, -111.24, 0.19028, 5, 58, 364.8, 62.48, 0.14347, 59, 207.71, -42.14, 0.28099, 60, 73.33, -49.43, 0.26867, 61, -46.11, -70.49, 0.15764, 62, -129.51, -133.56, 0.1492, 5, 58, 345.49, 47.53, 0.18499, 59, 182.34, -50.62, 0.33114, 60, 45.87, -56.62, 0.25881, 61, -71.57, -84.96, 0.1174, 62, -150.85, -153.35, 0.10763, 5, 58, 319.95, 15.15, 0.23755, 59, 145.6, -61.95, 0.39396, 60, 9.60999, -63.26, 0.24619, 61, -101.06, -105.58, 0.06443, 62, -165.65, -187.83, 0.05784, 3, 58, 276.58, -30.61, 0.29942, 59, 85.52, -81.11, 0.46774, 60, -52.01, -76.62, 0.23283, 3, 58, 214.5, -70.36, 0.32855, 59, 11.97, -85.98, 0.48601, 60, -125.69, -74.48, 0.18543, 2, 58, 147.14, -113.5, 0.59565, 59, -67.83999, -91.26, 0.40433, 2, 2, -113.14, 135.84, 0.24192, 58, 91.72, -112.59, 0.75807, 2, 2, -42.12, 116.77, 0.14515, 58, 18.2, -111.17, 0.85484, 1, 2, 44.2, 107.1, 1, 2, 2, 140.09, 96.35, 0.22579, 12, 72.58999, 65.41, 0.7742, 4, 2, 137.69, 169.35, 0.05644, 12, 117.5, 123, 0.24355, 15, 78.3, 94.48, 0.2125, 16, 23.7, 91.74, 0.4875, 2, 15, 171.15, 111.98, 0.25, 16, 118.17, 93.15, 0.75, 1, 16, 158.96, -25.58, 1, 1, 1, -40.63, -86.01, 1, 3, 2, 67.33999, -86.66, 0.33215, 58, -137.02, 59.92, 0.08303, 1, 92.54, -90.61, 0.5848, 2, 2, 170.13, -66.29, 0.75, 12, -8.53, -78.72, 0.25, 2, 2, 231.74, -8.12, 0.4, 12, 76.03, -73.51999, 0.6, 4, 2, 222.04, 70.41, 0.17551, 12, 118.9, -7, 0.55823, 15, -6.58, -3.99, 0.17739, 16, -76.73, 9.18, 0.08884, 1, 16, 50.43, -46.56, 1, 1, 12, -9.88, 20.65, 1, 2, 2, -53.22, 20.53, 0.2, 58, 5.8, -15.09, 0.8, 3, 2, -180.71, 32.22, 0.08564, 58, 132.35, 4.23999, 0.56215, 59, -23.98, 19.01, 0.35219, 3, 58, 246.39, 57.53, 0.30273, 59, 101.61, 10.65, 0.46989, 60, -27.28, 13.2, 0.22737, 5, 58, 346.99, 126.85, 0.13479, 59, 223.17, 22.83, 0.28279, 60, 94.88, 13.77, 0.24481, 61, -47.85, -3.72, 0.17322, 62, -158.02, -73.16, 0.16438, 4, 59, 367.51, -9.96, 0.14656, 60, 235.45, -32.57, 0.23073, 61, 100.06, 1.62, 0.29607, 62, -24.81, -8.63, 0.32661, 4, 59, 440.24, -55.6, 0.10821, 60, 303.52, -84.91, 0.21897, 61, 182.07, -23.8, 0.31097, 62, 60.48, 1.14, 0.36182, 3, 12, 174.99, 22.22, 0.2, 15, 54.82, -19.14, 0.6, 16, -18.79999, -16.2, 0.2, 3, 58, 189.25, 30.83, 0.33253, 59, 38.68, 14.84, 0.48076, 60, -89.52, 23.34, 0.18669, 5, 58, 295.08, 91.08, 0.22891, 59, 160.45, 16.54, 0.38754, 60, 31.85, 13.48, 0.2306, 61, -106.86, -25.89, 0.08042, 62, -203.08, -117.24, 0.0725, 5, 58, 414.43, 146.25, 0.07359, 59, 291.61, 7.27, 0.20198, 60, 161.53, -8.2, 0.23762, 61, 22.27, -1.17999, 0.24024, 62, -94.86, -42.56, 0.24654, 4, 59, 404.01, -32.87, 0.12351, 60, 269.61, -58.84, 0.22261, 61, 141.21, -11.13, 0.30609, 62, 17.98, -3.72, 0.34777, 1, 16, 26.4, -166.06, 1, 1, 16, 87.21, -106.12, 1, 1, 16, 108.19, -49.62, 1, 2, 16, 61.73, -82.12999, 0.50021, 35, 4.42, 52.83, 0.49978, 2, 16, 22.84, -109.4, 0.50021, 35, 51.52, 46.73, 0.49978, 4, 12, 247.12, -50.52, 0.06545, 15, 60.86, -121.4, 0.06069, 16, -30.3, -118, 0.49079, 35, 96.58, 17.21999, 0.38305, 1, 2, 26.73, 14.8, 1, 2, 2, -107.97, 25.67, 0.24192, 58, 60.17, -6.91, 0.75807, 4, 2, 235.53, 102.96, 0.0761, 12, 150.1, 9.35, 0.35533, 15, 27.64, -12.34, 0.41675, 16, -44.43, -4.87, 0.1518, 3, 2, 227.15, 28.49, 0.31015, 12, 95.96, -42.46, 0.60548, 15, -47.23, -15.44, 0.08435, 2, 16, 5.19, -153.1, 0.87618, 35, 90.96, 71.21, 0.12381, 4, 12, 243.13, -60.59, 0.10669, 15, 51.21, -126.33, 0.09893, 16, -40.65, -121.21, 0.47072, 35, 105.71, 17.33, 0.32363, 1, 16, 23.69, -185.21, 1, 1, 16, 79.64, -175.94, 1, 1, 16, 93.96, -187.56, 1, 1, 16, 87.07, -206.55, 1, 1, 16, 64.19999, -216.74, 1, 1, 16, 52.23, -203.68, 1, 1, 16, 59.24, -187.03, 1, 1, 16, 64.26, -223.8, 1, 1, 16, 89.44, -211.41, 1, 1, 16, 102.04, -186.95, 1, 1, 16, 83.1, -166.14, 1, 1, 16, 46.84, -186.41, 1, 1, 16, 50.32, -204.36, 1, 1, 16, 41.7, -206.59, 1, 1, 16, 61.87, -230.97, 1, 5, 58, 374.97, 143.6, 0.10291, 59, 256.29, 17.42, 0.23985, 60, 127.43, 2.07, 0.2431, 61, -13.35, -3.05, 0.20854, 62, -128.14, -55.46, 0.20557, 4, 59, 327.21, 4.42, 0.17789, 60, 196.28, -19.32, 0.24248, 61, 58.71, -1.04999, 0.28055, 62, -62.24, -26.21, 0.29905, 5, 58, 318.32, 113.62, 0.17774, 59, 192.26, 20.14, 0.33383, 60, 64.19, 12.44, 0.24171, 61, -76.55, -13.67, 0.12849, 62, -182.56, -89.31, 0.11821, 2, 16, 56.98, -162.99, 0.89259, 35, 57.54, 112, 0.1074 ], + "hull": 46, + "edges": [ 22, 20, 20, 18, 18, 16, 6, 4, 4, 2, 90, 88, 54, 52, 52, 50, 24, 22, 88, 86, 86, 84, 8, 6, 24, 26, 26, 28, 72, 74, 74, 76, 70, 72, 46, 48, 48, 50, 54, 56, 56, 58, 80, 82, 82, 84, 76, 78, 78, 80, 8, 10, 10, 12, 12, 14, 14, 16, 0, 90, 0, 2, 62, 64, 64, 66, 40, 42, 58, 60, 60, 62, 42, 44, 44, 46, 66, 68, 68, 70, 32, 34, 34, 36, 52, 116, 116, 126, 126, 114, 114, 184, 184, 124, 124, 182, 182, 112, 112, 186, 186, 122, 122, 110, 110, 120, 120, 108, 108, 142, 142, 106, 106, 140, 140, 104, 92, 94, 94, 96, 96, 98, 98, 146, 146, 100, 100, 144, 144, 118, 118, 102, 8, 150, 150, 138, 138, 136, 136, 134, 134, 132, 156, 154, 154, 164, 164, 162, 162, 160, 160, 158, 158, 156, 180, 178, 178, 174, 174, 188, 188, 172, 170, 168, 28, 30, 30, 32, 36, 38, 38, 40 ], + "width": 1219, + "height": 570 } }, "raptor_front_arm": { "raptor_front_arm": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.39562, 0.1396, 0.3877, 0.30212, 0.3123, 0.41784, 0.27287, 0.47835, 0.33388, 0.4507, 0.54879, 0.35328, 0.64092, 0.31152, 0.73024, 0.36529, 1, 0.5277, 1, 0.86606, 0.93242, 1, 0.86176, 0.80967, 0.75576, 0.99765, 0.71748, 1, 0.70276, 0.77442, 0.62031, 0.73448, 0.58792, 0.64519, 0.53561, 0.6582, 0.13448, 0.75798, 0, 0.69218, 0.01846, 0.56357, 0.05498, 0.30917, 0, 0.27863, 0, 0.12423, 0, 0, 0.19596, 0, 0.40242, 0, 0.24536, 0.1924, 0.21678, 0.0811 ], - "triangles": [ 0, 28, 26, 23, 25, 28, 28, 25, 26, 23, 24, 25, 6, 7, 16, 6, 16, 5, 15, 16, 7, 7, 14, 15, 8, 14, 7, 11, 14, 8, 11, 8, 9, 12, 14, 11, 13, 14, 12, 10, 11, 9, 17, 4, 5, 16, 17, 5, 18, 19, 3, 18, 3, 4, 18, 4, 17, 27, 28, 0, 27, 22, 23, 27, 23, 28, 1, 27, 0, 21, 22, 27, 21, 27, 1, 2, 21, 1, 2, 20, 21, 3, 20, 2, 19, 20, 3 ], - "vertices": [ 2, 15, 3.06, 31.88, 0.51075, 14, 66.56, -109.48, 0.48924, 1, 15, 35.87, 35.62, 1, 2, 15, 60.94, 27.12, 0.8464, 29, 46.49, 31.12, 0.15359, 3, 15, 74.05, 22.67, 0.34375, 29, 36.5, 21.53, 0.64062, 45, -45.25, -29.96, 0.01562, 3, 15, 67, 31.58, 0.10937, 29, 47.66, 23.68, 0.78125, 45, -40.93, -19.44, 0.10937, 3, 15, 42.17, 62.99, 0.01562, 29, 86.98, 31.24, 0.64062, 45, -25.75, 17.61, 0.34375, 2, 29, 103.83, 34.49, 0.34375, 45, -19.24, 33.49, 0.65625, 2, 29, 114.04, 19.51, 0.10937, 45, -1.11, 33.84, 0.89062, 2, 29, 144.85, -25.73, 0.02083, 45, 53.62, 34.88, 0.97916, 1, 45, 96.03, -19.16, 1, 1, 45, 104.2, -47.31, 1, 1, 45, 71.34, -23.98, 1, 1, 45, 81.39, -64.61, 1, 1, 45, 76.8, -68.81, 1, 2, 29, 83.18, -57.72, 0.02083, 45, 46.65, -34.25, 0.97916, 2, 29, 73.13, -45.76, 0.10937, 45, 31.14, -36.12, 0.89062, 2, 29, 73.98, -26.9, 0.34375, 45, 15.82, -25.09, 0.65625, 3, 15, 103.67, 70.28, 0.01562, 29, 65.1, -26.69, 0.64062, 45, 10.78, -32.41, 0.34375, 3, 15, 133.56, 9.13, 0.10937, 29, -2.94, -25.03, 0.78125, 45, -27.84, -88.47, 0.10937, 3, 15, 123.67, -14.42, 0.34375, 29, -19.29, -5.39, 0.64062, 45, -53.23, -91.41, 0.01562, 2, 15, 97.41, -15.43, 0.8464, 29, -8.08, 18.37, 0.15359, 1, 15, 45.46, -17.43, 1, 2, 15, 40.69, -27.17, 0.45035, 14, -1.69, -93.8, 0.54964, 2, 15, -2.74, -29.63, 0.44352, 14, 18.99, -72.93, 0.55647, 1, 14, 32.11, -48.45, 1, 1, 14, 57.56, -67.43, 1, 1, 14, 84.38, -87.42, 1, 2, 15, 16.44, 5.21, 0.7182, 14, 46.31, -101.86, 0.28179, 2, 15, -4.51, 5.32, 0.48851, 14, 52.82, -81.94, 0.51148 ], - "hull": 27 + "triangles": [ 23, 24, 25, 28, 25, 26, 23, 25, 28, 0, 28, 26, 10, 11, 9, 13, 14, 12, 12, 14, 11, 11, 8, 9, 11, 14, 8, 8, 14, 7, 7, 14, 15, 15, 16, 7, 6, 16, 5, 6, 7, 16, 18, 4, 17, 18, 3, 4, 18, 19, 3, 16, 17, 5, 17, 4, 5, 19, 20, 3, 3, 20, 2, 2, 20, 21, 2, 21, 1, 21, 27, 1, 21, 22, 27, 1, 27, 0, 27, 23, 28, 27, 22, 23, 27, 28, 0 ], + "vertices": [ 2, 13, 3.06, 31.88, 0.51075, 12, 66.56, -109.48, 0.48924, 1, 13, 35.87, 35.62, 1, 2, 13, 60.94, 27.12, 0.8464, 14, 46.49, 31.12, 0.15358, 2, 13, 74.05, 22.67, 0.3492, 14, 36.5, 21.53, 0.65078, 3, 13, 67, 31.58, 0.10937, 14, 47.66, 23.68, 0.78125, 27, -40.93, -19.44, 0.10937, 2, 14, 86.98, 31.24, 0.65078, 27, -25.75, 17.61, 0.3492, 2, 14, 103.83, 34.49, 0.34375, 27, -19.24, 33.49, 0.65625, 2, 14, 114.04, 19.51, 0.10937, 27, -1.11, 33.84, 0.89062, 1, 27, 53.62, 34.88, 1, 1, 27, 96.03, -19.16, 1, 1, 27, 104.2, -47.31, 1, 1, 27, 71.33999, -23.98, 1, 1, 27, 81.39, -64.61, 1, 1, 27, 76.8, -68.81, 1, 1, 27, 46.65, -34.25, 1, 2, 14, 73.12999, -45.76, 0.10937, 27, 31.14, -36.12, 0.89062, 2, 14, 73.98, -26.9, 0.34375, 27, 15.82, -25.09, 0.65625, 2, 14, 65.1, -26.69, 0.65078, 27, 10.78, -32.41, 0.3492, 3, 13, 133.56, 9.13, 0.10937, 14, -2.94, -25.03, 0.78125, 27, -27.84, -88.47, 0.10937, 2, 13, 123.67, -14.42, 0.3492, 14, -19.29, -5.39, 0.65078, 2, 13, 97.41, -15.43, 0.8464, 14, -8.08, 18.37, 0.15358, 1, 13, 45.46, -17.43, 1, 2, 13, 40.68999, -27.17, 0.45035, 12, -1.69, -93.8, 0.54964, 2, 13, -2.74, -29.63, 0.44352, 12, 18.99, -72.93, 0.55646, 1, 12, 32.11, -48.45, 1, 1, 12, 57.56, -67.43, 1, 1, 12, 84.38, -87.42, 1, 2, 13, 16.44, 5.21, 0.7182, 12, 46.31, -101.86, 0.28178, 2, 13, -4.51, 5.32, 0.48851, 12, 52.82, -81.94, 0.51147 ], + "hull": 27, + "edges": [ 38, 36, 32, 30, 30, 28, 28, 26, 24, 26, 24, 22, 22, 20, 20, 18, 18, 16, 44, 42, 38, 6, 38, 40, 40, 42, 6, 4, 4, 2, 40, 4, 8, 6, 36, 8, 32, 12, 42, 2, 52, 0, 0, 2, 16, 14, 14, 12, 30, 14, 36, 34, 34, 32, 12, 10, 10, 8, 34, 10, 48, 50, 50, 52, 44, 46, 46, 48, 50, 56, 56, 54 ], + "width": 162, + "height": 203 } }, "raptor_front_leg": { "raptor_front_leg": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.55116, 0.17817, 0.6279, 0.36027, 0.6671, 0.4533, 0.64879, 0.51527, 0.53553, 0.56893, 0.32335, 0.66946, 0.28674, 0.72086, 0.32538, 0.804, 0.36258, 0.80144, 0.42056, 0.79744, 0.61015, 0.78435, 0.84813, 0.84028, 1, 0.93854, 0.62439, 0.91738, 0.72812, 1, 0.58574, 1, 0.36707, 0.96667, 0.26306, 0.95082, 0.16266, 0.93552, 0.03859, 0.72237, 0, 0.66946, 0.0374, 0.62999, 0.1647, 0.49562, 0.23731, 0.4568, 0.27019, 0.43923, 0.28063, 0.43364, 0.223, 0.4057, 0.12565, 0.35851, 0, 0.29759, 0, 0.1524, 0, 0, 0.32132, 0, 0.32222, 0.22778, 0.4493, 0.38031, 0.47664, 0.44361, 0.4615, 0.47375, 0.35106, 0.53247, 0.20091, 0.65256, 0.18527, 0.72148, 0.25222, 0.86314, 0.30941, 0.88124, 0.55694, 0.89613, 0.55857, 0.89207, 0.47493, 0.85339, 0.6059, 0.91526, 0.39705, 0.89129, 0.13229, 0.09352, 0.36997, 0.45345, 0.37163, 0.43827, 0.32515, 0.39424, 0.23759, 0.34425, 0.34065, 0.47414 ], - "triangles": [ 46, 30, 31, 43, 9, 10, 42, 43, 10, 41, 43, 42, 13, 44, 42, 10, 13, 42, 11, 13, 10, 13, 11, 12, 45, 8, 9, 45, 9, 43, 40, 8, 45, 41, 42, 44, 45, 43, 41, 45, 41, 44, 16, 40, 45, 17, 40, 16, 15, 45, 44, 16, 45, 15, 14, 15, 44, 13, 14, 44, 19, 21, 38, 20, 21, 19, 39, 38, 6, 39, 6, 7, 40, 39, 7, 40, 7, 8, 18, 19, 38, 18, 38, 39, 17, 39, 40, 18, 39, 17, 47, 25, 48, 24, 25, 47, 35, 48, 34, 47, 48, 35, 51, 24, 47, 23, 24, 51, 3, 34, 2, 35, 34, 3, 36, 51, 47, 23, 51, 36, 22, 23, 36, 36, 47, 35, 4, 35, 3, 36, 35, 4, 37, 22, 36, 21, 22, 37, 5, 37, 36, 5, 36, 4, 6, 37, 5, 38, 21, 37, 38, 37, 6, 29, 30, 46, 32, 31, 0, 46, 31, 32, 28, 29, 46, 28, 46, 32, 32, 27, 28, 50, 27, 32, 33, 32, 0, 33, 0, 1, 49, 50, 32, 33, 49, 32, 26, 27, 50, 26, 50, 49, 25, 26, 49, 48, 49, 33, 25, 49, 48, 34, 33, 1, 48, 33, 34, 34, 1, 2 ], - "vertices": [ 3, 4, 128.03, 88.47, 0.83908, 10, -70.2, -134.13, 0.01331, 2, 158.83, -71.91, 0.1476, 2, 4, 219.55, 53.15, 0.77988, 10, -48.04, -38.58, 0.22011, 3, 4, 266.3, 35.1, 0.53531, 10, -36.73, 10.22, 0.46443, 30, 127.25, 245.46, 2.4E-4, 4, 4, 286.89, 9.79, 0.35076, 10, -14.56, 34.14, 0.64667, 30, 125.69, 212.88, 0.0023, 44, 101.39, 199.13, 2.5E-4, 4, 4, 281.54, -41.24, 0.09169, 10, 36.71, 36, 0.90196, 30, 87.64, 178.44, 0.00513, 44, 58.29, 171.29, 0.00119, 5, 4, 271.53, -136.86, 0.05608, 10, 132.77, 39.48, 0.69232, 16, 34.99, 78.76, 0.22087, 30, 16.38, 113.93, 0.0224, 44, -22.45, 119.13, 0.0083, 5, 4, 283.51, -164.25, 0.01987, 10, 158.21, 55.17, 0.50334, 16, 52.65, 54.63, 0.3617, 30, 7.01, 85.54, 0.08322, 44, -36.28, 92.63, 0.03184, 6, 4, 326.15, -179.3, 0.00798, 10, 167.14, 99.49, 0.21327, 16, 97.55, 49.25, 0.35075, 30, 28.72, 45.87, 0.14107, 44, -21.26, 49.99, 0.22311, 60, -72.29, 25.96, 0.0638, 6, 4, 333.96, -167.35, 0.00242, 10, 154.22, 105.55, 0.07519, 16, 102.57, 62.6, 0.22995, 30, 42.51, 49.55, 0.2831, 44, -7.06, 51.39, 0.2694, 60, -58.17, 28.03, 0.13992, 6, 4, 344.19, -149.68, 4.9E-4, 10, 134.24, 114.44, 0.0176, 16, 109.72, 83.39, 0.11397, 30, 64.09, 55.23, 0.07976, 44, 15.12, 53.51, 0.36292, 60, -36.09, 31.19, 0.42523, 1, 60, 35.8, 41.81, 1, 1, 60, 128.11, 17.93, 1, 1, 60, 188.72, -29.42, 1, 1, 60, 44.86, -26.17, 1, 1, 44, 133.17, -49.83, 1, 1, 44, 78.78, -50.15, 1, 5, 4, 399.32, -220.02, 2.2E-4, 10, 195.56, 179.43, 0.01703, 16, 179.46, 27.52, 0.2372, 30, 58.34, -33.93, 0.2023, 44, -4.91, -33.55, 0.54324, 5, 4, 370.41, -244.91, 3.2E-4, 10, 225.9, 152.49, 0.02513, 16, 155.04, -5.13, 0.35003, 30, 17.88, -32.5, 0.29852, 44, -44.62, -25.61, 0.32598, 5, 4, 340.37, -270.04, 0.00251, 10, 254.98, 126.27, 0.10129, 16, 131.21, -36.2, 0.54075, 30, -21.24, -31.17, 0.2082, 44, -83.02, -17.97, 0.14723, 5, 4, 225.1, -238.94, 0.01529, 10, 240.33, 7.81, 0.24036, 16, 11.94, -30.98, 0.57881, 30, -86.31, 68.9, 0.12023, 44, -131.06, 91.29, 0.04528, 5, 4, 194.64, -233.55, 0.04819, 10, 239.26, -23.1, 0.40427, 16, -18.96, -32.37, 0.48451, 30, -105.4, 93.25, 0.04604, 44, -145.97, 118.4, 0.01697, 5, 4, 187.65, -209.73, 0.09565, 10, 216.66, -33.35, 0.57617, 16, -30.97, -10.65, 0.30651, 30, -94.71, 115.65, 0.01788, 44, -131.8, 138.78, 0.00376, 4, 4, 163.85, -128.67, 0.19533, 10, 139.75, -68.26, 0.8011, 30, -58.32, 191.88, 0.00327, 44, -83.58, 208.13, 2.9E-4, 4, 4, 165.74, -94.49, 0.31921, 10, 105.59, -71.26, 0.6795, 30, -5.04, 220.72, 0.00117, 44, -56.32, 275.96, 1.0E-4, 4, 4, 166.39, -79.07, 0.46205, 10, 90.23, -72.76, 0.53752, 30, 5.55, 230.48, 3.9E-4, 44, -40.61, 286.16, 2.0E-5, 3, 4, 166.49, -74.17, 0.53779, 10, 85.42, -73.28, 0.46208, 30, -19.99, 230.7, 1.2E-4, 2, 4, 141.54, -82.46, 0.73138, 10, 97.13, -96.82, 0.26861, 3, 4, 99.76, -97.08, 0.81379, 10, 117.34, -136.23, 0.13997, 2, -2.56, -164.19, 0.04623, 3, 4, 45.01, -114.56, 0.8186, 10, 142.41, -187.89, 0.02098, 2, -51.09, -135.29, 0.1604, 3, 4, -16.2, -74.76, 0.62389, 10, 113.82, -253.08, 0.00952, 2, -42.95, -58.38, 0.36658, 2, 4, -74.73, -19.33, 0.31468, 2, -52.66, 17.55, 0.68531, 2, 4, 1.67, 76.75, 0.25576, 2, 70.07, 18.78, 0.74423, 1, 4, 93.54, 4.13, 1, 2, 4, 185.14, -6.66, 0.75461, 10, 15.98, -64.27, 0.24538, 2, 4, 217.11, -18.75, 0.50845, 10, 23.47, -30.93, 0.49154, 3, 4, 225.63, -32.92, 0.32512, 10, 36.3, -20.5, 0.6744, 30, 51.57, 221.95, 4.7E-4, 4, 4, 223, -84.73, 0.20061, 10, 87.96, -15.86, 0.79287, 30, 15.03, 185.13, 0.00581, 44, -12.28, 189.61, 6.9E-4, 5, 4, 235.61, -168.06, 0.07777, 10, 168.69, 8.29, 0.54931, 16, 6.74, 40.47, 0.33413, 30, -31.18, 114.66, 0.0321, 44, -69.27, 127.55, 0.00667, 5, 4, 259.63, -194.79, 0.01921, 10, 191.79, 35.8, 0.30498, 16, 36, 19.62, 0.53642, 30, -31.14, 78.74, 0.09568, 44, -75.03, 92.09, 0.04369, 5, 4, 332.55, -220.1, 0.00292, 10, 206.64, 111.53, 0.10776, 16, 112.69, 10.82, 0.51915, 30, 6.25, 11.23, 0.23449, 44, -49.03, 19.43, 0.13566, 4, 10, 192.51, 130.62, 0.03213, 16, 130.6, 26.41, 0.33941, 30, 29.35, 5.71, 0.27333, 44, -27.12, 10.25, 0.35511, 1, 44, 67.46, 3.16, 1, 1, 60, 19.07, -14.51, 1, 6, 4, 381.55, -150.4, 3.0E-4, 10, 130.71, 150.34, 0.00811, 16, 145.36, 89.53, 0.04102, 30, 89.29, 30.41, 0.02558, 44, 36, 24.95, 0.37636, 60, -13.89, 3.64, 0.54861, 1, 44, 86.23, -6.55, 1, 4, 10, 164.9, 153.55, 0.02263, 16, 151.18, 56, 0.23908, 30, 65.44, 5.55, 0.19254, 44, 8.45, 4.27, 0.54574, 2, 4, -9.28, -17.5, 0.59606, 2, 7.72, -30.85, 0.40393, 3, 4, 195.9, -53.81, 0.42356, 10, 61.11, -47.06, 0.57613, 30, 39.7, 225.21, 2.9E-4, 3, 4, 190.1, -48.45, 0.53227, 10, 56.61, -53.56, 0.46765, 30, 39.83, 233.12, 6.0E-5, 2, 4, 161.26, -48.26, 0.79873, 10, 60.44, -82.13, 0.20126, 3, 4, 120.37, -58.54, 0.8485, 10, 76.31, -121.18, 0.14441, 2, 41.04, -161.4, 0.00707, 4, 4, 197.37, -69.23, 0.33487, 10, 76.17, -43.46, 0.66324, 30, 30.34, 213.88, 0.0017, 44, -9.09, 262.42, 1.8E-4 ], - "hull": 32 + "triangles": [ 46, 30, 31, 13, 44, 42, 13, 11, 12, 11, 13, 10, 10, 13, 42, 41, 43, 42, 42, 43, 10, 43, 9, 10, 41, 42, 44, 45, 43, 41, 45, 9, 43, 15, 44, 13, 45, 41, 44, 15, 45, 44, 16, 45, 15, 17, 40, 16, 16, 40, 45, 45, 40, 8, 45, 8, 9, 14, 15, 13, 18, 39, 17, 17, 39, 40, 18, 38, 39, 18, 19, 38, 40, 7, 8, 40, 39, 7, 39, 6, 7, 39, 38, 6, 20, 21, 19, 19, 21, 38, 38, 37, 6, 38, 21, 37, 6, 37, 5, 5, 36, 4, 5, 37, 36, 36, 23, 51, 36, 37, 23, 21, 22, 37, 37, 22, 23, 36, 35, 4, 4, 35, 3, 36, 47, 35, 36, 51, 47, 35, 34, 3, 3, 34, 2, 23, 24, 51, 51, 24, 47, 47, 48, 35, 35, 48, 34, 24, 25, 47, 47, 25, 48, 34, 1, 2, 48, 33, 34, 34, 33, 1, 25, 49, 48, 48, 49, 33, 25, 26, 49, 26, 50, 49, 26, 27, 50, 33, 49, 32, 49, 50, 32, 33, 0, 1, 33, 32, 0, 50, 27, 46, 32, 50, 46, 46, 27, 28, 28, 29, 46, 46, 31, 32, 32, 31, 0, 29, 30, 46 ], + "vertices": [ 2, 20, 128.03, 88.47, 0.8504, 1, 158.83, -71.91, 0.14959, 2, 20, 219.55, 53.15, 0.77988, 21, -48.04, -38.58, 0.22011, 2, 20, 266.3, 35.09999, 0.53544, 21, -36.73, 10.22, 0.46455, 2, 20, 286.89, 9.79, 0.35166, 21, -14.56, 34.14, 0.64832, 2, 20, 281.54, -41.24, 0.09228, 21, 36.71, 36, 0.90771, 3, 20, 271.53, -136.86, 0.05786, 21, 132.77, 39.48, 0.71425, 22, 34.99, 78.76, 0.22787, 3, 21, 158.21, 55.17, 0.5308, 22, 52.65, 54.63, 0.38143, 23, 7.01, 85.54, 0.08776, 5, 21, 167.14, 99.49, 0.21498, 22, 97.55, 49.25, 0.35357, 23, 28.72, 45.87, 0.14219, 24, -21.26, 49.99, 0.22491, 25, -72.29, 25.96, 0.06431, 5, 21, 154.22, 105.55, 0.07537, 22, 102.57, 62.6, 0.23051, 23, 42.51, 49.55, 0.28379, 24, -7.06, 51.39, 0.27004, 25, -58.17, 28.03, 0.14026, 4, 22, 109.72, 83.39, 0.11607, 23, 64.08999, 55.23, 0.08123, 24, 15.12, 53.51, 0.36961, 25, -36.09, 31.19, 0.43307, 1, 25, 35.8, 41.81, 1, 1, 25, 128.11, 17.93, 1, 1, 25, 188.72, -29.42, 1, 2, 24, 93.29, -7.6, 0.47999, 25, 44.86, -26.17, 0.52, 2, 24, 133.17, -49.83, 0.776, 25, 86.69, -66.47, 0.22399, 2, 24, 78.78, -50.15, 0.76799, 25, 32.38, -69.36, 0.232, 1, 24, -4.91, -33.55, 1, 3, 22, 155.04, -5.13, 0.35917, 23, 17.87999, -32.5, 0.30632, 24, -44.62, -25.61, 0.33449, 4, 21, 254.98, 126.27, 0.10154, 22, 131.21, -36.2, 0.54211, 23, -21.24, -31.17, 0.20873, 24, -83.01999, -17.96999, 0.1476, 3, 21, 240.33, 7.81, 0.25586, 22, 11.94, -30.98, 0.61614, 23, -86.31, 68.9, 0.12797, 2, 21, 239.26, -23.1, 0.45486, 22, -18.95999, -32.37, 0.54513, 3, 20, 187.65, -209.73, 0.09777, 21, 216.66, -33.34999, 0.58892, 22, -30.97, -10.65, 0.3133, 2, 20, 163.85, -128.67, 0.19603, 21, 139.75, -68.26, 0.80396, 2, 20, 165.74, -94.49, 0.31962, 21, 105.59, -71.26, 0.68037, 2, 20, 166.39, -79.07, 0.46225, 21, 90.23, -72.76, 0.53774, 2, 20, 166.49, -74.17, 0.53785, 21, 85.42, -73.28, 0.46213, 2, 20, 141.54, -82.46, 0.73138, 21, 97.13, -96.82, 0.26861, 2, 20, 99.76, -97.08, 0.85324, 21, 117.34, -136.23, 0.14675, 2, 20, 45.01, -114.56, 0.83615, 1, -51.09, -135.29, 0.16384, 2, 20, -16.2, -74.76, 0.62989, 1, -42.95, -58.38, 0.3701, 2, 20, -74.73, -19.33, 0.31468, 1, -52.66, 17.54999, 0.68531, 2, 20, 1.67, 76.75, 0.25576, 1, 70.07, 18.78, 0.74423, 1, 20, 93.54, 4.13, 1, 2, 20, 185.14, -6.66, 0.75461, 21, 15.98, -64.26999, 0.24538, 2, 20, 217.11, -18.75, 0.50844, 21, 23.47, -30.93, 0.49154, 2, 20, 225.63, -32.91999, 0.32527, 21, 36.3, -20.5, 0.67472, 2, 20, 223, -84.73, 0.20192, 21, 87.96, -15.86, 0.79807, 3, 20, 235.61, -168.06, 0.0809, 21, 168.69, 8.29, 0.57147, 22, 6.74, 40.47, 0.34761, 3, 21, 191.79, 35.8, 0.32545, 22, 36, 19.62, 0.57243, 23, -31.14, 78.74, 0.10211, 4, 21, 206.64, 111.53, 0.10808, 22, 112.69, 10.82, 0.52067, 23, 6.25, 11.23, 0.23517, 24, -49.03, 19.43, 0.13606, 3, 22, 130.6, 26.41, 0.35067, 23, 29.35, 5.71, 0.28241, 24, -27.12, 10.25, 0.3669, 2, 24, 67.46, 3.16, 0.384, 25, 18.54999, -16.62999, 0.61599, 1, 25, 19.07, -14.51, 1, 2, 24, 36, 24.95, 0.384, 25, -13.89, 3.64, 0.61599, 2, 24, 86.23, -6.55, 0.48799, 25, 37.75, -25.46, 0.512, 4, 21, 164.9, 153.55, 0.02263, 22, 151.18, 56, 0.23908, 23, 65.44, 5.55, 0.19254, 24, 8.45, 4.27, 0.54574, 2, 20, -9.28, -17.5, 0.59605, 1, 7.72, -30.85, 0.40393, 2, 20, 195.9, -53.81, 0.42368, 21, 61.11, -47.06, 0.5763, 2, 20, 190.1, -48.45, 0.53231, 21, 56.61, -53.56, 0.46768, 2, 20, 161.26, -48.26, 0.79873, 21, 60.44, -82.12999, 0.20126, 2, 20, 120.37, -58.54, 0.85455, 21, 76.31, -121.18, 0.14544, 2, 20, 197.37, -69.23, 0.3355, 21, 76.17, -43.46, 0.66449 ], + "hull": 32, + "edges": [ 40, 38, 38, 36, 28, 30, 28, 26, 26, 24, 24, 22, 22, 20, 14, 12, 12, 10, 6, 4, 60, 62, 0, 62, 40, 42, 42, 44, 34, 36, 16, 14, 52, 50, 4, 2, 2, 0, 10, 8, 8, 6, 72, 74, 74, 76, 76, 78, 78, 80, 80, 90, 90, 88, 16, 18, 18, 20, 30, 32, 32, 34, 56, 58, 58, 60, 94, 96, 96, 98, 52, 54, 54, 56, 100, 98, 48, 50, 44, 46, 46, 48, 102, 94, 72, 70, 70, 68, 66, 68, 66, 64, 64, 92, 86, 84, 50, 96, 94, 48, 46, 102, 52, 98, 54, 100, 70, 6, 68, 4, 66, 2, 72, 8, 86, 20, 86, 82, 82, 88, 84, 26, 88, 26 ], + "width": 382, + "height": 514 } }, "raptor_hindleg_back": { "raptor_hindleg_back": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.45041, 0.09352, 0.56933, 0.23361, 0.65294, 0.47296, 0.66353, 0.50822, 0.63174, 0.54254, 0.32383, 0.69723, 0.30068, 0.73875, 0.27934, 0.77704, 0.30417, 0.83513, 0.31058, 0.85014, 0.341, 0.85046, 0.45165, 0.85163, 0.59555, 0.81881, 0.91176, 0.92548, 1, 1, 0.56336, 0.96426, 0.48349, 0.9826, 0.29878, 0.98027, 0.22808, 0.98389, 0.15997, 0.98737, 0.15423, 0.95546, 0.13894, 0.87047, 0.07371, 0.78726, 0, 0.75299, 0, 0.7049, 0, 0.671, 0.11875, 0.64652, 0.16535, 0.52659, 0.28495, 0.47397, 0.2901, 0.45773, 0.29427, 0.4446, 0.20635, 0.40396, 0.06128, 0.33691, 0, 0.25247, 0, 0, 0.30793, 0, 0.27599, 0.20261, 0.40397, 0.31121, 0.48439, 0.45963, 0.48317, 0.48383, 0.47029, 0.51062, 0.22698, 0.67328, 0.17141, 0.7242, 0.17122, 0.78241, 0.22995, 0.89469, 0.24677, 0.90829, 0.28672, 0.9146, 0.46582, 0.91414 ], - "triangles": [ 16, 47, 15, 15, 12, 13, 15, 13, 14, 15, 47, 12, 47, 10, 11, 17, 46, 47, 47, 46, 10, 18, 46, 17, 17, 47, 16, 18, 45, 46, 47, 11, 12, 22, 23, 24, 43, 42, 7, 43, 22, 42, 21, 22, 43, 44, 43, 7, 44, 7, 8, 44, 8, 9, 21, 43, 44, 45, 44, 9, 46, 45, 9, 20, 21, 44, 20, 45, 19, 44, 45, 20, 45, 18, 19, 46, 9, 10, 41, 27, 28, 26, 27, 41, 41, 28, 40, 5, 41, 40, 5, 40, 4, 24, 25, 26, 42, 26, 41, 24, 26, 42, 6, 41, 5, 42, 41, 6, 28, 29, 40, 40, 39, 4, 7, 42, 6, 24, 42, 22, 40, 29, 39, 36, 34, 35, 36, 35, 0, 33, 34, 36, 37, 36, 0, 37, 0, 1, 32, 33, 36, 31, 32, 36, 31, 36, 37, 30, 31, 37, 38, 37, 1, 30, 37, 38, 38, 1, 2, 39, 30, 38, 39, 38, 2, 29, 30, 39, 39, 2, 3, 4, 39, 3 ], - "vertices": [ 1, 6, 53.94, 69.15, 1, 1, 6, 126.23, 67.31, 1, 2, 6, 226.42, 31.13, 0.9375, 11, -30.87, -1.11, 0.0625, 2, 6, 240.84, 25.33, 0.7, 11, -25.64, 13.52, 0.3, 2, 6, 246.67, 8.05, 0.3, 11, -8.61, 20.02, 0.7, 3, 6, 240.81, -115.25, 0.0625, 11, 114.8, 19.01, 0.875, 19, 9.48, 59.16, 0.0625, 2, 11, 131.07, 29.69, 0.7, 19, 22.11, 44.35, 0.3, 2, 11, 146.06, 39.54, 0.3, 19, 33.76, 30.71, 0.7, 4, 11, 152.6, 65.01, 0.12438, 19, 59.85, 27.41, 0.74434, 35, 15.85, 48.05, 0.12104, 51, -80.52, 23.87, 0.01022, 4, 11, 154.28, 71.59, 0.0519, 19, 66.59, 26.56, 0.74749, 35, 16.72, 41.31, 0.15401, 51, -77.54, 17.76, 0.04658, 4, 11, 145.73, 77.3, 0.02193, 19, 71.19, 35.76, 0.63296, 35, 26.78, 39.17, 0.1288, 51, -67.32, 18.96, 0.21628, 3, 19, 87.93, 69.21, 0.0625, 35, 63.37, 31.39, 0.675, 51, -30.17, 23.3, 0.26249, 2, 35, 113.82, 35.72, 0.1038, 51, 16.23, 43.56, 0.89619, 1, 51, 128.14, 12.02, 1, 1, 51, 161.85, -15.81, 1, 2, 35, 90.98, -23.36, 0.0138, 51, 13.52, -19.72, 0.98619, 2, 35, 62.97, -25.81, 0.7, 51, -12.23, -31.02, 0.3, 3, 19, 115.12, -1.33, 0.08333, 35, 1.93, -12.66, 0.83333, 51, -74.26, -38.1, 0.08333, 2, 19, 106.11, -23.53, 0.3, 35, -21.8, -9.52, 0.7, 2, 19, 97.43, -44.9, 0.7, 35, -44.67, -6.51, 0.3, 2, 19, 84.26, -40.69, 0.9375, 35, -43.9, 7.29, 0.0625, 1, 19, 49.18, -29.46, 1, 2, 11, 206.75, 5.37, 0.13333, 19, 7.44, -33.77, 0.86666, 2, 11, 219.64, -20.52, 0.36111, 19, -16.64, -49.8, 0.63888, 2, 11, 208.4, -37.82, 0.72083, 19, -35.22, -40.82, 0.27916, 2, 11, 200.49, -50.02, 0.91666, 19, -48.31, -34.48, 0.08333, 1, 11, 161.1, -36.97, 1, 2, 6, 150.1, -116.76, 0.08333, 11, 119.88, -71.55, 0.91666, 2, 6, 154.99, -70.71, 0.42846, 11, 73.68, -68.47, 0.57153, 2, 6, 150.3, -65.27, 0.35604, 11, 68.42, -73.36, 0.64395, 2, 6, 146.51, -60.87, 0.59147, 11, 64.17, -77.32, 0.40852, 2, 6, 115.12, -75.08, 0.8446, 11, 79.61, -108.13, 0.15539, 1, 6, 63.33, -98.53, 1, 1, 6, 21.78, -94.55, 1, 1, 6, -66.69, -32.04, 1, 1, 6, -6.62, 52.97, 1, 1, 6, 58.14, -6, 1, 1, 6, 121.17, 2.44, 1, 2, 6, 188.87, -12.1, 0.96, 11, 13.79, -36.92, 0.04, 2, 6, 197.11, -18.42, 0.7, 11, 19.79, -28.44, 0.3, 2, 6, 203.98, -28.61, 0.3, 11, 29.69, -21.17, 0.7, 3, 6, 213.53, -136.06, 0.04, 11, 136.67, -7.42, 0.91999, 19, -14.02, 34.16, 0.04, 2, 11, 164.32, 0.66, 0.7, 19, -2.53, 7.73, 0.3, 2, 11, 177.97, 21.57, 0.25, 19, 19.92, -3.19, 0.75, 3, 11, 187.55, 72.78, 0.04, 19, 71.93, -6.29, 0.91999, 35, -13.72, 27.87, 0.04, 2, 19, 79.66, -3.72, 0.7, 35, -9.28, 21.04, 0.3, 3, 19, 87.98, 7.25, 0.3, 35, 3.42, 15.76, 0.66, 51, -81.96, -10.7, 0.04, 3, 19, 114.16, 61.85, 0.04, 35, 62.84, 4.15, 0.7, 51, -21.95, -2.66, 0.26 ], - "hull": 36 + "triangles": [ 15, 47, 12, 15, 12, 13, 16, 47, 15, 15, 13, 14, 47, 11, 12, 47, 46, 10, 47, 10, 11, 17, 46, 47, 17, 47, 16, 18, 45, 46, 18, 46, 17, 22, 23, 24, 43, 42, 7, 43, 22, 42, 21, 22, 43, 44, 43, 7, 44, 7, 8, 44, 8, 9, 21, 43, 44, 45, 44, 9, 46, 45, 9, 46, 9, 10, 20, 21, 44, 20, 45, 19, 44, 45, 20, 45, 18, 19, 40, 29, 39, 28, 29, 40, 40, 39, 4, 41, 27, 28, 26, 27, 41, 41, 28, 40, 5, 41, 40, 5, 40, 4, 24, 25, 26, 42, 26, 41, 24, 26, 42, 6, 41, 5, 42, 41, 6, 7, 42, 6, 24, 42, 22, 36, 34, 35, 36, 35, 0, 33, 34, 36, 37, 36, 0, 37, 0, 1, 32, 33, 36, 31, 32, 36, 31, 36, 37, 30, 31, 37, 38, 37, 1, 30, 37, 38, 38, 1, 2, 39, 30, 38, 39, 38, 2, 29, 30, 39, 39, 2, 3, 4, 39, 3 ], + "vertices": [ 1, 40, 53.94, 69.15, 1, 1, 40, 126.23, 67.31, 1, 2, 40, 226.42, 31.13, 0.9375, 41, -30.87, -1.11, 0.0625, 2, 40, 240.84, 25.33, 0.7, 41, -25.64, 13.52, 0.3, 2, 40, 246.67, 8.05, 0.3, 41, -8.60999, 20.02, 0.7, 3, 40, 240.81, -115.25, 0.0625, 41, 114.8, 19.01, 0.875, 42, 9.47999, 59.16, 0.0625, 2, 41, 131.07, 29.69, 0.7, 42, 22.11, 44.35, 0.3, 2, 41, 146.06, 39.54, 0.3, 42, 33.75999, 30.71, 0.7, 3, 41, 152.6, 65.01, 0.12566, 42, 59.85, 27.41, 0.75203, 43, 15.85, 48.05, 0.12229, 3, 41, 154.28, 71.58999, 0.05444, 42, 66.58999, 26.56, 0.78401, 43, 16.71999, 41.31, 0.16154, 3, 42, 71.19, 35.75999, 0.64716, 43, 26.78, 39.16999, 0.13169, 44, -67.32, 18.95999, 0.22114, 3, 42, 87.93, 69.21, 0.0625, 43, 63.37, 31.39, 0.675, 44, -30.17, 23.3, 0.26249, 2, 43, 113.82, 35.72, 0.1038, 44, 16.23, 43.56, 0.89619, 1, 44, 128.14, 12.02, 1, 1, 44, 161.85, -15.81, 1, 2, 43, 90.98, -23.36, 0.0138, 44, 13.52, -19.71999, 0.98619, 2, 43, 62.97, -25.81, 0.7, 44, -12.23, -31.02, 0.3, 3, 42, 115.12, -1.33, 0.08333, 43, 1.93, -12.66, 0.83333, 44, -74.26, -38.09999, 0.08333, 2, 42, 106.11, -23.53, 0.3, 43, -21.8, -9.52, 0.7, 2, 42, 97.43, -44.9, 0.7, 43, -44.67, -6.51, 0.3, 2, 42, 84.26, -40.68999, 0.9375, 43, -43.9, 7.29, 0.0625, 1, 42, 49.18, -29.46, 1, 2, 41, 206.75, 5.37, 0.13333, 42, 7.44, -33.77, 0.86666, 2, 41, 219.64, -20.52, 0.36111, 42, -16.64, -49.8, 0.63888, 2, 41, 208.4, -37.82, 0.72083, 42, -35.22, -40.82, 0.27916, 2, 41, 200.49, -50.02, 0.91666, 42, -48.31, -34.48, 0.08333, 1, 41, 161.1, -36.97, 1, 2, 40, 150.1, -116.76, 0.08333, 41, 119.88, -71.55, 0.91666, 2, 40, 154.99, -70.71, 0.42846, 41, 73.68, -68.47, 0.57153, 2, 40, 150.3, -65.26999, 0.35604, 41, 68.42, -73.36, 0.64395, 2, 40, 146.51, -60.87, 0.59147, 41, 64.17, -77.32, 0.40852, 2, 40, 115.12, -75.08, 0.8446, 41, 79.61, -108.13, 0.15538, 1, 40, 63.33, -98.53, 1, 1, 40, 21.78, -94.55, 1, 1, 40, -66.69, -32.04, 1, 1, 40, -6.62, 52.97, 1, 1, 40, 58.14, -6, 1, 1, 40, 121.17, 2.44, 1, 1, 40, 188.87, -12.1, 1, 2, 40, 197.11, -18.42, 0.7, 41, 19.79, -28.44, 0.3, 2, 40, 203.98, -28.61, 0.3, 41, 29.69, -21.17, 0.7, 1, 41, 136.67, -7.42, 1, 2, 41, 164.32, 0.66, 0.7, 42, -2.53, 7.73, 0.3, 2, 41, 177.97, 21.57, 0.25, 42, 19.92, -3.19, 0.75, 1, 42, 71.93, -6.29, 1, 2, 42, 79.66, -3.72, 0.7, 43, -9.28, 21.04, 0.3, 2, 42, 87.98, 7.25, 0.3125, 43, 3.42, 15.76, 0.6875, 3, 42, 114.16, 61.85, 0.04, 43, 62.84, 4.15, 0.7, 44, -21.95, -2.66, 0.26 ], + "hull": 36, + "edges": [ 66, 68, 66, 64, 56, 54, 54, 52, 52, 50, 46, 44, 44, 42, 34, 32, 32, 30, 30, 28, 28, 26, 26, 24, 24, 22, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 68, 70, 0, 70, 46, 48, 48, 50, 14, 12, 12, 10, 60, 58, 58, 56, 42, 40, 40, 38, 18, 16, 16, 14, 22, 20, 20, 18, 38, 36, 36, 34, 60, 62, 62, 64, 68, 72, 72, 74, 74, 76, 76, 78, 78, 80, 80, 82, 82, 84, 84, 86, 16, 88, 86, 88, 18, 90, 90, 38, 88, 90, 20, 92, 92, 36, 90, 92, 92, 94, 94, 22, 94, 32, 30, 24, 88, 40, 86, 14, 84, 12, 82, 10, 82, 52, 48, 84, 44, 86, 78, 6, 4, 76, 80, 8, 80, 56, 58, 78, 76, 60 ], + "width": 338, + "height": 429 } }, "raptor_horn": { @@ -306,11 +410,14 @@ }, "raptor_jaw": { "raptor_jaw": { - "type": "skinnedmesh", - "uvs": [ 0.40984, 0.22169, 0.42214, 0.3988, 0.67894, 0.53819, 0.7589, 0.62838, 0.99999, 0.4726, 1, 0.53491, 0.87731, 0.77925, 0.63281, 0.94487, 0.39908, 0.96947, 0.19456, 0.89404, 0.21609, 0.6497, 0, 0.46111, 0, 0, 0.26069, 0, 0.19456, 0.29385, 0.31758, 0.50047 ], - "triangles": [ 14, 13, 0, 10, 11, 15, 15, 14, 1, 2, 7, 8, 8, 9, 10, 15, 2, 8, 15, 8, 10, 7, 3, 6, 7, 2, 3, 2, 15, 1, 6, 3, 5, 5, 3, 4, 14, 0, 1, 11, 14, 15, 11, 12, 14, 14, 12, 13 ], - "vertices": [ 1, 48, 28.6, 68.85, 1, 1, 48, 69.65, 38.95, 1, 1, 48, 150.72, 72.88, 1, 1, 48, 186.16, 74.79, 1, 1, 48, 199.76, 159.69, 1, 1, 48, 213.35, 148.16, 1, 1, 48, 242.43, 74.42, 1, 1, 48, 230.31, -13.08, 1, 1, 48, 189.56, -71.99, 1, 1, 48, 132.76, -105.6, 1, 1, 48, 83.71, -55.39, 1, 2, 33, -18.31, 12.1, 0.67732, 48, -0.04, -70.76, 0.32267, 1, 33, 113.44, 16.95, 1, 1, 33, 116.36, -62.48, 1, 1, 48, 1.86, 5.43, 1, 1, 48, 71.19, -4.17, 1 ], - "hull": 14 + "type": "mesh", + "uvs": [ 0.40984, 0.22169, 0.42214, 0.3988, 0.67894, 0.53819, 0.7589, 0.62838, 0.99999, 0.4726, 1, 0.53491, 0.87731, 0.77925, 0.63281, 0.94487, 0.39908, 0.96947, 0.19456, 0.89404, 0.21609, 0.6497, 0, 0.46111, 0, 0, 0.26069, 0, 0.19456, 0.29385 ], + "triangles": [ 2, 7, 8, 8, 9, 10, 2, 8, 10, 7, 3, 6, 7, 2, 3, 2, 10, 1, 6, 3, 5, 11, 14, 10, 10, 14, 1, 5, 3, 4, 14, 0, 1, 14, 13, 0, 11, 12, 14, 14, 12, 13 ], + "vertices": [ 1, 35, 28.6, 68.85, 1, 1, 35, 69.65, 38.95, 1, 1, 35, 150.72, 72.87999, 1, 1, 35, 186.16, 74.79, 1, 1, 35, 199.76, 159.69, 1, 1, 35, 213.35, 148.16, 1, 1, 35, 242.43, 74.42, 1, 1, 35, 230.31, -13.08, 1, 1, 35, 189.56, -71.99, 1, 1, 35, 132.76, -105.6, 1, 1, 35, 83.71, -55.39, 1, 2, 16, -18.31, 12.1, 0.67732, 35, -0.04, -70.76, 0.32267, 1, 16, 113.44, 16.95, 1, 1, 16, 116.36, -62.48, 1, 1, 35, 1.86, 5.43, 1 ], + "hull": 14, + "edges": [ 22, 24, 22, 20, 20, 18, 18, 16, 16, 14, 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 24, 26, 0, 26, 24, 28, 22, 28, 28, 0 ], + "width": 305, + "height": 286 } }, "raptor_saddle_noshadow": { @@ -321,11 +428,14 @@ }, "raptor_saddle_strap_rear": { "raptor_saddle_strap_rear": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.85499, 0.06802, 1, 0.13237, 1, 0.20266, 0.95981, 0.26524, 0.88583, 0.38045, 0.80684, 0.46413, 0.74038, 0.53453, 0.81676, 0.5895, 0.51961, 1, 0.4516, 1, 0.01739, 0.8407, 0, 0.80889, 0.24645, 0.36639, 0.3792, 0.39151, 0.42457, 0.32099, 0.49229, 0.21571, 0.57673, 0.10986, 0.66437, 0, 0.70168, 0, 0.56028, 0.46321, 0.68822, 0.29772, 0.76845, 0.18722, 0.61529, 0.39206 ], - "triangles": [ 19, 14, 22, 13, 14, 19, 19, 22, 6, 13, 10, 11, 9, 13, 19, 8, 9, 19, 6, 8, 19, 13, 11, 12, 9, 10, 13, 7, 8, 6, 22, 15, 20, 14, 15, 22, 5, 20, 4, 22, 20, 5, 15, 16, 20, 20, 21, 4, 6, 22, 5, 21, 18, 0, 16, 17, 18, 21, 16, 18, 0, 1, 2, 3, 21, 0, 2, 3, 0, 20, 16, 21, 4, 21, 3 ], - "vertices": [ 1, 21, 3.9, -3.27, 1, 1, 21, 4.25, 15.05, 1, 1, 21, 13.24, 20.28, 1, 2, 21, 23.42, 21.2, 0.7, 37, -15.2, 21.22, 0.3, 3, 21, 41.11, 22.87, 0.3, 37, 2.48, 22.89, 0.6375, 53, -33.83, 24.96, 0.0625, 3, 21, 52.07, 21.72, 0.0625, 37, 13.43, 21.74, 0.6375, 53, -22.97, 23.11, 0.3, 2, 37, 18.39, 20.76, 0.25, 53, -18.09, 21.82, 0.75, 1, 53, -18.76, 33.09, 1, 1, 53, 49.92, 31.57, 1, 1, 53, 53.21, 25, 1, 1, 53, 53.11, -27.48, 1, 1, 53, 49.74, -31.27, 1, 1, 53, -20.73, -36.76, 1, 1, 53, -23.82, -22.28, 1, 3, 21, 53.48, -24.61, 0.0625, 37, 14.84, -24.59, 0.575, 53, -24.51, -23.21, 0.3625, 3, 21, 41.44, -26.12, 0.3, 37, 2.81, -26.09, 0.6375, 53, -36.62, -23.95, 0.0625, 2, 21, 24.38, -26.12, 0.7, 37, -14.24, -26.1, 0.3, 1, 21, 5.57, -26.12, 1, 1, 21, 3.54, -22.64, 1, 1, 53, -23.08, -0.04, 1, 3, 21, 41.66, -1.72, 0.3, 37, 3.03, -1.7, 0.66, 53, -34.85, 0.38, 0.04, 2, 21, 23.85, -2.46, 0.7, 37, -14.77, -2.44, 0.3, 3, 21, 52.58, -1.52, 0.04, 37, 13.95, -1.5, 0.62, 53, -23.94, -0.11, 0.34 ], - "hull": 19 + "triangles": [ 19, 14, 22, 13, 14, 19, 19, 22, 6, 13, 10, 11, 9, 13, 19, 8, 9, 19, 6, 8, 19, 13, 11, 12, 9, 10, 13, 7, 8, 6, 15, 16, 20, 20, 21, 4, 22, 15, 20, 14, 15, 22, 5, 20, 4, 22, 20, 5, 6, 22, 5, 21, 18, 0, 16, 17, 18, 21, 16, 18, 0, 1, 2, 3, 21, 0, 2, 3, 0, 20, 16, 21, 4, 21, 3 ], + "vertices": [ 1, 50, 3.9, -3.27, 1, 1, 50, 4.25, 15.05, 1, 1, 50, 13.24, 20.28, 1, 2, 50, 23.42, 21.2, 0.7, 51, -15.2, 21.22, 0.3, 3, 50, 41.11, 22.87, 0.3, 51, 2.48, 22.89, 0.6375, 52, -33.83, 24.96, 0.0625, 3, 50, 52.07, 21.72, 0.0625, 51, 13.43, 21.74, 0.6375, 52, -22.97, 23.11, 0.3, 2, 51, 18.39, 20.76, 0.25, 52, -18.09, 21.82, 0.75, 1, 52, -18.76, 33.09, 1, 1, 52, 49.92, 31.57, 1, 1, 52, 53.21, 25, 1, 1, 52, 53.11, -27.48, 1, 1, 52, 49.74, -31.27, 1, 1, 52, -20.73, -36.75999, 1, 1, 52, -23.82, -22.28, 1, 3, 50, 53.48, -24.61, 0.0625, 51, 14.84, -24.59, 0.575, 52, -24.51, -23.21, 0.3625, 3, 50, 41.43999, -26.12, 0.3, 51, 2.81, -26.09, 0.6375, 52, -36.62, -23.95, 0.0625, 2, 50, 24.38, -26.12, 0.7, 51, -14.24, -26.1, 0.3, 1, 50, 5.57, -26.12, 1, 1, 50, 3.54, -22.64, 1, 1, 52, -23.08, -0.04, 1, 2, 50, 41.66, -1.72, 0.3125, 51, 3.03, -1.7, 0.6875, 2, 50, 23.85, -2.46, 0.7, 51, -14.77, -2.44, 0.3, 2, 51, 13.95, -1.5, 0.64582, 52, -23.94, -0.11, 0.35416 ], + "hull": 19, + "edges": [ 26, 24, 24, 22, 22, 20, 20, 18, 16, 18, 16, 14, 14, 12, 4, 2, 34, 36, 12, 38, 38, 26, 8, 40, 40, 30, 2, 0, 0, 36, 30, 32, 32, 34, 32, 42, 4, 6, 6, 8, 42, 6, 26, 28, 28, 30, 28, 44, 8, 10, 10, 12, 44, 10 ], + "width": 108, + "height": 148 } }, "raptor_saddle_w_shadow": { @@ -333,11 +443,14 @@ }, "raptor_tongue": { "raptor_tongue": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.35242, 0.2156, 0.4794, 0.44245, 0.62071, 0.61176, 0.80562, 0.75373, 1, 0.90297, 1, 1, 0.8971, 1, 0.72054, 0.92254, 0.50668, 0.82872, 0.30401, 0.70725, 0.10537, 0.57888, 0, 0.50622, 0, 0, 0.26224, 0 ], - "triangles": [ 8, 7, 6, 6, 4, 5, 4, 6, 3, 6, 7, 3, 7, 8, 3, 8, 2, 3, 9, 10, 1, 8, 9, 2, 9, 1, 2, 1, 10, 0, 10, 11, 0, 0, 12, 13, 0, 11, 12 ], - "vertices": [ 2, 55, 3.63, 27.04, 0.6875, 62, -47.26, 33.87, 0.3125, 3, 55, 39.09, 19.45, 0.3125, 62, -13.41, 20.86, 0.625, 65, -51.54, 33.37, 0.0625, 3, 55, 71.56, 19.02, 0.0625, 62, 18.58, 15.39, 0.625, 65, -21.56, 20.92, 0.3125, 2, 62, 55.03, 16.85, 0.3125, 65, 14.29, 14.23, 0.6875, 2, 62, 93.34, 18.39, 0.08333, 65, 51.98, 7.21, 0.91666, 1, 65, 56.09, -4.5, 1, 2, 62, 85.06, -1.49, 0.08333, 65, 39.48, -10.33, 0.91666, 2, 62, 54.22, -9.18, 0.3125, 65, 7.71, -10.96, 0.6875, 3, 55, 75.14, -14.72, 0.0625, 62, 16.87, -18.5, 0.625, 65, -30.77, -11.73, 0.3125, 3, 55, 38.8, -25.8, 0.3125, 62, -20.74, -23.8, 0.625, 65, -68.62, -8.53, 0.0625, 2, 55, 2.4, -35.77, 0.6875, 62, -58.25, -27.99, 0.3125, 2, 55, -17.28, -40.62, 0.91666, 62, -78.45, -29.71, 0.08333, 1, 55, -59.91, 8.18, 1, 2, 55, -26.13, 37.69, 0.91666, 62, -75.02, 49.02, 0.08333 ], - "hull": 14 + "triangles": [ 7, 8, 3, 6, 7, 3, 4, 6, 3, 6, 4, 5, 8, 7, 6, 9, 1, 2, 8, 9, 2, 9, 10, 1, 8, 2, 3, 0, 11, 12, 0, 12, 13, 10, 11, 0, 1, 10, 0 ], + "vertices": [ 2, 63, 3.63, 27.04, 0.6875, 64, -47.26, 33.87, 0.3125, 3, 63, 39.09, 19.45, 0.3125, 64, -13.41, 20.86, 0.625, 65, -51.54, 33.37, 0.0625, 3, 63, 71.56, 19.02, 0.0625, 64, 18.58, 15.39, 0.625, 65, -21.56, 20.92, 0.3125, 2, 64, 55.03, 16.85, 0.3125, 65, 14.29, 14.23, 0.6875, 2, 64, 93.34, 18.39, 0.08333, 65, 51.98, 7.21, 0.91666, 1, 65, 56.09, -4.5, 1, 2, 64, 85.06, -1.49, 0.08333, 65, 39.48, -10.33, 0.91666, 2, 64, 54.22, -9.18, 0.3125, 65, 7.71, -10.96, 0.6875, 3, 63, 75.14, -14.72, 0.0625, 64, 16.87, -18.5, 0.625, 65, -30.77, -11.73, 0.3125, 3, 63, 38.8, -25.8, 0.3125, 64, -20.74, -23.8, 0.625, 65, -68.62, -8.53, 0.0625, 2, 63, 2.4, -35.77, 0.6875, 64, -58.25, -27.99, 0.3125, 2, 63, -17.28, -40.62, 0.91666, 64, -78.44999, -29.71, 0.08333, 1, 63, -59.91, 8.18, 1, 2, 63, -26.13, 37.68999, 0.91666, 64, -75.01999, 49.02, 0.08333 ], + "hull": 14, + "edges": [ 22, 24, 10, 12, 10, 8, 24, 26, 16, 4, 18, 16, 2, 4, 18, 2, 22, 20, 0, 26, 20, 0, 0, 2, 12, 14, 14, 16, 4, 6, 6, 8, 14, 6, 20, 18 ], + "width": 171, + "height": 128 } }, "spineboy_torso": { @@ -351,11 +464,14 @@ }, "stirrup_strap": { "stirrup_strap": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.36822, 0.27893, 0.45737, 0.38897, 0.54451, 0.49651, 0.67872, 0.59135, 0.81977, 0.69102, 1, 0.77344, 1, 1, 0.77956, 1, 0.63729, 0.81629, 0.53364, 0.72348, 0.40534, 0.6086, 0.30886, 0.52535, 0.21049, 0.44047, 0, 0.26245, 0, 0, 0.30637, 0, 0.20241, 0.23 ], - "triangles": [ 2, 10, 1, 9, 10, 2, 9, 2, 3, 8, 9, 3, 8, 3, 4, 7, 8, 4, 7, 4, 5, 7, 5, 6, 16, 14, 15, 13, 14, 16, 16, 15, 0, 12, 16, 0, 12, 0, 1, 13, 16, 12, 11, 12, 1, 10, 11, 1 ], - "vertices": [ 2, 26, 24.71, 8.03, 0.80344, 39, -17.42, 11.02, 0.19655, 2, 26, 37.95, 8.04, 0.59978, 39, -4.36, 8.87, 0.40021, 2, 26, 50.88, 8.04, 0.36895, 39, 8.39, 6.77, 0.63104, 2, 26, 65.92, 12.27, 0.17748, 39, 23.91, 8.48, 0.82251, 2, 26, 81.72, 16.7, 0.05943, 39, 40.23, 10.28, 0.94056, 2, 26, 98.82, 25.04, 0.01209, 39, 58.46, 15.71, 0.9879, 2, 26, 114.44, 11.57, 0.00191, 39, 71.67, -0.11, 0.99808, 2, 26, 100.47, -4.61, 0.01817, 39, 55.25, -13.81, 0.98182, 2, 26, 78.79, -4.14, 0.07487, 39, 33.94, -9.81, 0.92512, 2, 26, 65.83, -6.24, 0.2028, 39, 20.81, -9.76, 0.79719, 2, 26, 49.78, -8.83, 0.39971, 39, 4.55, -9.7, 0.60028, 2, 26, 37.93, -10.97, 0.62658, 39, -7.48, -9.88, 0.37341, 2, 26, 25.85, -13.15, 0.82034, 39, -19.75, -10.06, 0.17965, 2, 26, 0.25, -18.03, 0.95288, 39, -45.81, -10.7, 0.04711, 2, 26, -17.83, -2.43, 0.97709, 39, -61.11, 7.63, 0.0229, 2, 26, 1.57, 20.07, 0.94774, 39, -38.29, 26.67, 0.05225, 2, 26, 10.84, -1.23, 0.97709, 39, -32.62, 4.14, 0.0229 ], - "hull": 16 + "triangles": [ 7, 5, 6, 7, 4, 5, 7, 8, 4, 8, 3, 4, 8, 9, 3, 9, 2, 3, 9, 10, 2, 2, 10, 1, 10, 11, 1, 11, 12, 1, 13, 16, 12, 12, 0, 1, 12, 16, 0, 16, 15, 0, 13, 14, 16, 16, 14, 15 ], + "vertices": [ 2, 56, 24.71, 8.03, 0.80344, 57, -17.42, 11.02, 0.19655, 2, 56, 37.95, 8.04, 0.59978, 57, -4.36, 8.87, 0.40021, 2, 56, 50.88, 8.04, 0.36895, 57, 8.39, 6.77, 0.63103, 2, 56, 65.92, 12.27, 0.17748, 57, 23.91, 8.47999, 0.82251, 2, 56, 81.72, 16.7, 0.05943, 57, 40.23, 10.28, 0.94056, 2, 56, 98.82, 25.04, 0.01209, 57, 58.46, 15.71, 0.9879, 2, 56, 114.44, 11.57, 0.00191, 57, 71.67, -0.11, 0.99808, 2, 56, 100.47, -4.61, 0.01816, 57, 55.25, -13.81, 0.98182, 2, 56, 78.79, -4.14, 0.07487, 57, 33.93999, -9.81, 0.92512, 2, 56, 65.83, -6.24, 0.2028, 57, 20.81, -9.76, 0.79719, 2, 56, 49.78, -8.83, 0.39971, 57, 4.55, -9.7, 0.60028, 2, 56, 37.93, -10.97, 0.62658, 57, -7.48, -9.88, 0.37341, 2, 56, 25.85, -13.15, 0.82034, 57, -19.75, -10.06, 0.17965, 2, 56, 0.25, -18.03, 0.95288, 57, -45.81, -10.7, 0.04711, 2, 56, -17.83, -2.43, 0.97709, 57, -61.11, 7.63, 0.0229, 2, 56, 1.57, 20.07, 0.94774, 57, -38.29, 26.67, 0.05225, 2, 56, 10.84, -1.23, 0.97709, 57, -32.62, 4.14, 0.0229 ], + "hull": 16, + "edges": [ 28, 30, 30, 0, 12, 10, 8, 10, 12, 14, 14, 16, 26, 28, 24, 26, 26, 32, 32, 30, 20, 22, 22, 24, 0, 2, 2, 4, 4, 6, 6, 8, 16, 18, 18, 20 ], + "width": 97, + "height": 91 } }, "visor": { @@ -364,6 +480,1179 @@ } }, "animations": { + "Jump": { + "bones": { + "root": { + "rotate": [ + { "time": 0, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { + "time": 0.3, + "x": 0, + "y": 0, + "curve": [ 0.201, 0.17, 0.815, 0.83 ] + }, + { "time": 0.6666, "x": 1482.78, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "front_foot_goal": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.2, "angle": 0 }, + { "time": 0.3, "angle": -41.64 }, + { "time": 0.3666, "angle": -69.66 }, + { "time": 0.4333, "angle": -12.8 }, + { "time": 0.5333, "angle": 5.73 }, + { "time": 0.6666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.3, "x": 0, "y": 0 }, + { "time": 0.3666, "x": -60.01, "y": 111.1 }, + { "time": 0.4333, "x": 213.18, "y": 291.22 }, + { "time": 0.5333, "x": 243.73, "y": 332.61 }, + { "time": 0.6666, "x": 95.94, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.6666, "x": 1, "y": 1 } + ] + }, + "hip": { + "rotate": [ + { "time": 0, "angle": -4.48 }, + { "time": 0.1, "angle": -23.02 }, + { "time": 0.3, "angle": 19.24 }, + { "time": 0.5333, "angle": 20.85 }, + { "time": 0.6666, "angle": -10.76 }, + { "time": 0.7666, "angle": -18.58 }, + { "time": 0.9333, "angle": -3.56 }, + { "time": 1.0666, "angle": -4.48 } + ], + "translate": [ + { "time": 0, "x": -100.65, "y": 49.77 }, + { + "time": 0.1, + "x": 9.37, + "y": -109.06, + "curve": [ 0.245, 0, 0.609, 0.41 ] + }, + { + "time": 0.1666, + "x": 150.37, + "y": -76.51, + "curve": [ 0.401, 0.34, 0.858, 0.87 ] + }, + { "time": 0.3, "x": 361, "y": 36.69 }, + { + "time": 0.5333, + "x": 5.36, + "y": 290.91, + "curve": [ 0.808, 0, 0.892, 0.81 ] + }, + { "time": 0.6666, "x": -56.27, "y": 88.07 }, + { + "time": 0.7666, + "x": 179.93, + "y": -59.94, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.9333, + "x": 238.11, + "y": 50.63, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.0666, "x": 213.19, "y": 49.77 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_foot_goal": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.2, "angle": 0 }, + { "time": 0.3, "angle": -41.64 }, + { "time": 0.3666, "angle": -69.66 }, + { "time": 0.4333, "angle": -57.97 }, + { "time": 0.7, "angle": -9.19 }, + { "time": 0.7333, "angle": -7.78 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.3, "x": 0, "y": 0 }, + { "time": 0.3666, "x": -131.66, "y": 47.58 }, + { "time": 0.4333, "x": -16.1, "y": 205.84 }, + { "time": 0.5333, "x": 61.29, "y": 320.2 }, + { "time": 0.7333, "x": 235.62, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.7, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.7333, "x": 1, "y": 1 } + ] + }, + "front_leg1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_leg_goal": { + "rotate": [ + { "time": 0, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.3, "x": 0, "y": 0 }, + { "time": 0.7, "x": -0.39, "y": 24.29 }, + { "time": 0.7666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "rear_leg1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_leg_goal": { + "rotate": [ + { "time": 0, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.3, "x": 0, "y": 0 }, + { "time": 0.7, "x": 6.75, "y": 25.64 }, + { "time": 0.7666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "tail1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": -11.02 }, + { "time": 0.3, "angle": 0.53 }, + { "time": 0.4333, "angle": 8.64 }, + { "time": 0.7, "angle": -9.73 }, + { + "time": 0.7666, + "angle": -4.46, + "curve": [ 0.243, 0, 0.648, 1 ] + }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "torso1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_leg2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_leg2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tail2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": -39.83 }, + { "time": 0.3, "angle": -31.82 }, + { "time": 0.4333, "angle": -7.28 }, + { "time": 0.5333, "angle": 1.28 }, + { "time": 0.6, "angle": -7.22 }, + { "time": 0.7, "angle": -30.66 }, + { + "time": 0.7666, + "angle": -40.54, + "curve": [ 0.243, 0, 0.648, 1 ] + }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "torso2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 0.51 }, + { "time": 0.3, "angle": -1.9 }, + { "time": 0.5333, "angle": 1.04 }, + { "time": 0.7, "angle": -3.25 }, + { "time": 0.7666, "angle": 4.81 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_arm1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -308.79 }, + { "time": 0.3, "angle": -398.7 }, + { "time": 0.5333, "angle": -297.8 }, + { "time": 0.7, "angle": 62.19 }, + { "time": 0.7666, "angle": -325.36 }, + { "time": 0.8333, "angle": -374.42 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_leg3": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": -8.25 }, + { "time": 0.3, "angle": -1.9 }, + { "time": 0.5333, "angle": 5.44 }, + { "time": 0.7, "angle": 24.01 }, + { "time": 0.7666, "angle": 4.82 }, + { "time": 0.8666, "angle": -1.78 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.1, "x": 0, "y": 0 }, + { "time": 0.3, "x": 62.9, "y": -44.25 }, + { "time": 0.5333, "x": -4.35, "y": 17.31 }, + { "time": 0.7, "x": 0, "y": 0 }, + { "time": 0.7666, "x": 23.29, "y": -42.27 }, + { "time": 0.8666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_arm1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 51.2 }, + { "time": 0.3333, "angle": -38.7 }, + { "time": 0.6, "angle": 62.19, "curve": "stepped" }, + { "time": 0.7333, "angle": 62.19 }, + { "time": 0.8, "angle": 34.62 }, + { "time": 0.8666, "angle": -14.43 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_leg3": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle_strap_front1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle_strap_rear1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "spineboy_front_arm_goal": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "spineboy_hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.8666, "angle": 0, "curve": "stepped" }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.1, "x": 35.96, "y": -11.83 }, + { "time": 0.3, "x": 31.1, "y": -50.39 }, + { "time": 0.5333, "x": 12.1, "y": -8.03 }, + { "time": 0.7, "x": 41.7, "y": -19.46 }, + { "time": 0.8666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.8666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "spineboy_rear_arm_goal": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "stirrup": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "stirrup_strap1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tail3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": -8.97 }, + { "time": 0.3, "angle": -18.38 }, + { "time": 0.4333, "angle": 0.9 }, + { "time": 0.5333, "angle": 11.43 }, + { "time": 0.6, "angle": 17.22 }, + { "time": 0.7, "angle": 4.74 }, + { + "time": 0.7666, + "angle": -20.69, + "curve": [ 0.243, 0, 0.648, 1 ] + }, + { + "time": 0.9666, + "angle": -20.4, + "curve": [ 0.382, 0.57, 0.735, 1 ] + }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "back_thigh": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_arm2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 23.1 }, + { "time": 0.3, "angle": -75.92 }, + { "time": 0.5333, "angle": -1.41 }, + { "time": 0.7666, "angle": 26.86 }, + { "time": 0.8333, "angle": -56.14 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_foot1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_thigh": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "gun": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 15.27 }, + { "time": 0.3, "angle": -53.4 }, + { "time": 0.5666, "angle": -63.35 }, + { "time": 0.7666, "angle": -29.92 }, + { "time": 0.9, "angle": 7.24 }, + { "time": 1, "angle": -3.69 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 9.93 }, + { "time": 0.3, "angle": -3.76 }, + { "time": 0.5333, "angle": -26.63 }, + { "time": 0.7, "angle": -10.23 }, + { "time": 0.7666, "angle": 21.8 }, + { "time": 0.8666, "angle": 15.36 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_arm2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 23.1 }, + { "time": 0.3, "angle": -75.92 }, + { "time": 0.5333, "angle": -1.41 }, + { "time": 0.7666, "angle": 26.86 }, + { "time": 0.8333, "angle": -56.14 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_foot1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle_strap_front2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle_strap_rear2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "spineboy_torso": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -24.93 }, + { "time": 0.2333, "angle": -20.34 }, + { "time": 0.5333, "angle": -11.2 }, + { "time": 0.7, "angle": 10.49 }, + { + "time": 0.8333, + "angle": -30.21, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1, "angle": 1.34 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "stirrup_strap2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tail4": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 34.12 }, + { "time": 0.3, "angle": -12.25 }, + { "time": 0.4333, "angle": 11.11 }, + { "time": 0.5333, "angle": 25.19 }, + { "time": 0.6, "angle": 32.5 }, + { "time": 0.7, "angle": 24.4 }, + { + "time": 0.7666, + "angle": 9.9, + "curve": [ 0.243, 0, 0.648, 1 ] + }, + { + "time": 0.9666, + "angle": -11.72, + "curve": [ 0.382, 0.57, 0.735, 1 ] + }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "back_arm": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "back_knee": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_arm": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_foot2": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.3, "angle": 0 }, + { "time": 0.3666, "angle": -63.6 }, + { "time": 0.4333, "angle": -80.16 }, + { "time": 0.5333, "angle": -17.48 }, + { "time": 0.6666, "angle": 24.85 }, + { "time": 0.7666, "angle": 0, "curve": "stepped" }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.6666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.6666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_hand": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5333, "angle": -27.74 }, + { "time": 0.7666, "angle": -27.09 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "horn_front": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "horn_rear": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "jaw": { + "rotate": [ + { "time": 0, "angle": 15.56 }, + { "time": 0.2333, "angle": -0.92 }, + { "time": 0.5, "angle": 20.4 }, + { "time": 0.7, "angle": 18.32 }, + { "time": 0.7666, "angle": 5.17 }, + { "time": 0.8333, "angle": 20.34 }, + { "time": 1.0666, "angle": 15.56 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "lower_leg": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "neck2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 11.08 }, + { "time": 0.8333, "angle": 8.16 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_foot2": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.3, "angle": 0 }, + { "time": 0.3666, "angle": -87.93 }, + { "time": 0.4333, "angle": -126.75 }, + { "time": 0.5333, "angle": -63.79 }, + { "time": 0.7, "angle": 24.85 }, + { "time": 0.7666, "angle": 0, "curve": "stepped" }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.7, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.7, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_hand": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5333, "angle": -27.74 }, + { "time": 0.7666, "angle": -27.09 }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "saddle_strap_rear3": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tail5": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1, "angle": 76.87 }, + { "time": 0.3, "angle": -12.25 }, + { "time": 0.4333, "angle": 10.5 }, + { "time": 0.5333, "angle": 24.81 }, + { "time": 0.6, "angle": 32.21 }, + { "time": 0.7, "angle": 24.4 }, + { + "time": 0.7666, + "angle": 9.9, + "curve": [ 0.243, 0, 0.648, 1 ] + }, + { + "time": 0.9666, + "angle": -41.66, + "curve": [ 0.382, 0.57, 0.735, 1 ] + }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tongue1": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "back_bracer": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_arm_target": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_bracer": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_foot3": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.3, "angle": 0 }, + { "time": 0.3666, "angle": -84.17 }, + { "time": 0.4333, "angle": -127.53 }, + { "time": 0.5333, "angle": -52.16 }, + { "time": 0.6666, "angle": 10.77 }, + { "time": 0.7666, "angle": 0, "curve": "stepped" }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.6666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.6666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "head2": { + "rotate": [ + { "time": 0, "angle": 15.31 }, + { "time": 0.1, "angle": 29.85 }, + { "time": 0.2, "angle": 22.43 }, + { "time": 0.3, "angle": 12.64 }, + { "time": 0.4666, "angle": 24.85 }, + { "time": 0.5333, "angle": 9.28 }, + { "time": 0.7, "angle": 4.77 }, + { "time": 0.7666, "angle": 37.9 }, + { + "time": 0.8333, + "angle": 18.87, + "curve": [ 0.056, 0.81, 0.75, 1 ] + }, + { "time": 1, "angle": 22.96 }, + { "time": 1.0666, "angle": 15.31 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "rear_arm_target": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tongue2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "back_hand": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "front_hand2": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + }, + "tongue3": { + "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 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } + ] + } + } + }, "empty": {}, "gungrab": { "slots": { @@ -439,13 +1728,7 @@ }, "ik": { "front_arm_goal": [ - { - "time": 0, - "mix": 1, - "bendPositive": true, - "curve": [ 0.317, 0.13, 0.781, 0.56 ] - }, - { "time": 0.1333, "mix": 0, "bendPositive": true } + { "time": 0, "mix": 0 } ] } }, @@ -552,9 +1835,6 @@ "front_leg1": { "rotate": [ { "time": 0, "angle": 27.07 }, - { "time": 0.5333, "angle": -41.93 }, - { "time": 0.6333, "angle": -16.71 }, - { "time": 0.7333, "angle": 16.92 }, { "time": 1.0666, "angle": 31.39 } ], "translate": [ @@ -583,9 +1863,6 @@ "rear_leg1": { "rotate": [ { "time": 0, "angle": -64.85 }, - { "time": 0.1, "angle": -45.79 }, - { "time": 0.1666, "angle": -19.95 }, - { "time": 0.4, "angle": 35.36 }, { "time": 1.0666, "angle": -45.71 } ], "translate": [ @@ -639,9 +1916,6 @@ "front_leg2": { "rotate": [ { "time": 0, "angle": -347.28 }, - { "time": 0.5333, "angle": -346.78 }, - { "time": 0.6333, "angle": -398.52 }, - { "time": 0.7333, "angle": -393.21 }, { "time": 1.0666, "angle": -362.06 } ], "translate": [ @@ -652,11 +1926,6 @@ "rear_leg2": { "rotate": [ { "time": 0, "angle": 27.05 }, - { "time": 0.0666, "angle": -14.99 }, - { "time": 0.1, "angle": -28.87 }, - { "time": 0.1666, "angle": -49.87 }, - { "time": 0.4, "angle": -14.45 }, - { "time": 0.4666, "angle": 11.42 }, { "time": 1.0666, "angle": 9.92 } ], "translate": [ @@ -705,25 +1974,22 @@ }, "tail2": { "rotate": [ - { "time": 0, "angle": -6.57 }, - { "time": 0.0666, "angle": -1.96 }, - { "time": 0.3333, "angle": -18.09 }, - { "time": 0.6333, "angle": -1.96 }, - { "time": 0.9, "angle": -18.09 }, - { "time": 1.0666, "angle": -6.57 } + { "time": 0, "angle": -19.15 }, + { "time": 0.2333, "angle": -11.3 }, + { "time": 0.5, "angle": -9.37 }, + { "time": 0.7666, "angle": -11.3 }, + { "time": 1.0333, "angle": -20.27 }, + { "time": 1.0666, "angle": -19.15 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.0666, "x": 0, "y": 0, "curve": "stepped" }, { "time": 1.0666, "x": 0, "y": 0 } ], "scale": [ - { "time": 0, "x": 1.024, "y": 1 }, - { "time": 0.0666, "x": 1.072, "y": 1 }, - { "time": 0.3333, "x": 0.947, "y": 1 }, - { "time": 0.6333, "x": 1.072, "y": 1 }, - { "time": 0.9, "x": 0.903, "y": 1 }, - { "time": 1.0666, "x": 1.024, "y": 1 } + { "time": 0, "x": 0.8, "y": 1 }, + { "time": 0.2333, "x": 0.9, "y": 1 }, + { "time": 0.5, "x": 0.8, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 0.8, "y": 1 } ] }, "torso2": { @@ -841,23 +2107,22 @@ }, "tail3": { "rotate": [ - { "time": 0, "angle": -14.83 }, - { "time": 0.0666, "angle": -24.31 }, - { "time": 0.3333, "angle": 8.86 }, - { "time": 0.6333, "angle": -24.31 }, - { "time": 0.9, "angle": 8.86 }, - { "time": 1.0666, "angle": -14.83 } + { "time": 0, "angle": -12.46 }, + { "time": 0.2333, "angle": 12.65 }, + { "time": 0.5, "angle": -20.79 }, + { "time": 0.7666, "angle": 12.65 }, + { "time": 1.0333, "angle": -16.04 }, + { "time": 1.0666, "angle": -12.46 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.0666, "x": 0, "y": 0, "curve": "stepped" }, { "time": 1.0666, "x": 0, "y": 0 } ], "scale": [ - { "time": 0, "x": 0.995, "y": 1 }, - { "time": 0.0666, "x": 1, "y": 1 }, - { "time": 0.3333, "x": 0.947, "y": 1 }, - { "time": 1.0666, "x": 0.995, "y": 1 } + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.2333, "x": 1, "y": 1 }, + { "time": 0.5, "x": 0.997, "y": 1 }, + { "time": 1.0666, "x": 1, "y": 1 } ] }, "front_arm2": { @@ -969,36 +2234,43 @@ }, "tail4": { "rotate": [ - { "time": 0, "angle": 16.99 }, - { "time": 0.0666, "angle": 7.36 }, - { "time": 0.3333, "angle": 41.06 }, - { "time": 0.6333, "angle": 7.36 }, - { "time": 0.9, "angle": 41.06 }, - { "time": 1.0666, "angle": 16.99 } + { "time": 0, "angle": 10.25 }, + { + "time": 0.2333, + "angle": 39.47, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 0.5, "angle": 1.33 }, + { + "time": 0.7666, + "angle": 39.47, + "curve": [ 0.664, 0, 0.75, 1 ] + }, + { "time": 1.0333, "angle": 6.08 }, + { "time": 1.0666, "angle": 10.25 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.0666, "x": 0, "y": 0, "curve": "stepped" }, { "time": 1.0666, "x": 0, "y": 0 } ], "scale": [ - { "time": 0, "x": 0.995, "y": 1 }, - { "time": 0.0666, "x": 1, "y": 1 }, - { "time": 0.3333, "x": 0.947, "y": 1 }, - { "time": 1.0666, "x": 0.995, "y": 1 } + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.2333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 } ] }, "front_foot2": { "rotate": [ - { "time": 0, "angle": 44.18 }, + { "time": 0, "angle": 36.9 }, { "time": 0.0666, "angle": 7.88 }, { "time": 0.1333, "angle": 4.66 }, { "time": 0.4, "angle": 7.59 }, { "time": 0.5333, "angle": 8.08 }, { "time": 0.6666, "angle": -67.33 }, { "time": 0.7333, "angle": -65.23 }, - { "time": 1, "angle": 42.33 }, - { "time": 1.0666, "angle": 44.18 } + { "time": 1, "angle": 27.74 }, + { "time": 1.0666, "angle": 36.9 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, @@ -1098,23 +2370,39 @@ }, "tail5": { "rotate": [ - { "time": 0, "angle": -15.7 }, - { "time": 0.0666, "angle": -38.39 }, - { "time": 0.3333, "angle": 41.03 }, - { "time": 0.6333, "angle": -38.39 }, - { "time": 0.9, "angle": 41.03 }, - { "time": 1.0666, "angle": -15.7 } + { + "time": 0, + "angle": -26.34, + "curve": [ 0.391, -0.58, 0.653, 1.01 ] + }, + { + "time": 0.2333, + "angle": 45.41, + "curve": [ 0.391, -0.58, 0.653, 1.01 ] + }, + { + "time": 0.5, + "angle": -21.92, + "curve": [ 0.391, -0.58, 0.653, 1.01 ] + }, + { + "time": 0.7666, + "angle": 45.41, + "curve": [ 0.391, -0.58, 0.653, 1.01 ] + }, + { "time": 1.0333, "angle": -7.73 }, + { "time": 1.0666, "angle": -26.34 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.0666, "x": 0, "y": 0, "curve": "stepped" }, { "time": 1.0666, "x": 0, "y": 0 } ], "scale": [ - { "time": 0, "x": 0.995, "y": 1 }, - { "time": 0.0666, "x": 1, "y": 1 }, - { "time": 0.3333, "x": 0.947, "y": 1 }, - { "time": 1.0666, "x": 0.995, "y": 1 } + { "time": 0, "x": 0.765, "y": 1 }, + { "time": 0.2333, "x": 1, "y": 1 }, + { "time": 0.5, "x": 0.765, "y": 1 }, + { "time": 0.7666, "x": 1, "y": 1 }, + { "time": 1.0666, "x": 0.765, "y": 1 } ] }, "tongue1": { @@ -1132,7 +2420,7 @@ }, "front_foot3": { "rotate": [ - { "time": 0, "angle": 27.59 }, + { "time": 0, "angle": -1.65 }, { "time": 0.0666, "angle": -5.29 }, { "time": 0.1333, "angle": -3.94 }, { "time": 0.2666, "angle": -3.81 }, @@ -1141,8 +2429,8 @@ { "time": 0.6666, "angle": -73.63 }, { "time": 0.7333, "angle": -102.81 }, { "time": 0.8333, "angle": -41.3 }, - { "time": 1, "angle": 27.59 }, - { "time": 1.0666, "angle": 27.59 } + { "time": 1, "angle": 10.93 }, + { "time": 1.0666, "angle": -1.65 } ], "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, @@ -1283,21 +2571,21 @@ ] } }, - "ffd": { + "deform": { "default": { "raptor_body": { "raptor_body": [ { "time": 0 }, { "time": 0.2666, - "offset": 368, - "vertices": [ -16.78, 15.47, -0.63, 22.82, 18.11, 13.89, 19.32, 12.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, 0, 0, 0, 0, 0, 0, -3.24, 0.81, 0, 0, -3.24, 0.81 ] + "offset": 314, + "vertices": [ -16.78684, 15.47479, -0.63024, 22.82083, 18.11511, 13.89254, 19.32452, 12.15423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, 0, 0, 0, 0, 0, 0, -3.24548, 0.81152, 0, 0, -3.24548, 0.81152 ] }, { "time": 0.5333 }, { "time": 0.8, - "offset": 368, - "vertices": [ -16.78, 15.47, -0.63, 22.82, 18.11, 13.89, 19.32, 12.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, -3.24, 0.81, 0, 0, 0, 0, 0, 0, -3.24, 0.81, 0, 0, -3.24, 0.81 ] + "offset": 314, + "vertices": [ -16.78684, 15.47479, -0.63024, 22.82083, 18.11511, 13.89254, 19.32452, 12.15423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, -3.24548, 0.81152, 0, 0, 0, 0, 0, 0, -3.24548, 0.81152, 0, 0, -3.24548, 0.81152 ] }, { "time": 1.0666 } ] @@ -1308,18 +2596,18 @@ { "time": 0.2666 }, { "time": 0.5333, - "offset": 216, - "vertices": [ -2.23, 21.95, 21.54, -4.75 ] + "offset": 138, + "vertices": [ -2.23608, 21.95403, 21.54915, -4.7554 ] }, { "time": 0.6, - "offset": 216, - "vertices": [ 7.17, 15.14, 15.26, -6.91 ] + "offset": 138, + "vertices": [ 7.17962, 15.14358, 15.26523, -6.91741 ] }, { "time": 0.7333, - "offset": 176, - "vertices": [ -0.82, 0.73, -0.01, -1.1, -0.27, 1.06, -1.28, 0.39, 0, 0, 0, 0, 0, 0, 1.48, -2.59, 0.98, 2.82, 2.73, -10.49, 6.12, 8.95, -3.72, -10.18, -2.6, -2.28, 3.43, -0.47, -3.44, -0.39, -2.28, -4.76, 5.08, 1.4, -4.58, -2.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.37, -1.75, 2.22, 0.1, -1.86, -0.75, -2.86, -0.77, 2.45, -1.65 ] + "offset": 110, + "vertices": [ -0.82485, 0.73406, -0.01284, -1.10443, 0, 0, 0, 0, 1.4866, -2.59426, 0.98071, 2.82342, 2.7366, -10.49935, 6.12506, 8.95282, -2.60873, -2.28384, 3.43417, -0.47045, -2.28305, -4.76037, 5.08892, 1.40078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.37966, -1.75515, -2.13229, -0.65667, -2.86239, -0.77365, 2.45989, -1.65319 ] }, { "time": 0.8, "curve": "stepped" }, { "time": 0.9666, "curve": "stepped" }, diff --git a/spine-starling/spine-starling-example/src/raptor.png b/spine-starling/spine-starling-example/src/raptor.png index 861dbce1a..503d1c446 100644 Binary files a/spine-starling/spine-starling-example/src/raptor.png and b/spine-starling/spine-starling-example/src/raptor.png differ diff --git a/spine-starling/spine-starling-example/src/spine/GoblinsExample.as b/spine-starling/spine-starling-example/src/spine/examples/GoblinsExample.as similarity index 97% rename from spine-starling/spine-starling-example/src/spine/GoblinsExample.as rename to spine-starling/spine-starling-example/src/spine/examples/GoblinsExample.as index e8b12a11c..a63248c6d 100644 --- a/spine-starling/spine-starling-example/src/spine/GoblinsExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/GoblinsExample.as @@ -29,8 +29,8 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine { - +package spine.examples { +import spine.*; import spine.atlas.Atlas; import spine.attachments.AtlasAttachmentLoader; import spine.attachments.AttachmentLoader; @@ -65,7 +65,7 @@ public class GoblinsExample extends Sprite { private var skeleton:SkeletonAnimation; public function GoblinsExample () { - var useStarlingAtlas:Boolean = true; + var useStarlingAtlas:Boolean = false; var attachmentLoader:AttachmentLoader; if (useStarlingAtlas) { @@ -81,7 +81,7 @@ public class GoblinsExample extends Sprite { var json:SkeletonJson = new SkeletonJson(attachmentLoader); var skeletonData:SkeletonData = json.readSkeletonData(new GoblinsJson()); - skeleton = new SkeletonAnimation(skeletonData, true); + skeleton = new SkeletonAnimation(skeletonData); skeleton.x = 320; skeleton.y = 420; skeleton.skeleton.skinName = "goblin"; diff --git a/spine-starling/spine-starling-example/src/spine/Main.as b/spine-starling/spine-starling-example/src/spine/examples/Main.as similarity index 92% rename from spine-starling/spine-starling-example/src/spine/Main.as rename to spine-starling/spine-starling-example/src/spine/examples/Main.as index 7636a041c..8d372824c 100644 --- a/spine-starling/spine-starling-example/src/spine/Main.as +++ b/spine-starling/spine-starling-example/src/spine/examples/Main.as @@ -29,7 +29,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine { +package spine.examples { import flash.display.Sprite; @@ -41,13 +41,15 @@ public class Main extends Sprite { public function Main () { var example:Class; - //example = SpineboyExample; - //example = GoblinsExample; - example = RaptorExample; + // example = SpineboyExample; + // example = GoblinsExample; + // example = RaptorExample; + example = TankExample; _starling = new Starling(example, stage); _starling.enableErrorChecking = true; _starling.showStats = true; + _starling.skipUnchangedFrames = false; _starling.start(); } } diff --git a/spine-starling/spine-starling-example/src/spine/RaptorExample.as b/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as similarity index 97% rename from spine-starling/spine-starling-example/src/spine/RaptorExample.as rename to spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as index 29280ec83..fb3289099 100644 --- a/spine-starling/spine-starling-example/src/spine/RaptorExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/RaptorExample.as @@ -29,8 +29,9 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine { +package spine.examples { import spine.atlas.Atlas; +import spine.*; import spine.attachments.AtlasAttachmentLoader; import spine.attachments.AttachmentLoader; import spine.starling.SkeletonAnimation; @@ -64,7 +65,7 @@ public class RaptorExample extends Sprite { json.scale = 0.5; var skeletonData:SkeletonData = json.readSkeletonData(new RaptorJson()); - skeleton = new SkeletonAnimation(skeletonData, true); + skeleton = new SkeletonAnimation(skeletonData); skeleton.x = 400; skeleton.y = 560; skeleton.state.setAnimationByName(0, "walk", true); diff --git a/spine-starling/spine-starling-example/src/spine/SpineboyExample.as b/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as similarity index 97% rename from spine-starling/spine-starling-example/src/spine/SpineboyExample.as rename to spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as index 22ff7b3a5..46dc6a9cd 100644 --- a/spine-starling/spine-starling-example/src/spine/SpineboyExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as @@ -29,8 +29,9 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -package spine { +package spine.examples { import spine.animation.AnimationStateData; +import spine.*; import spine.atlas.Atlas; import spine.attachments.AtlasAttachmentLoader; import spine.attachments.AttachmentLoader; @@ -67,7 +68,7 @@ public class SpineboyExample extends Sprite { stateData.setMixByName("jump", "run", 0.4); stateData.setMixByName("jump", "jump", 0.2); - skeleton = new SkeletonAnimation(skeletonData, false, stateData); + skeleton = new SkeletonAnimation(skeletonData, stateData); skeleton.x = 400; skeleton.y = 560; @@ -85,6 +86,7 @@ public class SpineboyExample extends Sprite { + event.data.name + ": " + event.intValue + ", " + event.floatValue + ", " + event.stringValue); }); + skeleton.skeleton.setToSetupPose(); skeleton.state.setAnimationByName(0, "run", true); skeleton.state.addAnimationByName(0, "jump", false, 3); skeleton.state.addAnimationByName(0, "run", true, 0); diff --git a/spine-starling/spine-starling-example/src/spine/examples/TankExample.as b/spine-starling/spine-starling-example/src/spine/examples/TankExample.as new file mode 100644 index 000000000..bc4108da8 --- /dev/null +++ b/spine-starling/spine-starling-example/src/spine/examples/TankExample.as @@ -0,0 +1,73 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.examples { +import spine.atlas.Atlas; +import spine.*; +import spine.attachments.AtlasAttachmentLoader; +import spine.attachments.AttachmentLoader; +import spine.starling.SkeletonAnimation; +import spine.starling.StarlingTextureLoader; + +import starling.core.Starling; +import starling.display.Sprite; + +public class TankExample extends Sprite { + [Embed(source = "/tank.json", mimeType = "application/octet-stream")] + static public const TankJson:Class; + + [Embed(source = "/tank.atlas", mimeType = "application/octet-stream")] + static public const TankAtlas:Class; + + [Embed(source = "/tank.png")] + static public const TankAtlasTexture:Class; + + private var skeleton:SkeletonAnimation; + + public function TankExample () { + var attachmentLoader:AttachmentLoader; + var spineAtlas:Atlas = new Atlas(new TankAtlas(), new StarlingTextureLoader(new TankAtlasTexture())); + attachmentLoader = new AtlasAttachmentLoader(spineAtlas); + + var json:SkeletonJson = new SkeletonJson(attachmentLoader); + json.scale = 0.5; + var skeletonData:SkeletonData = json.readSkeletonData(new TankJson()); + + skeleton = new SkeletonAnimation(skeletonData); + skeleton.x = 400; + skeleton.y = 560; + skeleton.state.setAnimationByName(0, "drive", true); + + addChild(skeleton); + Starling.juggler.add(skeleton); + } +} +} diff --git a/spine-starling/spine-starling-example/src/spineboy.atlas b/spine-starling/spine-starling-example/src/spineboy.atlas index 19c0934b1..2454a1f47 100644 --- a/spine-starling/spine-starling-example/src/spineboy.atlas +++ b/spine-starling/spine-starling-example/src/spineboy.atlas @@ -1,194 +1,216 @@ spineboy.png +size: 1024,1024 format: RGBA8888 filter: Linear,Linear repeat: none eye_indifferent rotate: true - xy: 389, 5 - size: 56, 53 - orig: 56, 53 + xy: 648, 629 + size: 93, 89 + orig: 93, 89 offset: 0, 0 index: -1 eye_surprised - rotate: false - xy: 580, 34 - size: 56, 53 - orig: 56, 53 + rotate: true + xy: 233, 179 + size: 93, 89 + orig: 93, 89 offset: 0, 0 index: -1 front_bracer rotate: false - xy: 732, 85 - size: 35, 48 - orig: 35, 48 + xy: 245, 2 + size: 58, 80 + orig: 58, 80 offset: 0, 0 index: -1 front_fist_closed rotate: false - xy: 556, 91 - size: 45, 49 - orig: 45, 49 + xy: 168, 45 + size: 75, 82 + orig: 75, 82 offset: 0, 0 index: -1 front_fist_open rotate: false - xy: 668, 32 - size: 52, 52 - orig: 52, 52 + xy: 844, 646 + size: 86, 87 + orig: 86, 87 offset: 0, 0 index: -1 front_foot - rotate: false - xy: 924, 201 - size: 76, 41 - orig: 76, 41 + rotate: true + xy: 310, 326 + size: 126, 69 + orig: 126, 69 offset: 0, 0 index: -1 front_foot_bend1 - rotate: false - xy: 845, 200 - size: 77, 42 - orig: 77, 42 + rotate: true + xy: 951, 894 + size: 128, 70 + orig: 128, 70 offset: 0, 0 index: -1 front_foot_bend2 rotate: false - xy: 778, 186 - size: 65, 56 - orig: 65, 56 + xy: 2, 33 + size: 108, 93 + orig: 108, 93 offset: 0, 0 index: -1 front_shin rotate: true - xy: 444, 91 - size: 49, 110 - orig: 49, 110 + xy: 739, 735 + size: 82, 184 + orig: 82, 184 offset: 0, 0 index: -1 front_thigh - rotate: true - xy: 603, 89 - size: 29, 67 - orig: 29, 67 + rotate: false + xy: 381, 340 + size: 48, 112 + orig: 48, 112 offset: 0, 0 index: -1 front_upper_arm - rotate: true - xy: 672, 86 - size: 32, 58 - orig: 32, 58 + rotate: false + xy: 112, 29 + size: 54, 97 + orig: 54, 97 offset: 0, 0 index: -1 goggles rotate: false - xy: 444, 142 - size: 157, 100 - orig: 157, 100 + xy: 156, 454 + size: 261, 166 + orig: 261, 166 offset: 0, 0 index: -1 gun rotate: false - xy: 603, 120 - size: 126, 122 - orig: 126, 122 + xy: 739, 819 + size: 210, 203 + orig: 210, 203 offset: 0, 0 index: -1 head rotate: false - xy: 279, 63 - size: 163, 179 - orig: 163, 179 + xy: 466, 724 + size: 271, 298 + orig: 271, 298 + offset: 0, 0 + index: -1 +hoverboard_board + rotate: true + xy: 2, 128 + size: 492, 152 + orig: 492, 152 + offset: 0, 0 + index: -1 +hoverboard_thruster + rotate: false + xy: 602, 558 + size: 60, 64 + orig: 60, 64 + offset: 0, 0 + index: -1 +hoverglow_small + rotate: true + xy: 156, 178 + size: 274, 75 + orig: 274, 75 offset: 0, 0 index: -1 mouth_grind - rotate: false - xy: 845, 163 - size: 56, 35 - orig: 56, 35 + rotate: true + xy: 951, 799 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 mouth_oooo - rotate: false - xy: 842, 126 - size: 56, 35 - orig: 56, 35 + rotate: true + xy: 245, 84 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 mouth_smile rotate: false - xy: 769, 97 - size: 56, 35 - orig: 56, 35 + xy: 925, 738 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 muzzle rotate: false - xy: 2, 2 - size: 275, 240 - orig: 277, 240 + xy: 2, 622 + size: 462, 400 + orig: 462, 400 offset: 0, 0 index: -1 neck rotate: false - xy: 903, 173 - size: 22, 25 - orig: 22, 25 + xy: 168, 2 + size: 36, 41 + orig: 36, 41 offset: 0, 0 index: -1 rear_bracer rotate: false - xy: 722, 40 - size: 34, 43 - orig: 34, 43 + xy: 932, 664 + size: 56, 72 + orig: 56, 72 offset: 0, 0 index: -1 rear_foot rotate: false - xy: 444, 11 - size: 68, 36 - orig: 68, 36 + xy: 487, 562 + size: 113, 60 + orig: 113, 60 offset: 0, 0 index: -1 rear_foot_bend1 - rotate: false - xy: 444, 49 - size: 70, 40 - orig: 70, 40 + rotate: true + xy: 419, 503 + size: 117, 66 + orig: 117, 66 offset: 0, 0 index: -1 rear_foot_bend2 rotate: false - xy: 778, 134 - size: 62, 50 - orig: 62, 50 + xy: 739, 650 + size: 103, 83 + orig: 103, 83 offset: 0, 0 index: -1 rear_shin rotate: false - xy: 731, 135 - size: 45, 107 - orig: 45, 107 + xy: 233, 274 + size: 75, 178 + orig: 75, 178 offset: 0, 0 index: -1 rear_thigh rotate: true - xy: 516, 50 - size: 39, 62 - orig: 39, 62 + xy: 487, 495 + size: 65, 104 + orig: 65, 104 offset: 0, 0 index: -1 rear_upper_arm - rotate: false - xy: 638, 35 - size: 28, 52 - orig: 28, 52 + rotate: true + xy: 156, 129 + size: 47, 87 + orig: 47, 87 offset: 0, 0 index: -1 torso rotate: true - xy: 279, 2 - size: 59, 108 - orig: 59, 108 + xy: 466, 624 + size: 98, 180 + orig: 98, 180 offset: 0, 0 index: -1 diff --git a/spine-starling/spine-starling-example/src/spineboy.json b/spine-starling/spine-starling-example/src/spineboy.json index 7b4497712..e9e6e761b 100644 --- a/spine-starling/spine-starling-example/src/spineboy.json +++ b/spine-starling/spine-starling-example/src/spineboy.json @@ -1,39 +1,31 @@ { +"skeleton": { "hash": "rPoYyBLFG6F0CGZ5wsUEBKDJU9U", "spine": "3.4.00", "width": 0, "height": 0, "images": "./images/" }, "bones": [ { "name": "hip", "y": 247.47 }, - { "name": "front_thigh", "parent": "hip", "length": 74.8, "x": -17.45, "y": -11.64, "rotation": -95.51, "color": "00ff04ff" }, - { "name": "rear_thigh", "parent": "hip", "length": 85.71, "x": 8.91, "y": -5.62, "rotation": -72.54, "color": "ff000dff" }, - { "name": "torso", "parent": "hip", "length": 127.55, "x": -1.61, "y": 4.9, "rotation": 103.82, "color": "e0da19ff" }, - { - "name": "front_shin", - "parent": "front_thigh", - "length": 128.76, - "x": 78.69, - "y": 1.6, - "rotation": -2.21, - "inheritScale": false, - "color": "00ff04ff" - }, - { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "x": 103.75, "y": 19.32, "rotation": 168.37, "color": "00ff04ff" }, - { "name": "neck", "parent": "torso", "length": 25.45, "x": 127.49, "y": -0.3, "rotation": -31.53, "color": "e0da19ff" }, - { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "x": 86.1, "y": -1.32, "rotation": -19.83, "color": "ff000dff" }, - { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "x": 92.35, "y": -19.22, "rotation": -169.55, "color": "ff000dff" }, + { "name": "torso", "parent": "hip", "length": 127.55, "rotation": 103.82, "x": -1.61, "y": 4.9, "color": "e0da19ff" }, + { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "rotation": 168.37, "x": 103.75, "y": 19.32, "color": "00ff04ff" }, { "name": "front_bracer", "parent": "front_upper_arm", "length": 40.57, + "rotation": 18.29, "x": 68.8, "y": -0.68, - "rotation": 18.29, "color": "00ff04ff" }, - { "name": "front_foot", "parent": "front_shin", "length": 91.34, "x": 128.75, "y": -0.33, "rotation": 77.9, "color": "00ff04ff" }, - { "name": "head", "parent": "neck", "length": 263.57, "x": 27.66, "y": -0.25, "rotation": 23.18, "color": "e0da19ff" }, - { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "x": 51.35, "rotation": 23.15, "color": "ff000dff" }, - { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "x": 121.45, "y": -0.75, "rotation": 69.3, "color": "ff000dff" }, - { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "x": 40.56, "y": 0.19, "rotation": 12.43, "color": "00ff04ff" }, - { "name": "gun", "parent": "rear_bracer", "length": 43.1, "x": 34.42, "y": -0.45, "rotation": 5.34, "color": "ff000dff" }, - { "name": "gunTip", "parent": "gun", "x": 201.04, "y": 52.13, "rotation": 6.83, "color": "ff000dff" } + { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "rotation": 12.43, "x": 40.56, "y": 0.19, "color": "00ff04ff" }, + { "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" }, + { "name": "front_shin", "parent": "front_thigh", "length": 128.76, "rotation": -2.21, "x": 78.69, "y": 1.6, "color": "00ff04ff" }, + { "name": "front_foot", "parent": "front_shin", "length": 91.34, "rotation": 77.9, "x": 128.75, "y": -0.33, "color": "00ff04ff" }, + { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -169.55, "x": 92.35, "y": -19.22, "color": "ff000dff" }, + { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "rotation": 23.15, "x": 51.35, "color": "ff000dff" }, + { "name": "gun", "parent": "rear_bracer", "length": 43.1, "rotation": 5.34, "x": 34.42, "y": -0.45, "color": "ff000dff" }, + { "name": "gunTip", "parent": "gun", "rotation": 6.83, "x": 201.04, "y": 52.13, "color": "ff000dff" }, + { "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.49, "y": -0.3, "color": "e0da19ff" }, + { "name": "head", "parent": "neck", "length": 263.57, "rotation": 23.18, "x": 27.66, "y": -0.25, "color": "e0da19ff" }, + { "name": "rear_thigh", "parent": "hip", "length": 85.71, "rotation": -72.54, "x": 8.91, "y": -5.62, "color": "ff000dff" }, + { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.83, "x": 86.1, "y": -1.32, "color": "ff000dff" }, + { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "rotation": 69.3, "x": 121.45, "y": -0.75, "color": "ff000dff" } ], "slots": [ { "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" }, @@ -54,7 +46,7 @@ { "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": "muzzle", "bone": "gunTip", "blend": "additive" }, { "name": "head-bb", "bone": "head" } ], "skins": { @@ -96,7 +88,8 @@ "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 ] + "vertexCount": 6, + "vertices": [ -19.14, -70.3, 40.8, -118.07, 257.77, -115.61, 285.16, 57.18, 120.77, 164.95, -5.06, 76.94 ] } }, "mouth": { @@ -1832,10 +1825,6 @@ ] }, "muzzle": { - "attachment": [ - { "time": 0.1333, "name": "muzzle" }, - { "time": 0.2666, "name": null } - ], "color": [ { "time": 0.1333, @@ -1848,6 +1837,10 @@ "curve": [ 0.821, 0, 0.909, 0.89 ] }, { "time": 0.2666, "color": "ffffff00" } + ], + "attachment": [ + { "time": 0.1333, "name": "muzzle" }, + { "time": 0.2666, "name": null } ] } }, @@ -2015,7 +2008,7 @@ ] } }, - "draworder": [ + "drawOrder": [ { "time": 0.6666, "offsets": [ diff --git a/spine-starling/spine-starling-example/src/spineboy.png b/spine-starling/spine-starling-example/src/spineboy.png index dce2fe3e2..2eae82219 100644 Binary files a/spine-starling/spine-starling-example/src/spineboy.png and b/spine-starling/spine-starling-example/src/spineboy.png differ diff --git a/spine-starling/spine-starling-example/src/tank.atlas b/spine-starling/spine-starling-example/src/tank.atlas new file mode 100644 index 000000000..ecf24e7df --- /dev/null +++ b/spine-starling/spine-starling-example/src/tank.atlas @@ -0,0 +1,125 @@ + +tank.png +size: 2048,1024 +format: RGBA8888 +filter: Linear,Linear +repeat: none +images/antenna + rotate: true + xy: 1295, 683 + size: 22, 303 + orig: 22, 303 + offset: 0, 0 + index: -1 +images/cannon + rotate: false + xy: 2, 93 + size: 931, 58 + orig: 931, 58 + offset: 0, 0 + index: -1 +images/cannonConnector + rotate: true + xy: 1676, 455 + size: 112, 135 + orig: 112, 135 + offset: 0, 0 + index: -1 +images/guntower + rotate: false + xy: 1295, 707 + size: 730, 289 + orig: 730, 289 + offset: 0, 0 + index: -1 +images/machinegun + rotate: false + xy: 2, 34 + size: 331, 57 + orig: 331, 57 + offset: 0, 0 + index: -1 +images/machinegun-mount + rotate: false + xy: 1952, 609 + size: 72, 96 + orig: 72, 96 + offset: 0, 0 + index: -1 +images/rock + rotate: false + xy: 935, 96 + size: 252, 55 + orig: 252, 55 + offset: 0, 0 + index: -1 +images/tankBottom + rotate: false + xy: 2, 377 + size: 1285, 276 + orig: 1285, 276 + offset: 0, 0 + index: -1 +images/tankBottom-shadow + rotate: false + xy: 2, 655 + size: 1291, 341 + orig: 1291, 341 + offset: 0, 0 + index: -1 +images/tankTop + rotate: false + xy: 2, 153 + size: 1407, 222 + orig: 1407, 222 + offset: 0, 0 + index: -1 +images/tread + rotate: false + xy: 2, 2 + size: 96, 30 + orig: 96, 30 + offset: 0, 0 + index: -1 +images/tread-inside + rotate: false + xy: 335, 63 + size: 25, 28 + orig: 25, 28 + offset: 0, 0 + index: -1 +images/wheel-big + rotate: false + xy: 1295, 490 + size: 191, 191 + orig: 191, 191 + offset: 0, 0 + index: -1 +images/wheel-big-overlay + rotate: false + xy: 1488, 495 + size: 186, 186 + orig: 186, 186 + offset: 0, 0 + index: -1 +images/wheel-mid + rotate: false + xy: 1676, 569 + size: 136, 136 + orig: 136, 136 + offset: 0, 0 + index: -1 +images/wheel-mid-overlay + rotate: false + xy: 1814, 569 + size: 136, 136 + orig: 136, 136 + offset: 0, 0 + index: -1 +images/wheel-small + rotate: false + xy: 1813, 496 + size: 71, 71 + orig: 71, 71 + offset: 0, 0 + index: -1 diff --git a/spine-starling/spine-starling-example/src/tank.json b/spine-starling/spine-starling-example/src/tank.json new file mode 100644 index 000000000..c26ccbe47 --- /dev/null +++ b/spine-starling/spine-starling-example/src/tank.json @@ -0,0 +1,1899 @@ +{ +"skeleton": { "hash": "kgtyty1lpfv5JU2lygtFi2u3oQQ", "spine": "3.3.07", "width": 1914.53, "height": 964.05, "images": "" }, +"bones": [ + { "name": "root" }, + { "name": "tankRoot", "parent": "root", "y": 200 }, + { "name": "tankTreads", "parent": "tankRoot" }, + { "name": "tankBody", "parent": "tankTreads", "y": 10 }, + { "name": "guntower", "parent": "tankBody", "x": -21.72, "y": 245.47 }, + { "name": "antennaRoot", "parent": "guntower", "x": 164.6, "y": 202.52 }, + { "name": "antenna1", "parent": "antennaRoot", "length": 40, "rotation": 90, "y": 39.99, "color": "ffee00ff" }, + { "name": "antenna2", "parent": "antenna1", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna3", "parent": "antenna2", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna4", "parent": "antenna3", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna5", "parent": "antenna4", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna6", "parent": "antenna5", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "cannonConnector", "parent": "guntower", "x": -235.04, "y": 96.07 }, + { "name": "cannonTarget", "parent": "tankRoot", "x": -1486.66, "y": 351.82, "color": "ff3f00ff" }, + { "name": "cannon", "parent": "cannonConnector", "length": 946.68, "rotation": 180, "color": "ff4000ff" }, + { "name": "cannonTip", "parent": "cannon", "x": 946.68, "color": "ff4000ff" }, + { "name": "machineGunTarget", "parent": "tankRoot", "x": -1474, "y": 559.42, "color": "ff3f00ff" }, + { + "name": "machinegun-mount", + "parent": "guntower", + "length": 90.97, + "rotation": 90, + "x": -123.72, + "y": 218.32, + "color": "15ff00ff" + }, + { + "name": "machinegun", + "parent": "machinegun-mount", + "length": 208.94, + "rotation": 90, + "x": 91.52, + "y": -1.03, + "color": "15ff00ff" + }, + { "name": "machinegun-tip", "parent": "machinegun", "x": 210.42, "y": -12.2 }, + { "name": "rock", "parent": "root", "x": -656.45 }, + { + "name": "tread", + "parent": "tankRoot", + "length": 82, + "rotation": 180, + "x": -22.89, + "y": 213.85, + "scaleX": 0.993, + "color": "e64344ff" + }, + { "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread3", "parent": "tread2", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread4", "parent": "tread3", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread5", "parent": "tread4", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread6", "parent": "tread5", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread7", "parent": "tread6", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread8", "parent": "tread7", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread9", "parent": "tread8", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread10", "parent": "tread9", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread11", "parent": "tread10", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread12", "parent": "tread11", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread13", "parent": "tread12", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread14", "parent": "tread13", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread15", "parent": "tread14", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread16", "parent": "tread15", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread17", "parent": "tread16", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread18", "parent": "tread17", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread19", "parent": "tread18", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread20", "parent": "tread19", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread21", "parent": "tread20", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread22", "parent": "tread21", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread23", "parent": "tread22", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread24", "parent": "tread23", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread25", "parent": "tread24", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread26", "parent": "tread25", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread27", "parent": "tread26", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread28", "parent": "tread27", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread29", "parent": "tread28", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread30", "parent": "tread29", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread31", "parent": "tread30", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread32", "parent": "tread31", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread33", "parent": "tread32", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread34", "parent": "tread33", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread35", "parent": "tread34", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread36", "parent": "tread35", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "wheel-midCenter", "parent": "tankRoot", "y": -114.56 }, + { "name": "treadCollider1", "parent": "wheel-midCenter", "x": -329.57, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider2", "parent": "wheel-midCenter", "x": -165.95, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider3", "parent": "wheel-midCenter", "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider4", "parent": "wheel-midCenter", "x": 163.56, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider5", "parent": "wheel-midCenter", "x": 329.12, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadGravity1", "parent": "tankRoot", "rotation": 180, "x": -175.35, "y": 109.99, "color": "ff00fbff" }, + { "name": "treadGravity2", "parent": "tankRoot", "rotation": 180, "x": 177.88, "y": 105.45, "color": "ff00fbff" }, + { "name": "wheel-bigRoot1", "parent": "tankTreads", "x": -549.59, "y": 14.39, "color": "abe323ff" }, + { "name": "wheel-big1", "parent": "wheel-bigRoot1", "x": -0.02, "color": "abe323ff" }, + { "name": "wheel-bigRoot2", "parent": "tankTreads", "x": 547.33, "y": 14.39 }, + { "name": "wheel-big2", "parent": "wheel-bigRoot2" }, + { "name": "wheel-midRoot1", "parent": "wheel-midCenter", "x": -410.57, "color": "abe323ff" }, + { "name": "wheel-mid1", "parent": "wheel-midRoot1", "color": "abe323ff" }, + { "name": "wheel-midRoot2", "parent": "wheel-midCenter", "x": -246.95 }, + { "name": "wheel-mid2", "parent": "wheel-midRoot2" }, + { "name": "wheel-midRoot3", "parent": "wheel-midCenter", "x": -82.72 }, + { "name": "wheel-mid3", "parent": "wheel-midRoot3" }, + { "name": "wheel-midRoot4", "parent": "wheel-midCenter", "x": 80.89 }, + { "name": "wheel-mid4", "parent": "wheel-midRoot4" }, + { "name": "wheel-midRoot5", "parent": "wheel-midCenter", "x": 244.51 }, + { "name": "wheel-mid5", "parent": "wheel-midRoot5" }, + { "name": "wheel-midRoot6", "parent": "wheel-midCenter", "x": 408.73 }, + { "name": "wheel-mid6", "parent": "wheel-midRoot6" }, + { "name": "wheel-smallRoot1", "parent": "tankTreads", "x": -337.38, "y": 109.43 }, + { "name": "wheel-small1", "parent": "wheel-smallRoot1", "color": "abe323ff" }, + { "name": "wheel-smallRoot2", "parent": "tankTreads", "x": 0.08, "y": 109.43 }, + { "name": "wheel-small2", "parent": "wheel-smallRoot2" }, + { "name": "wheel-smallRoot3", "parent": "tankTreads", "x": 334.68, "y": 109.43 }, + { "name": "wheel-small3", "parent": "wheel-smallRoot3" } +], +"slots": [ + { "name": "tankBody-shadow", "bone": "tankBody", "color": "ffffffb9", "attachment": "images/tankBottom-shadow" }, + { "name": "bottom", "bone": "tankBody", "attachment": "images/tankBottom" }, + { "name": "tread-inside1", "bone": "tread", "attachment": "images/tread-inside" }, + { "name": "tread-inside53", "bone": "tread27", "attachment": "images/tread-inside" }, + { "name": "tread-inside27", "bone": "tread14", "attachment": "images/tread-inside" }, + { "name": "tread-inside3", "bone": "tread2", "attachment": "images/tread-inside" }, + { "name": "tread-inside55", "bone": "tread28", "attachment": "images/tread-inside" }, + { "name": "tread-inside29", "bone": "tread15", "attachment": "images/tread-inside" }, + { "name": "tread-inside5", "bone": "tread3", "attachment": "images/tread-inside" }, + { "name": "tread-inside57", "bone": "tread29", "attachment": "images/tread-inside" }, + { "name": "tread-inside31", "bone": "tread16", "attachment": "images/tread-inside" }, + { "name": "tread-inside7", "bone": "tread4", "attachment": "images/tread-inside" }, + { "name": "tread-inside59", "bone": "tread30", "attachment": "images/tread-inside" }, + { "name": "tread-inside33", "bone": "tread17", "attachment": "images/tread-inside" }, + { "name": "tread-inside9", "bone": "tread5", "attachment": "images/tread-inside" }, + { "name": "tread-inside61", "bone": "tread31", "attachment": "images/tread-inside" }, + { "name": "tread-inside35", "bone": "tread18", "attachment": "images/tread-inside" }, + { "name": "tread-inside11", "bone": "tread6", "attachment": "images/tread-inside" }, + { "name": "tread-inside63", "bone": "tread32", "attachment": "images/tread-inside" }, + { "name": "tread-inside37", "bone": "tread19", "attachment": "images/tread-inside" }, + { "name": "tread-inside13", "bone": "tread7", "attachment": "images/tread-inside" }, + { "name": "tread-inside65", "bone": "tread33", "attachment": "images/tread-inside" }, + { "name": "tread-inside39", "bone": "tread20", "attachment": "images/tread-inside" }, + { "name": "tread-inside15", "bone": "tread8", "attachment": "images/tread-inside" }, + { "name": "tread-inside67", "bone": "tread34", "attachment": "images/tread-inside" }, + { "name": "tread-inside69", "bone": "tread35", "attachment": "images/tread-inside" }, + { "name": "tread-inside71", "bone": "tread36", "attachment": "images/tread-inside" }, + { "name": "tread-inside41", "bone": "tread21", "attachment": "images/tread-inside" }, + { "name": "tread-inside17", "bone": "tread9", "attachment": "images/tread-inside" }, + { "name": "tread-inside43", "bone": "tread22", "attachment": "images/tread-inside" }, + { "name": "tread-inside19", "bone": "tread10", "attachment": "images/tread-inside" }, + { "name": "tread-inside45", "bone": "tread23", "attachment": "images/tread-inside" }, + { "name": "tread-inside21", "bone": "tread11", "attachment": "images/tread-inside" }, + { "name": "tread-inside47", "bone": "tread24", "attachment": "images/tread-inside" }, + { "name": "tread-inside23", "bone": "tread12", "attachment": "images/tread-inside" }, + { "name": "tread-inside49", "bone": "tread25", "attachment": "images/tread-inside" }, + { "name": "tread-inside25", "bone": "tread13", "attachment": "images/tread-inside" }, + { "name": "tread-inside51", "bone": "tread26", "attachment": "images/tread-inside" }, + { "name": "tread-inside2", "bone": "tread", "attachment": "images/tread-inside" }, + { "name": "tread-inside54", "bone": "tread27", "attachment": "images/tread-inside" }, + { "name": "tread-inside28", "bone": "tread14", "attachment": "images/tread-inside" }, + { "name": "tread-inside4", "bone": "tread2", "attachment": "images/tread-inside" }, + { "name": "tread-inside56", "bone": "tread28", "attachment": "images/tread-inside" }, + { "name": "tread-inside30", "bone": "tread15", "attachment": "images/tread-inside" }, + { "name": "tread-inside6", "bone": "tread3", "attachment": "images/tread-inside" }, + { "name": "tread-inside58", "bone": "tread29", "attachment": "images/tread-inside" }, + { "name": "tread-inside32", "bone": "tread16", "attachment": "images/tread-inside" }, + { "name": "tread-inside8", "bone": "tread4", "attachment": "images/tread-inside" }, + { "name": "tread-inside60", "bone": "tread30", "attachment": "images/tread-inside" }, + { "name": "tread-inside34", "bone": "tread17", "attachment": "images/tread-inside" }, + { "name": "tread-inside10", "bone": "tread5", "attachment": "images/tread-inside" }, + { "name": "tread-inside62", "bone": "tread31", "attachment": "images/tread-inside" }, + { "name": "tread-inside36", "bone": "tread18", "attachment": "images/tread-inside" }, + { "name": "tread-inside12", "bone": "tread6", "attachment": "images/tread-inside" }, + { "name": "tread-inside64", "bone": "tread32", "attachment": "images/tread-inside" }, + { "name": "tread-inside38", "bone": "tread19", "attachment": "images/tread-inside" }, + { "name": "tread-inside14", "bone": "tread7", "attachment": "images/tread-inside" }, + { "name": "tread-inside66", "bone": "tread33", "attachment": "images/tread-inside" }, + { "name": "tread-inside40", "bone": "tread20", "attachment": "images/tread-inside" }, + { "name": "tread-inside16", "bone": "tread8", "attachment": "images/tread-inside" }, + { "name": "tread-inside68", "bone": "tread34", "attachment": "images/tread-inside" }, + { "name": "tread-inside70", "bone": "tread35", "attachment": "images/tread-inside" }, + { "name": "tread-inside72", "bone": "tread36", "attachment": "images/tread-inside" }, + { "name": "tread-inside42", "bone": "tread21", "attachment": "images/tread-inside" }, + { "name": "tread-inside18", "bone": "tread9", "attachment": "images/tread-inside" }, + { "name": "tread-inside44", "bone": "tread22", "attachment": "images/tread-inside" }, + { "name": "tread-inside20", "bone": "tread10", "attachment": "images/tread-inside" }, + { "name": "tread-inside46", "bone": "tread23", "attachment": "images/tread-inside" }, + { "name": "tread-inside22", "bone": "tread11", "attachment": "images/tread-inside" }, + { "name": "tread-inside48", "bone": "tread24", "attachment": "images/tread-inside" }, + { "name": "tread-inside24", "bone": "tread12", "attachment": "images/tread-inside" }, + { "name": "tread-inside50", "bone": "tread25", "attachment": "images/tread-inside" }, + { "name": "tread-inside26", "bone": "tread13", "attachment": "images/tread-inside" }, + { "name": "tread-inside52", "bone": "tread26", "attachment": "images/tread-inside" }, + { "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "images/wheel-big" }, + { "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "images/wheel-big" }, + { "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "images/wheel-mid" }, + { "name": "wheel-small", "bone": "wheel-small1", "attachment": "images/wheel-small" }, + { "name": "wheel-small2", "bone": "wheel-small2", "attachment": "images/wheel-small" }, + { "name": "wheel-small3", "bone": "wheel-small3", "attachment": "images/wheel-small" }, + { + "name": "wheel-mid-overlay", + "bone": "wheel-midRoot1", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay2", + "bone": "wheel-midRoot2", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay3", + "bone": "wheel-midRoot3", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay4", + "bone": "wheel-midRoot4", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay5", + "bone": "wheel-midRoot5", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay6", + "bone": "wheel-midRoot6", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-big-overlay1", + "bone": "wheel-bigRoot1", + "color": "ffffffe9", + "attachment": "images/wheel-big-overlay", + "blend": "multiply" + }, + { + "name": "wheel-big-overlay2", + "bone": "wheel-bigRoot2", + "color": "ffffffe9", + "attachment": "images/wheel-big-overlay", + "blend": "multiply" + }, + { "name": "treads", "bone": "tankRoot", "attachment": "treads" }, + { "name": "tread", "bone": "tread", "color": "c0974fff", "attachment": "images/tread" }, + { "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread14", "bone": "tread14", "attachment": "images/tread" }, + { "name": "tread2", "bone": "tread2", "attachment": "images/tread" }, + { "name": "tread28", "bone": "tread28", "attachment": "images/tread" }, + { "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread16", "bone": "tread16", "attachment": "images/tread" }, + { "name": "tread4", "bone": "tread4", "attachment": "images/tread" }, + { "name": "tread30", "bone": "tread30", "attachment": "images/tread" }, + { "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread18", "bone": "tread18", "attachment": "images/tread" }, + { "name": "tread6", "bone": "tread6", "attachment": "images/tread" }, + { "name": "tread32", "bone": "tread32", "attachment": "images/tread" }, + { "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread20", "bone": "tread20", "attachment": "images/tread" }, + { "name": "tread8", "bone": "tread8", "attachment": "images/tread" }, + { "name": "tread34", "bone": "tread34", "attachment": "images/tread" }, + { "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread22", "bone": "tread22", "attachment": "images/tread" }, + { "name": "tread10", "bone": "tread10", "attachment": "images/tread" }, + { "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread24", "bone": "tread24", "attachment": "images/tread" }, + { "name": "tread12", "bone": "tread12", "attachment": "images/tread" }, + { "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread26", "bone": "tread26", "attachment": "images/tread" }, + { "name": "rock", "bone": "rock", "attachment": "images/rock" }, + { "name": "machinegun", "bone": "machinegun", "attachment": "images/machinegun" }, + { "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "images/machinegun-mount" }, + { "name": "tankTop", "bone": "tankBody", "attachment": "images/tankTop" }, + { "name": "guntower", "bone": "guntower", "attachment": "images/guntower" }, + { "name": "cannon", "bone": "cannon", "attachment": "images/cannon" }, + { "name": "cannonConnector", "bone": "cannonConnector", "attachment": "images/cannonConnector" }, + { "name": "antenna", "bone": "antennaRoot", "attachment": "images/antenna" } +], +"ik": [ + { + "name": "cannonTarget", + "bones": [ "cannon" ], + "target": "cannonTarget" + }, + { + "name": "machineGunTarget", + "bones": [ "machinegun" ], + "target": "machineGunTarget", + "mix": 0 + } +], +"transform": [ + { + "name": "wheel-big", + "bones": [ "wheel-big2" ], + "target": "wheel-big1", + "rotation": 65.6, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid1", + "bones": [ "wheel-mid2", "wheel-mid4" ], + "target": "wheel-mid1", + "rotation": 93, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid2", + "bones": [ "wheel-mid3", "wheel-mid5" ], + "target": "wheel-mid1", + "rotation": -89, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid3", + "bones": [ "wheel-mid6" ], + "target": "wheel-mid1", + "rotation": -152.6, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-small1", + "bones": [ "wheel-small2" ], + "target": "wheel-small1", + "rotation": 87, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-small2", + "bones": [ "wheel-small3" ], + "target": "wheel-small1", + "rotation": 54.9, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + } +], +"path": [ + { + "name": "treads", + "bones": [ + "tread", + "tread2", + "tread3", + "tread4", + "tread5", + "tread6", + "tread7", + "tread8", + "tread9", + "tread10", + "tread11", + "tread12", + "tread13", + "tread14", + "tread15", + "tread16", + "tread17", + "tread18", + "tread19", + "tread20", + "tread21", + "tread22", + "tread23", + "tread24", + "tread25", + "tread26", + "tread27", + "tread28", + "tread29", + "tread30", + "tread31", + "tread32", + "tread33", + "tread34", + "tread35", + "tread36" + ], + "target": "treads", + "rotateMode": "chain" + } +], +"skins": { + "default": { + "antenna": { + "images/antenna": { + "type": "mesh", + "uvs": [ 0.64286, 0.07875, 0.65354, 0.15349, 0.66324, 0.22137, 0.67367, 0.29433, 0.68383, 0.36543, 0.69359, 0.43374, 0.7031, 0.50029, 0.71311, 0.5703, 0.72327, 0.64138, 0.73406, 0.71688, 0.7444, 0.78929, 0.75614, 0.8714, 0.76905, 0.9431, 1, 0.9431, 1, 1, 0, 1, 0, 0.9431, 0.20105, 0.9431, 0.20105, 0.87093, 0.21461, 0.78846, 0.22651, 0.71606, 0.23885, 0.64098, 0.25035, 0.57104, 0.26206, 0.49983, 0.27306, 0.4329, 0.2843, 0.36453, 0.29592, 0.29381, 0.308, 0.22037, 0.319, 0.15345, 0.33141, 0.07795, 0.34423, 0, 0.6316, 0 ], + "triangles": [ 30, 31, 0, 29, 30, 0, 29, 0, 1, 28, 29, 1, 28, 1, 2, 27, 28, 2, 27, 2, 3, 26, 3, 4, 25, 26, 4, 25, 4, 5, 26, 27, 3, 24, 5, 6, 23, 24, 6, 7, 23, 6, 24, 25, 5, 22, 7, 8, 21, 22, 8, 21, 8, 9, 7, 22, 23, 20, 9, 10, 19, 20, 10, 20, 21, 9, 19, 10, 11, 18, 19, 11, 17, 18, 11, 17, 11, 12, 15, 16, 17, 12, 13, 14, 15, 17, 12, 14, 15, 12 ], + "vertices": [ 2, 10, 65.37999, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 3, 9, 84.73, -3.37, 0.0625, 10, 42.73, -3.37, 0.625, 11, 0.73, -3.37, 0.3125, 3, 9, 64.16, -3.59, 0.3125, 10, 22.16, -3.59, 0.625, 11, -19.83, -3.59, 0.0625, 3, 8, 84.06, -3.82, 0.0625, 9, 42.06, -3.82, 0.625, 10, 0.06, -3.82, 0.3125, 3, 8, 62.51, -4.04, 0.3125, 9, 20.51, -4.04, 0.625, 10, -21.48, -4.04, 0.0625, 3, 7, 83.81, -4.25, 0.0625, 8, 41.81, -4.25, 0.625, 9, -0.18, -4.25, 0.3125, 3, 7, 63.65, -4.46, 0.3125, 8, 21.65, -4.46, 0.625, 9, -20.34, -4.46, 0.0625, 3, 6, 84.43, -4.67999, 0.0625, 7, 42.43, -4.67999, 0.625, 8, 0.43, -4.67999, 0.3125, 3, 6, 62.9, -4.91, 0.3125, 7, 20.9, -4.91, 0.625, 8, -21.09, -4.91, 0.0625, 3, 5, 5.14, 80.01999, 0.0625, 6, 40.02, -5.14, 0.625, 7, -1.97, -5.14, 0.3125, 3, 5, 5.37, 58.08, 0.375, 6, 18.08, -5.37, 0.5625, 7, -23.91, -5.37, 0.0625, 1, 5, 5.63, 33.2, 1, 1, 5, 5.91, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 10.99, -5.75, 1, 1, 5, -11, -5.75, 1, 1, 5, -10.99, 11.48, 1, 1, 5, -6.57, 11.48, 1, 1, 5, -6.57, 33.34, 1, 3, 5, -6.27, 58.33, 0.375, 6, 18.33, 6.27, 0.5625, 7, -23.66, 6.27, 0.0625, 3, 5, -6.01, 80.26999, 0.0625, 6, 40.27, 6.01, 0.625, 7, -1.72, 6.01, 0.3125, 3, 6, 63.02, 5.74, 0.3125, 7, 21.02, 5.74, 0.625, 8, -20.96999, 5.74, 0.0625, 3, 6, 84.21, 5.49, 0.0625, 7, 42.21, 5.49, 0.625, 8, 0.21, 5.49, 0.3125, 3, 7, 63.79, 5.23, 0.3125, 8, 21.79, 5.23, 0.625, 9, -20.2, 5.23, 0.0625, 3, 7, 84.07, 4.98999, 0.0625, 8, 42.07, 4.98999, 0.625, 9, 0.07, 4.98999, 0.3125, 3, 8, 62.78, 4.73999, 0.3125, 9, 20.78, 4.73999, 0.625, 10, -21.21, 4.73999, 0.0625, 3, 8, 84.21, 4.48, 0.0625, 9, 42.21, 4.48, 0.625, 10, 0.21, 4.48, 0.3125, 3, 9, 64.46, 4.21999, 0.3125, 10, 22.46, 4.21999, 0.625, 11, -19.53, 4.21999, 0.0625, 3, 9, 84.74, 3.98, 0.0625, 10, 42.74, 3.98, 0.625, 11, 0.74, 3.98, 0.3125, 2, 10, 65.62, 3.7, 0.3125, 11, 23.62, 3.7, 0.6875, 1, 11, 47.24, 3.42, 1, 1, 11, 47.24, -2.89, 1 ], + "hull": 32, + "edges": [ 28, 30, 28, 26, 30, 32, 26, 24, 24, 22, 32, 34, 34, 24, 34, 36, 36, 22, 60, 62, 38, 36, 20, 22, 38, 20, 40, 38, 18, 20, 40, 18, 42, 40, 16, 18, 42, 16, 44, 42, 14, 16, 44, 14, 46, 44, 12, 14, 46, 12, 48, 46, 10, 12, 48, 10, 50, 48, 8, 10, 50, 8, 52, 50, 6, 8, 52, 6, 54, 52, 4, 6, 54, 4, 56, 54, 2, 4, 56, 2, 60, 58, 58, 56, 62, 0, 0, 2, 58, 0 ], + "width": 22, + "height": 303 + } + }, + "bottom": { + "images/tankBottom": { "x": -16.66, "y": 9.89, "width": 1285, "height": 276 } + }, + "cannon": { + "images/cannon": { "x": 481.95, "y": -0.02, "rotation": 179.99, "width": 931, "height": 58 } + }, + "cannonConnector": { + "images/cannonConnector": { + "type": "mesh", + "uvs": [ 1, 0.03236, 1, 0.10602, 0.90987, 0.32859, 0.81975, 0.55116, 0.72962, 0.77372, 0.6395, 0.99629, 0.42157, 0.99629, 0.20364, 0.99629, 0, 0.85433, 0, 0.69901, 0.02267, 0.52884, 0, 0.31444, 0.21601, 0.12998, 0.43367, 0, 0.63546, 0.0037, 0.48407, 0.77059, 0.31496, 0.52496, 0.64132, 0.19648, 0.21516, 0.76765, 0.58345, 0.5647, 0.68444, 0.40146, 0.46758, 0.36649, 0.28934, 0.34603 ], + "triangles": [ 21, 22, 12, 11, 12, 22, 17, 21, 13, 17, 13, 14, 21, 12, 13, 21, 17, 20, 16, 22, 21, 10, 11, 22, 10, 22, 16, 19, 21, 20, 16, 21, 19, 18, 10, 16, 9, 10, 18, 15, 16, 19, 18, 16, 15, 8, 9, 18, 7, 8, 18, 6, 18, 15, 7, 18, 6, 14, 0, 1, 17, 14, 1, 2, 17, 1, 20, 17, 2, 3, 20, 2, 19, 20, 3, 4, 19, 3, 15, 19, 4, 5, 15, 4, 6, 15, 5 ], + "vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.13, 1, 1, 12, 25.81, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.04, 1, 2, 12, -28.87, -61.04, 0.33333, 14, 28.87, 61.03, 0.66666, 1, 14, 53.27, 61.01, 1, 1, 14, 76.08, 41.83, 1, 1, 14, 71.17, 21.62, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.37, -29.12, 1, 1, 14, 50.66, -56.13, 1, 2, 12, -28.43, 74.37, 0.41, 14, 28.43, -74.39, 0.58999, 2, 12, -4.91, 72.94999, 0.52, 14, 4.91, -72.94999, 0.48, 2, 12, -21.87, -30.57, 0.49, 14, 21.87, 30.56, 0.51, 1, 14, 40.81, -2.59999, 1, 2, 12, -4.25, 46.92, 0.49, 14, 4.25, -46.92, 0.51, 1, 14, 51.98, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.77, 0.51, 2, 12, 0.56, 19.25, 0.49, 14, -0.56, -19.25, 0.51, 1, 14, 23.71, -23.98, 1, 1, 14, 43.68, -26.76, 1 ], + "hull": 15, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 0 ], + "width": 112, + "height": 135 + } + }, + "guntower": { + "images/guntower": { "x": 77.22, "y": 122.58, "width": 730, "height": 289 } + }, + "machinegun": { + "images/machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 } + }, + "machinegun-mount": { + "images/machinegun-mount": { "x": 47.42, "y": -1.53, "rotation": -90, "width": 72, "height": 96 } + }, + "rock": { + "images/rock": { "color": "404040ff", "x": 25.23, "y": 27.35, "width": 252, "height": 55 } + }, + "tankBody-shadow": { + "images/tankBottom-shadow": { "x": -11.43, "y": -42.88, "width": 1291, "height": 341 } + }, + "tankTop": { + "images/tankTop": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 } + }, + "tread": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread-inside1": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside10": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside11": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside12": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside13": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside14": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside15": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside16": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside17": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside18": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside19": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside2": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside20": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside21": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside22": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside23": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside24": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside25": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside26": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside27": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside28": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside29": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside3": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside30": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside31": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside32": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside33": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside34": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside35": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside36": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside37": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside38": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside39": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside4": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside40": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside41": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside42": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside43": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside44": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside45": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside46": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside47": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside48": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside49": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside5": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside50": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside51": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside52": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside53": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside54": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside55": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside56": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside57": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside58": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside59": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside6": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside60": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside61": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside62": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside63": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside64": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside65": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside66": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside67": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside68": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside69": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside7": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside70": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside71": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside72": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside8": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside9": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread10": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread11": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread12": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread13": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread14": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread15": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread16": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread17": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread18": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread19": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread2": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread20": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread21": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread22": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread23": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread24": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread25": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread26": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread27": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread28": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread29": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread3": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread30": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread31": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread32": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread33": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread34": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread35": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread36": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread4": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread5": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread6": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread7": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread8": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread9": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "treads": { + "treads": { + "type": "path", + "closed": true, + "lengths": [ 182.41, 349, 472.77, 602.99, 780.46, 1052.96, 1133.44, 1218.43, 1298.34, 1382.7, 1465.57, 1546.11, 1628.02, 1707.73, 1794.36, 1876.75, 2158.69, 2321.34, 2438.56, 2579.42, 2745.35, 2919.23 ], + "vertexCount": 66, + "vertices": [ 1, 83, 11.23, 41.86, 1, 1, 83, 0.78, 41.93999, 1, 1, 83, -34.72, 42.23, 1, 1, 63, -104.21, 0.41, 1, 1, 63, 0.07, 0.55, 1, 1, 63, 68.8, 0.64, 1, 1, 81, 20.5, 43.47, 1, 1, 81, 1.13, 40.81, 1, 1, 81, -27.38, 36.84, 1, 1, 65, 147.06, 105, 1, 1, 65, 96.21, 96.63, 1, 1, 65, 43.87, 87.71, 1, 1, 65, 16.18, 103.34, 1, 1, 65, -33.66999, 94.2, 1, 1, 65, -99.35, 81.25, 1, 1, 65, -122.04, -1.69, 1, 1, 65, -83.58, -47.92, 1, 1, 65, -33.53, -109.36, 1, 1, 69, -83.56, -66.08999, 1, 1, 69, -2.16, -67.89, 1, 2, 69, 56.68, -41.48, 0.67999, 58, -24.31, -41.49, 0.32, 1, 58, -26.58, 16.69, 1, 1, 58, -2.69, 16.69, 1, 1, 58, 13.51, 16.69, 1, 2, 71, -52.41, -46.51, 0.74399, 58, 30.2, -46.51, 0.256, 1, 71, -0.32, -68.92, 1, 2, 71, 52.09, -44.72, 0.712, 59, -28.9, -44.73, 0.28799, 1, 59, -22.8, 16.24, 1, 1, 59, -1.42, 16.24, 1, 1, 59, 20.46999, 16.24, 1, 2, 73, -47.21, -47.45, 0.744, 59, 36.00999, -47.46, 0.25599, 1, 73, -0.28, -69.65, 1, 2, 73, 45.23, -47.26, 0.736, 60, -37.48, -47.26, 0.26399, 1, 60, -23.76, 15.27, 1, 1, 60, -0.13, 15.27, 1, 1, 60, 24.45, 15.27, 1, 2, 75, -47.36, -48.7, 0.74399, 60, 33.52, -48.7, 0.256, 1, 75, -0.49, -70.39, 1, 2, 75, 49.09, -48.33, 0.744, 61, -33.57, -48.34, 0.25599, 1, 61, -20.89, 15.83, 1, 1, 61, -1.25, 15.83, 1, 1, 61, 15.78, 15.83, 1, 2, 77, -52.49, -48.21, 0.75999, 61, 28.45, -48.21, 0.24, 1, 77, -2.5, -68.92, 1, 2, 77, 55.72, -47.82, 0.752, 62, -28.88, -47.82, 0.248, 1, 62, -21.64, 16.69, 1, 1, 62, -0.48, 16.69, 1, 1, 62, 20.73, 16.69, 1, 2, 79, -53.65, -48.89, 0.76, 62, 25.96, -48.89, 0.23999, 1, 79, 2.27, -69.65, 1, 1, 79, 44.94, -69.74, 1, 1, 65, 1172.98, -85.6, 1, 1, 65, 1190.53, -42.24, 1, 1, 65, 1215.63, 19.75, 1, 1, 65, 1175.55, 76.62, 1, 1, 65, 1134.22, 95.07, 1, 1, 65, 1128.4, 97.66, 1, 1, 65, 1081.79, 87.47, 1, 1, 65, 1017.16, 92.52, 1, 1, 65, 977.9, 95.58, 1, 1, 85, 47.07, 42.29, 1, 1, 85, 0.24, 42.74, 1, 1, 85, -29.63, 43.28, 1, 1, 64, -86.64, 1.35, 1, 1, 64, 0.49, 0.25, 1, 1, 64, 92.42, -0.89, 1 ] + } + }, + "wheel-big": { + "images/wheel-big": { "width": 191, "height": 191 } + }, + "wheel-big-overlay1": { + "images/wheel-big-overlay": { "width": 186, "height": 186 } + }, + "wheel-big-overlay2": { + "images/wheel-big-overlay": { "width": 186, "height": 186 } + }, + "wheel-big2": { + "images/wheel-big": { "width": 191, "height": 191 } + }, + "wheel-mid": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay2": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay3": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay4": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay5": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay6": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid2": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid3": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid4": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid5": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid6": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-small": { + "images/wheel-small": { "width": 71, "height": 71 } + }, + "wheel-small2": { + "images/wheel-small": { "width": 71, "height": 71 } + }, + "wheel-small3": { + "images/wheel-small": { "width": 71, "height": 71 } + } + } +}, +"animations": { + "drive": { + "bones": { + "tankRoot": { + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.549, 0, 0.907, 0.84 ] + }, + { + "time": 3.0333, + "x": -1426.14, + "y": 0, + "curve": [ 0.211, 0.23, 0.851, 0.92 ] + }, + { + "time": 4.8666, + "x": -2806.98, + "y": 0, + "curve": [ 0.253, 0.27, 0.625, 0.94 ] + }, + { "time": 5.3333, "x": -2903.34, "y": 0 } + ] + }, + "wheel-midRoot1": { + "translate": [ + { "time": 0.7666, "x": 0, "y": 0 }, + { + "time": 1.1666, + "x": 0, + "y": 50.95, + "curve": [ 0.633, 0, 0.907, 0.82 ] + }, + { "time": 1.5666, "x": 0, "y": 0 } + ] + }, + "treadCollider1": { + "rotate": [ + { "time": 1.1, "angle": 0 }, + { "time": 1.2333, "angle": -19.78 }, + { "time": 1.4666, "angle": 0 }, + { "time": 1.6, "angle": 28.87 }, + { "time": 1.8, "angle": 0 } + ], + "translate": [ + { "time": 1.1, "x": 0, "y": 0 }, + { + "time": 1.4666, + "x": 0, + "y": 58.66, + "curve": [ 0.352, 0, 0.828, 0.92 ] + }, + { "time": 1.8, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot2": { + "translate": [ + { "time": 1.2666, "x": 0, "y": 0 }, + { + "time": 1.6333, + "x": 0, + "y": 55.07, + "curve": [ 0.889, 0.01, 0.843, 0.81 ] + }, + { "time": 1.9333, "x": 0, "y": 0 } + ] + }, + "treadCollider2": { + "rotate": [ + { "time": 1.5333, "angle": 0 }, + { "time": 1.6333, "angle": -18.67 }, + { "time": 1.8, "angle": 0 }, + { "time": 1.9, "angle": 29.49 }, + { "time": 2.0666, "angle": 0 } + ], + "translate": [ + { + "time": 1.5333, + "x": 0, + "y": 0, + "curve": [ 0.16, 0.25, 0.813, 0.82 ] + }, + { + "time": 1.8, + "x": 0, + "y": 59.03, + "curve": [ 0.376, 0.26, 0.879, 0.79 ] + }, + { "time": 2.0666, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot3": { + "translate": [ + { "time": 1.6666, "x": 0, "y": 0 }, + { + "time": 1.9333, + "x": 0, + "y": 60.17, + "curve": [ 0.544, 0, 0.838, 0.77 ] + }, + { "time": 2.2, "x": 0, "y": 0 } + ] + }, + "treadCollider3": { + "rotate": [ + { "time": 1.8666, "angle": 0 }, + { "time": 1.9333, "angle": -20.16 }, + { "time": 2.0666, "angle": 0.57 }, + { "time": 2.1666, "angle": 33.66 }, + { "time": 2.3333, "angle": 0 } + ], + "translate": [ + { "time": 1.8666, "x": 0, "y": 0 }, + { + "time": 2.0666, + "x": 0, + "y": 61.53, + "curve": [ 0.582, 0, 0.836, 0.77 ] + }, + { "time": 2.3333, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot4": { + "translate": [ + { "time": 1.9333, "x": 0, "y": 0 }, + { + "time": 2.2, + "x": 0, + "y": 58.89, + "curve": [ 0.48, 0, 0.75, 1 ] + }, + { "time": 2.4666, "x": 0, "y": 0 } + ] + }, + "treadCollider4": { + "rotate": [ + { "time": 2.1333, "angle": 0 }, + { "time": 2.2, "angle": -20.43 }, + { "time": 2.3333, "angle": 4.49 }, + { "time": 2.4333, "angle": 35.87 }, + { "time": 2.5666, "angle": 0 } + ], + "translate": [ + { + "time": 2.1333, + "x": 0, + "y": 0, + "curve": [ 0.191, 0.49, 0.75, 1 ] + }, + { "time": 2.3333, "x": 0, "y": 66.64 }, + { "time": 2.5666, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot5": { + "translate": [ + { "time": 2.2, "x": 0, "y": 0 }, + { "time": 2.4333, "x": 0, "y": 60.26 }, + { "time": 2.7, "x": 0, "y": 0 } + ] + }, + "treadCollider5": { + "rotate": [ + { "time": 2.3333, "angle": 0 }, + { "time": 2.4333, "angle": -23.6 }, + { "time": 2.5666, "angle": 6.49 }, + { "time": 2.6666, "angle": 29.93 }, + { "time": 2.8, "angle": -0.13 } + ], + "translate": [ + { "time": 2.3333, "x": 0, "y": 0 }, + { "time": 2.4333, "x": 0, "y": 36.34 }, + { "time": 2.5, "x": 0, "y": 56.39 }, + { "time": 2.5666, "x": 0, "y": 61.34 }, + { "time": 2.8, "x": 0, "y": 2.04 } + ] + }, + "wheel-midRoot6": { + "translate": [ + { + "time": 2.4333, + "x": 0, + "y": 0, + "curve": [ 0.19, 0.26, 0.804, 0.8 ] + }, + { + "time": 2.6333, + "x": 0, + "y": 51.86, + "curve": [ 0.346, 0, 0.852, 0.7 ] + }, + { "time": 2.8, "x": 0, "y": 0 } + ] + }, + "wheel-mid1": { + "rotate": [ + { + "time": 0, + "angle": 21, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 0.8, "angle": 120 }, + { "time": 1.2333, "angle": 240 }, + { "time": 1.6, "angle": 0 }, + { "time": 1.9, "angle": 120 }, + { "time": 2.1666, "angle": 240 }, + { "time": 2.4, "angle": 0 }, + { "time": 2.5666, "angle": 120 }, + { "time": 2.7333, "angle": 240 }, + { "time": 2.9333, "angle": 0 }, + { "time": 3.1, "angle": 120 }, + { "time": 3.2666, "angle": 240 }, + { "time": 3.4333, "angle": 0 }, + { "time": 3.6333, "angle": 120 }, + { "time": 3.8, "angle": 240 }, + { "time": 3.9666, "angle": 0 }, + { "time": 4.1666, "angle": 120 }, + { "time": 4.3333, "angle": 240 }, + { "time": 4.5, "angle": 0 }, + { "time": 4.7, "angle": 120 }, + { "time": 4.8666, "angle": 240 }, + { "time": 5.2666, "angle": -67.99 } + ] + }, + "tankTreads": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.145, 0.34, 0.75, 1 ] + }, + { "time": 1.1, "angle": -3.9 }, + { "time": 1.3333, "angle": -2.37 }, + { "time": 1.6333, "angle": -3.54 }, + { "time": 2.1666, "angle": 0.27 }, + { + "time": 2.4666, + "angle": 2.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.7, + "angle": 3.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 3, "angle": -3.62 }, + { "time": 3.2333, "angle": -1.23, "curve": "stepped" }, + { + "time": 4.8666, + "angle": -1.23, + "curve": [ 0.188, 0.16, 0.75, 1 ] + }, + { + "time": 5.2, + "angle": 4.47, + "curve": [ 0.416, 0.01, 0.75, 1 ] + }, + { + "time": 5.5666, + "angle": -3.08, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 5.8333, "angle": -1.23 } + ] + }, + "wheel-big1": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 1.1, "angle": 120 }, + { "time": 1.5333, "angle": 240 }, + { "time": 1.8, "angle": 360 }, + { "time": 2.0333, "angle": 120 }, + { "time": 2.2666, "angle": 240 }, + { "time": 2.4666, "angle": 360 }, + { "time": 2.7, "angle": 120 }, + { "time": 2.9333, "angle": 240 }, + { "time": 3.1333, "angle": 360 }, + { "time": 3.3666, "angle": 120 }, + { "time": 3.5666, "angle": 240 }, + { "time": 3.8, "angle": -24 }, + { "time": 4.0333, "angle": 120 }, + { "time": 4.2333, "angle": 240 }, + { "time": 4.4666, "angle": -24 }, + { "time": 4.7, "angle": 120 }, + { "time": 4.8666, "angle": -143.99 }, + { + "time": 5.0666, + "angle": -131.4, + "curve": [ 0.14, 0.25, 0.75, 1 ] + }, + { "time": 5.6666, "angle": -76.85 }, + { "time": 5.8333, "angle": -72.3 } + ] + }, + "treadGravity1": { + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.4666, "x": 0, "y": 0 }, + { "time": 1.8, "x": 0, "y": 29.44 }, + { "time": 2.3333, "x": 0, "y": -0.52 }, + { "time": 2.5666, "x": 0, "y": 5.2 }, + { "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" }, + { "time": 4.8666, "x": 0, "y": -11.05 }, + { "time": 5.0666, "x": 0, "y": -1.91 }, + { "time": 5.5333, "x": 0, "y": -6.9 }, + { "time": 5.7333, "x": 0, "y": -11.05 } + ] + }, + "treadGravity2": { + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.4666, "x": 0, "y": 0 }, + { "time": 1.8, "x": 0, "y": 8.5 }, + { "time": 2.3333, "x": 0, "y": 34.74 }, + { "time": 2.5666, "x": 0, "y": 5.2 }, + { "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" }, + { "time": 4.8666, "x": 0, "y": -11.05 }, + { "time": 5.0666, "x": 0, "y": 3.9 }, + { "time": 5.5333, "x": 0, "y": -6.9 }, + { "time": 5.7333, "x": 0, "y": -11.05 } + ] + }, + "wheel-small1": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 0.7, "angle": 120 }, + { "time": 1.1, "angle": 240 }, + { "time": 1.4666, "angle": 360 }, + { "time": 1.7666, "angle": 120 }, + { "time": 2.0333, "angle": 240 }, + { "time": 2.2666, "angle": 360 }, + { "time": 2.4333, "angle": 120 }, + { "time": 2.5666, "angle": 240 }, + { "time": 2.7, "angle": 360 }, + { "time": 2.8333, "angle": 120 }, + { "time": 2.9666, "angle": 240 }, + { "time": 3.1, "angle": 360 }, + { "time": 3.2333, "angle": 120 }, + { "time": 3.3666, "angle": 240 }, + { "time": 3.5, "angle": 360 }, + { "time": 3.6333, "angle": 120 }, + { "time": 3.7666, "angle": 240 }, + { "time": 3.9, "angle": 360 }, + { "time": 4.0333, "angle": 120 }, + { "time": 4.1666, "angle": 240 }, + { "time": 4.3, "angle": 360 }, + { "time": 4.4333, "angle": 120 }, + { "time": 4.5666, "angle": 240 }, + { "time": 4.7, "angle": 360 }, + { "time": 4.8333, "angle": 120 }, + { "time": 5, "angle": 240 }, + { + "time": 5.2, + "angle": -25.64, + "curve": [ 0.181, 0.26, 0.75, 1 ] + }, + { "time": 5.5666, "angle": 90 } + ] + }, + "tankBody": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.1666, + "angle": -1.41, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.9333, + "angle": -0.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3, + "angle": 0.84, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -2.33, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.4666, + "angle": -0.45, + "curve": [ 0.329, 0.32, 0.757, 1 ] + }, + { + "time": 4.8666, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3333, + "angle": 1.82, + "curve": [ 0.324, 0.01, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -1.15, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.0333, "angle": 0 } + ] + }, + "antenna1": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna2": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna3": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna4": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna5": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna6": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "machinegun": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 2.8333, + "angle": 0, + "curve": [ 0.183, 0.17, 0.75, 1 ] + }, + { + "time": 3, + "angle": -4.43, + "curve": [ 0.156, 0.16, 0.75, 1 ] + }, + { + "time": 3.1666, + "angle": -2.93, + "curve": [ 0.156, 0.16, 0.75, 1 ] + }, + { + "time": 4.8333, + "angle": 0, + "curve": [ 0.183, 0.17, 0.75, 1 ] + }, + { + "time": 5.1666, + "angle": -6.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.4, + "angle": 6.15, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 5.6, "angle": -1.26 } + ] + }, + "cannon": { + "rotate": [ + { "time": 0, "angle": 0 } + ] + }, + "cannonTarget": { + "translate": [ + { + "time": 5, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.3333, "x": -15.38, "y": 99.99 } + ] + } + }, + "ik": { + "cannonTarget": [ + { "time": 0, "mix": 0.809, "curve": "stepped" }, + { "time": 4.7333, "mix": 0.809 }, + { "time": 5.1666, "mix": 0.504 }, + { "time": 5.6666 } + ] + }, + "paths": { + "treads": { + "position": [ + { + "time": 0, + "curve": [ 0.549, 0, 0.907, 0.84 ] + }, + { "time": 3.0333, "position": 0.51 }, + { "time": 4.8666, "position": 0.9794 }, + { + "time": 5.2666, + "position": 1, + "curve": [ 0.226, 0.15, 0.765, 0.96 ] + }, + { + "time": 5.5333, + "position": 1.02, + "curve": [ 0.279, 0.32, 0.694, 0.99 ] + }, + { "time": 5.8333, "position": 1.021 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/spine-starling/spine-starling-example/src/tank.png b/spine-starling/spine-starling-example/src/tank.png new file mode 100644 index 000000000..b0b1b3642 Binary files /dev/null and b/spine-starling/spine-starling-example/src/tank.png differ diff --git a/spine-starling/spine-starling/.settings/com.powerflasher.fdt.classpath b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.classpath index 53c37a5fa..e4540bec9 100644 --- a/spine-starling/spine-starling/.settings/com.powerflasher.fdt.classpath +++ b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.classpath @@ -1,8 +1,16 @@ lib - frameworks/libs/player/{playerVersion}/playerglobal.swc src lib/spine-as3.swc - lib/starling-1.7.swc + lib/starling-2.0.1.swc + frameworks/libs/air/airglobal.swc + frameworks/libs/textLayout.swc + frameworks/libs/osmf.swc + frameworks/libs/authoringsupport.swc + frameworks/libs/core.swc + frameworks/libs/air/aircore.swc + frameworks/libs/air/applicationupdater.swc + frameworks/libs/air/applicationupdater_ui.swc + frameworks/libs/air/servicemonitor.swc diff --git a/spine-starling/spine-starling/.settings/com.powerflasher.fdt.core.prefs b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.core.prefs index d1623e619..bd3538e23 100644 --- a/spine-starling/spine-starling/.settings/com.powerflasher.fdt.core.prefs +++ b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.core.prefs @@ -1,8 +1,9 @@ -com.powerflasher.fdt.core.CompatiblePlayers=External_SWF_Viewer\:Browser\:Standalone_Flash_Player +com.powerflasher.fdt.core.CompatiblePlayers=AIR_Debug_Launcher com.powerflasher.fdt.core.CompilerArguments=-static-link-runtime-shared-libraries\=true\n-target-player\={playerVersion}\n-library-path+\="{flexSDK}/frameworks/locale/en_US"\n-default-size\=550,400 com.powerflasher.fdt.core.CompilerConstants=CONFIG\:\:AUTHOR\!"{user.name}"\nCONFIG\:\:DEBUG\!{debug} com.powerflasher.fdt.core.DefaultOutputFolder=bin -com.powerflasher.fdt.core.DefaultPlayer=External_SWF_Viewer +com.powerflasher.fdt.core.DefaultPlayer=AIR_Debug_Launcher +com.powerflasher.fdt.core.IncludeTestResources=false com.powerflasher.fdt.core.Language=AS3 com.powerflasher.fdt.core.Manifests= com.powerflasher.fdt.core.PassClasspath=true @@ -12,9 +13,9 @@ com.powerflasher.fdt.core.PassMainclass=true com.powerflasher.fdt.core.PassManifests=true com.powerflasher.fdt.core.PassRsls=false com.powerflasher.fdt.core.PassSwcs=true -com.powerflasher.fdt.core.PlatformType=WEB -com.powerflasher.fdt.core.PlayerVersion=11.1 -com.powerflasher.fdt.core.ProjectTypeHint=Web -com.powerflasher.fdt.core.Runtime=Flash_Player +com.powerflasher.fdt.core.PlatformType=AIR +com.powerflasher.fdt.core.PlayerVersion=22.0 +com.powerflasher.fdt.core.ProjectTypeHint=Library AIR +com.powerflasher.fdt.core.Runtime=AIR com.powerflasher.fdt.core.SdkName=Flex 4.6.0 eclipse.preferences.version=1 diff --git a/spine-starling/spine-starling/.settings/com.powerflasher.fdt.exclude b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.exclude new file mode 100644 index 000000000..ea01af7bd --- /dev/null +++ b/spine-starling/spine-starling/.settings/com.powerflasher.fdt.exclude @@ -0,0 +1,22 @@ + + + SDK:frameworks/libs/air/aircore.swc + SDK:frameworks/libs/air/airglobal.swc + SDK:frameworks/libs/air/applicationupdater.swc + SDK:frameworks/libs/air/applicationupdater_ui.swc + SDK:frameworks/libs/air/servicemonitor.swc + SDK:frameworks/libs/authoringsupport.swc + SDK:frameworks/libs/core.swc + SDK:frameworks/libs/osmf.swc + SDK:frameworks/libs/textLayout.swc + frameworks/libs/air/aircore.swc + frameworks/libs/air/airglobal.swc + frameworks/libs/air/applicationupdater.swc + frameworks/libs/air/applicationupdater_ui.swc + frameworks/libs/air/servicemonitor.swc + frameworks/libs/authoringsupport.swc + frameworks/libs/core.swc + frameworks/libs/osmf.swc + frameworks/libs/textLayout.swc + + diff --git a/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs b/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs index 99f26c020..8b768ecaa 100644 --- a/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs +++ b/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,7 @@ eclipse.preferences.version=1 +encoding//src/spine/starling/SkeletonAnimation.as=UTF-8 +encoding//src/spine/starling/SkeletonMesh.as=UTF-8 +encoding//src/spine/starling/SkeletonSprite.as=UTF-8 +encoding//src/spine/starling/StarlingAtlasAttachmentLoader.as=UTF-8 +encoding//src/spine/starling/StarlingTextureLoader.as=UTF-8 encoding/=UTF-8 diff --git a/spine-starling/spine-starling/lib/spine-as3.swc b/spine-starling/spine-starling/lib/spine-as3.swc index 3f90b6481..109a011b5 100644 Binary files a/spine-starling/spine-starling/lib/spine-as3.swc and b/spine-starling/spine-starling/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling/lib/starling-1.7.swc b/spine-starling/spine-starling/lib/starling-1.7.swc deleted file mode 100644 index dd36fb67a..000000000 Binary files a/spine-starling/spine-starling/lib/starling-1.7.swc and /dev/null differ diff --git a/spine-starling/spine-starling/lib/starling-2.0.1.swc b/spine-starling/spine-starling/lib/starling-2.0.1.swc new file mode 100644 index 000000000..eb24c27fa Binary files /dev/null and b/spine-starling/spine-starling/lib/starling-2.0.1.swc differ diff --git a/spine-starling/spine-starling/src/spine/starling/PolygonBatch.as b/spine-starling/spine-starling/src/spine/starling/PolygonBatch.as deleted file mode 100644 index 55a823148..000000000 --- a/spine-starling/spine-starling/src/spine/starling/PolygonBatch.as +++ /dev/null @@ -1,289 +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. - *****************************************************************************/ - -package spine.starling { -import spine.BlendMode; - -import starling.core.RenderSupport; -import starling.core.Starling; -import starling.textures.Texture; -import starling.textures.TextureSmoothing; -import starling.utils.MatrixUtil; -import starling.utils.VertexData; - -import flash.display3D.Context3D; -import flash.display3D.Context3DProgramType; -import flash.display3D.Context3DTextureFormat; -import flash.display3D.Context3DVertexBufferFormat; -import flash.display3D.IndexBuffer3D; -import flash.display3D.Program3D; -import flash.display3D.VertexBuffer3D; -import flash.events.Event; -import flash.geom.Matrix; -import flash.geom.Point; -import flash.utils.Dictionary; - -internal class PolygonBatch { - static private var _tempPoint:Point = new Point(); - static private var _renderAlpha:Vector. = new [1.0, 1.0, 1.0, 1.0]; - static private var _programNameCache:Dictionary = new Dictionary(); - - private var _capacity:int; - public var maxCapacity:int = 2000; - public var smoothing:String = TextureSmoothing.BILINEAR; - - private var _texture:Texture; - private var _support:RenderSupport; - private var _programBits:uint; - private var _blendModeNormal:String; - private var _blendMode:spine.BlendMode; - private var _alpha:Number; - - private var _verticesCount:int; - private var _vertices:Vector. = new []; - private var _verticesBuffer:VertexBuffer3D; - - private var _trianglesCount:int; - private var _triangles:Vector. = new []; - private var _trianglesBuffer:IndexBuffer3D; - - public function PolygonBatch () { - Starling.current.stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreated, false, 0, true); - } - - public function dispose () : void { - Starling.current.stage3D.removeEventListener(Event.CONTEXT3D_CREATE, onContextCreated); - if (_verticesBuffer) _verticesBuffer.dispose(); - if (_trianglesBuffer) _trianglesBuffer.dispose(); - } - - public function begin (support:RenderSupport, alpha:Number, blendMode:String) : void { - _support = support; - _alpha = alpha; - _programBits = 0xffffffff; - _blendMode = null; - - support.finishQuadBatch(); - support.blendMode = blendMode; - _blendModeNormal = support.blendMode; - - var context:Context3D = Starling.context; - context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 1, support.mvpMatrix3D, true); - - var verticesBuffer:VertexBuffer3D = _verticesBuffer; - if (verticesBuffer) { - context.setVertexBufferAt(0, verticesBuffer, VertexData.POSITION_OFFSET, Context3DVertexBufferFormat.FLOAT_2); - context.setVertexBufferAt(1, verticesBuffer, VertexData.COLOR_OFFSET, Context3DVertexBufferFormat.FLOAT_4); - context.setVertexBufferAt(2, verticesBuffer, VertexData.TEXCOORD_OFFSET, Context3DVertexBufferFormat.FLOAT_2); - } - } - - public function end () : void { - flush(); - var context:Context3D = Starling.context; - context.setTextureAt(0, null); - context.setVertexBufferAt(2, null); - context.setVertexBufferAt(1, null); - context.setVertexBufferAt(0, null); - } - - public function add (texture:Texture, vertices:Vector., vl:int, uvs:Vector., triangles:Vector., - r:Number, g:Number, b:Number, a:Number, blendMode:spine.BlendMode, matrix:Matrix) : void { - if (blendMode != _blendMode) { - _blendMode = blendMode; - flush(); - if (blendMode == spine.BlendMode.normal) - _support.blendMode = _blendModeNormal; - else - _support.blendMode = spine.starling.SkeletonSprite.blendModes[blendMode.ordinal]; - _support.applyBlendMode(true); - } - - if (!_texture || texture.base != _texture.base) { - flush(); - _texture = texture; - } - - var vc:int = _verticesCount, firstVertex:int = vc >> 3; - if (firstVertex + (vl >> 1) > _capacity) { - resize(firstVertex + (vl >> 1) - _capacity); - vc = _verticesCount; - firstVertex = vc >> 3; - } - var tl:int = triangles.length, tc:int = _trianglesCount; - if (tc + tl > _triangles.length) { - resize((tc + tl - _triangles.length) / 3); - vc = _verticesCount; - firstVertex = vc >> 3; - tc = _trianglesCount; - } - - var i:int, t:Vector. = _triangles; - for (i = 0; i < tl; i += 3, tc += 3) { - t[tc] = firstVertex + triangles[i]; - t[int(tc + 1)] = firstVertex + triangles[int(i + 1)]; - t[int(tc + 2)] = firstVertex + triangles[int(i + 2)]; - } - _trianglesCount = tc; - - var v:Vector. = _vertices; - if (matrix) { - var point:Point = _tempPoint; - for (i = 0; i < vl; i += 2, vc += 8) { - MatrixUtil.transformCoords(matrix, vertices[i], vertices[int(i + 1)], point); - v[vc] = point.x; - v[int(vc + 1)] = point.y; - v[int(vc + 2)] = r; - v[int(vc + 3)] = g; - v[int(vc + 4)] = b; - v[int(vc + 5)] = a; - v[int(vc + 6)] = uvs[i]; - v[int(vc + 7)] = uvs[int(i + 1)]; - } - } else { - for (i = 0; i < vl; i += 2, vc += 8) { - v[vc] = vertices[i]; - v[int(vc + 1)] = vertices[int(i + 1)]; - v[int(vc + 2)] = r; - v[int(vc + 3)] = g; - v[int(vc + 4)] = b; - v[int(vc + 5)] = a; - v[int(vc + 6)] = uvs[i]; - v[int(vc + 7)] = uvs[int(i + 1)]; - } - } - _verticesCount = vc; - } - - private function resize (additional:int) : void { - var newCapacity:int = Math.min(maxCapacity, Math.max(_capacity + additional, _capacity * 2)); - if (newCapacity == maxCapacity) { - flush(); - newCapacity = additional; - if (newCapacity < _capacity) return; - if (newCapacity > maxCapacity) throw new ArgumentError("Too many vertices: " + newCapacity + " > " + maxCapacity); - } - _capacity = newCapacity; - _vertices.length = newCapacity << 3; - _triangles.length = newCapacity * 3; - _verticesBuffer = null; - _trianglesBuffer = null; - } - - public function flush () : void { - if (!_verticesCount) return; - - var context:Context3D = Starling.context; - - if (!_verticesBuffer) { - _verticesBuffer = context.createVertexBuffer(_capacity, 8); - var count:int = _verticesCount >> 3; - _verticesBuffer.uploadFromVector(_vertices, 0, count); - var verticesTemp:Vector. = new []; // Buffer must be filled completely once. - verticesTemp.length = (_capacity << 3) - _verticesCount; - _verticesBuffer.uploadFromVector(verticesTemp, count, _capacity - count); - verticesTemp = null; - - _trianglesBuffer = context.createIndexBuffer(_capacity * 3); - _trianglesBuffer.uploadFromVector(_triangles, 0, _trianglesCount); - var trianglesTemp:Vector. = new []; // Buffer must be filled completely once. - trianglesTemp.length = _capacity * 3 - _trianglesCount; - _trianglesBuffer.uploadFromVector(trianglesTemp, _trianglesCount, trianglesTemp.length); - trianglesTemp = null; - - context.setVertexBufferAt(0, _verticesBuffer, VertexData.POSITION_OFFSET, Context3DVertexBufferFormat.FLOAT_2); - context.setVertexBufferAt(1, _verticesBuffer, VertexData.COLOR_OFFSET, Context3DVertexBufferFormat.FLOAT_4); - context.setVertexBufferAt(2, _verticesBuffer, VertexData.TEXCOORD_OFFSET, Context3DVertexBufferFormat.FLOAT_2); - } else { - _verticesBuffer.uploadFromVector(_vertices, 0, _verticesCount >> 3); - _trianglesBuffer.uploadFromVector(_triangles, 0, _trianglesCount); - } - - var pma:Boolean = _texture ? _texture.premultipliedAlpha : true; - _renderAlpha[0] = _renderAlpha[1] = _renderAlpha[2] = pma ? _alpha : 1.0; - _renderAlpha[3] = _alpha; - - _support.applyBlendMode(pma); - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX, 0, _renderAlpha, 1); - - setProgram(context); - context.setTextureAt(0, _texture.base); - context.drawTriangles(_trianglesBuffer, 0, _trianglesCount / 3); - - _verticesCount = 0; - _trianglesCount = 0; - - _support.raiseDrawCount(); - } - - private function onContextCreated (event:Event) : void { - _verticesBuffer = null; - _trianglesBuffer = null; - } - - private function setProgram (context:Context3D) : void { - var bits:uint = 0; - var texture:Texture = _texture; - if (texture.mipMapping) bits |= 1 << 1; - if (texture.repeat) bits |= 1 << 2; - if (smoothing != TextureSmoothing.BILINEAR) bits |= 1 << (smoothing == TextureSmoothing.TRILINEAR ? 3 : 4); - if (texture.format != Context3DTextureFormat.BGRA) bits |= 1 << (texture.format == "compressedAlpha" ? 5 : 6); - if (bits == _programBits) return; - _programBits = bits; - - var name:String = _programNameCache[bits]; - if (name == null) { - name = "PB_i." + bits.toString(16); - _programNameCache[bits] = name; - } - - var program:Program3D = Starling.current.getProgram(name); - if (!program) { - // va0 -> position - // va1 -> color - // va2 -> texCoords - // vc0 -> alpha - // vc1 -> mvpMatrix - // fs0 -> texture - var vertexShader:String = - "m44 op, va0, vc1 \n" + // 4x4 matrix transform to output clipspace - "mul v0, va1, vc0 \n" + // multiply alpha (vc0) with color (va1) - "mov v1, va2 \n"; // pass texture coordinates to fragment program - var flags:String = RenderSupport.getTextureLookupFlags(texture.format, texture.mipMapping, texture.repeat, smoothing); - var fragmentShader:String = - "tex ft1, v1, fs0 " + flags + " \n" + // sample texture 0 - "mul oc, ft1, v0 \n"; // multiply color with texel color - program = Starling.current.registerProgramFromSource(name, vertexShader, fragmentShader); - } - context.setProgram(program); - } -} -} diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonAnimation.as b/spine-starling/spine-starling/src/spine/starling/SkeletonAnimation.as index 8a03be1a8..41e656809 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonAnimation.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonAnimation.as @@ -39,10 +39,9 @@ import starling.animation.IAnimatable; public class SkeletonAnimation extends SkeletonSprite implements IAnimatable { public var state:AnimationState; public var timeScale:Number = 1; - - /** @param renderMeshes If false, meshes won't be rendered. This may improve batching with non-Spine display objects. */ - public function SkeletonAnimation (skeletonData:SkeletonData, renderMeshes:Boolean = true, stateData:AnimationStateData = null) { - super(skeletonData, renderMeshes); + + public function SkeletonAnimation (skeletonData:SkeletonData, stateData:AnimationStateData = null) { + super(skeletonData); state = new AnimationState(stateData ? stateData : new AnimationStateData(skeletonData)); } @@ -52,6 +51,7 @@ public class SkeletonAnimation extends SkeletonSprite implements IAnimatable { state.update(time); state.apply(skeleton); skeleton.updateWorldTransform(); + this.setRequiresRedraw(); } } diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonMesh.as b/spine-starling/spine-starling/src/spine/starling/SkeletonMesh.as new file mode 100644 index 000000000..201c2693a --- /dev/null +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonMesh.as @@ -0,0 +1,55 @@ +/****************************************************************************** + * 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. + *****************************************************************************/ + +package spine.starling { +import starling.textures.Texture; +import starling.styles.MeshStyle; +import starling.rendering.IndexData; +import starling.rendering.VertexData; +import starling.display.Mesh; + +public class SkeletonMesh extends Mesh { + + public function SkeletonMesh(texture:Texture, vertexData:VertexData = null, indexData:IndexData = null, style:MeshStyle=null) { + super(vertexData == null? new VertexData(): vertexData, indexData == null? new IndexData(): indexData, style); + this.texture = texture; + } + + public function getVertexData(): VertexData { + return this.vertexData; + } + + public function getIndexData(): IndexData { + return this.indexData; + } +} + +} \ No newline at end of file diff --git a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as index 80883fd22..2dc9045f2 100644 --- a/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as +++ b/spine-starling/spine-starling/src/spine/starling/SkeletonSprite.as @@ -38,14 +38,15 @@ import spine.atlas.AtlasRegion; import spine.attachments.Attachment; import spine.attachments.MeshAttachment; import spine.attachments.RegionAttachment; -import spine.attachments.WeightedMeshAttachment; -import starling.core.RenderSupport; import starling.display.BlendMode; import starling.display.DisplayObject; +import starling.display.Image; +import starling.rendering.IndexData; +import starling.rendering.Painter; +import starling.rendering.VertexData; import starling.utils.Color; import starling.utils.MatrixUtil; -import starling.utils.VertexData; import flash.geom.Matrix; import flash.geom.Point; @@ -54,129 +55,23 @@ import flash.geom.Rectangle; public class SkeletonSprite extends DisplayObject { static private var _tempPoint:Point = new Point(); static private var _tempMatrix:Matrix = new Matrix(); - static private var _tempVertices:Vector. = new Vector.(8); - static private var _quadTriangles:Vector. = new [0, 1, 2, 2, 3, 0]; + static private var _tempVertices:Vector. = new Vector.(8); static internal var blendModes:Vector. = new [ BlendMode.NORMAL, BlendMode.ADD, BlendMode.MULTIPLY, BlendMode.SCREEN]; - private var _skeleton:Skeleton; - private var _polygonBatch:PolygonBatch; - public var batchable:Boolean = true; - private var _batched:Boolean; + private var _skeleton:Skeleton; + public var batchable:Boolean = true; private var _smoothing:String = "bilinear"; - - /** @param renderMeshes If false, meshes won't be rendered. This may improve batching with non-Spine display objects. */ - public function SkeletonSprite (skeletonData:SkeletonData, renderMeshes:Boolean = true) { + + public function SkeletonSprite (skeletonData:SkeletonData) { Bone.yDown = true; - - if (renderMeshes) _polygonBatch = new PolygonBatch(); - _skeleton = new Skeleton(skeletonData); _skeleton.updateWorldTransform(); } - override public function render (support:RenderSupport, alpha:Number) : void { - alpha *= this.alpha * skeleton.a; - var originalBlendMode:String = support.blendMode; - if (_polygonBatch) - renderMeshes(support, alpha); - else - renderRegions(support, alpha); - support.blendMode = originalBlendMode; - } - - private function renderMeshes (support:RenderSupport, alpha:Number) : void { - if (!batchable) { - _polygonBatch.begin(support, alpha, blendMode); - addToBatch(_polygonBatch, alpha, null); - _polygonBatch.end(); - } else if (!_batched) { - support.popMatrix(); - _polygonBatch.begin(support, alpha, blendMode); - addToBatch(_polygonBatch, alpha, transformationMatrix); - for(var i:int = parent.getChildIndex(this) + 1, n:int = parent.numChildren; i < n; ++i) { - var sibling:SkeletonSprite = parent.getChildAt(i) as SkeletonSprite; - if (!sibling || !sibling.batchable || sibling.blendMode != blendMode || !sibling.visible) break; - sibling._batched = true; - sibling.addToBatch(_polygonBatch, alpha, sibling.transformationMatrix); - } - _polygonBatch.end(); - support.pushMatrix(); - support.transformMatrix(this); - } else - _batched = false; - } - - private function addToBatch (polygonBatch:PolygonBatch, skeletonA:Number, matrix:Matrix) : void { - var skeletonR:Number = skeleton.r; - var skeletonG:Number = skeleton.g; - var skeletonB:Number = skeleton.b; - var x:Number = skeleton.x; - var y:Number = skeleton.y; - var worldVertices:Vector. = _tempVertices; - var drawOrder:Vector. = skeleton.drawOrder; - for (var i:int = 0, n:int = drawOrder.length; i < n; ++i) { - var slot:Slot = drawOrder[i]; - var attachment:Attachment = slot.attachment; - if (!attachment) continue; - var image:SkeletonImage, verticesLength:int, uvs:Vector., triangles:Vector.; - var r:Number, g:Number, b:Number, a:Number; - if (attachment is RegionAttachment) { - var region:RegionAttachment = RegionAttachment(slot.attachment); - verticesLength = 8; - region.computeWorldVertices(x, y, slot.bone, worldVertices); - uvs = region.uvs; - triangles = _quadTriangles; - r = region.r; - g = region.g; - b = region.b; - a = region.a; - image = region.rendererObject as SkeletonImage; - if (image == null) region.rendererObject = image = SkeletonImage(AtlasRegion(region.rendererObject).rendererObject); - } else if (attachment is MeshAttachment) { - var mesh:MeshAttachment = MeshAttachment(attachment); - verticesLength = mesh.vertices.length; - if (worldVertices.length < verticesLength) worldVertices.length = verticesLength; - mesh.computeWorldVertices(x, y, slot, worldVertices); - uvs = mesh.uvs; - triangles = mesh.triangles; - r = mesh.r; - g = mesh.g; - b = mesh.b; - a = mesh.a; - image = mesh.rendererObject as SkeletonImage; - if (image == null) mesh.rendererObject = image = SkeletonImage(AtlasRegion(mesh.rendererObject).rendererObject); - } else if (attachment is WeightedMeshAttachment) { - var weightedMesh:WeightedMeshAttachment = WeightedMeshAttachment(attachment); - verticesLength = weightedMesh.uvs.length; - if (worldVertices.length < verticesLength) worldVertices.length = verticesLength; - weightedMesh.computeWorldVertices(x, y, slot, worldVertices); - uvs = weightedMesh.uvs; - triangles = weightedMesh.triangles; - r = weightedMesh.r; - g = weightedMesh.g; - b = weightedMesh.b; - a = weightedMesh.a; - image = weightedMesh.rendererObject as SkeletonImage; - if (image == null) weightedMesh.rendererObject = image = SkeletonImage(AtlasRegion(weightedMesh.rendererObject).rendererObject); - } - if (image) { - a *= skeletonA * slot.a; - if (image.texture.premultipliedAlpha) { - r *= skeletonR * slot.r * a; - g *= skeletonG * slot.g * a; - b *= skeletonB * slot.b * a; - } else { - r *= skeletonR * slot.r; - g *= skeletonG * slot.g; - b *= skeletonB * slot.b; - } - polygonBatch.add(image.texture, worldVertices, verticesLength, uvs, triangles, r, g, b, a, slot.data.blendMode, matrix); - } - } - } - - private function renderRegions (support:RenderSupport, alpha:Number) : void { + override public function render (painter:Painter) : void { + alpha *= this.alpha * skeleton.a; + var originalBlendMode:String = painter.state.blendMode; var r:Number = skeleton.r * 255; var g:Number = skeleton.g * 255; var b:Number = skeleton.b * 255; @@ -184,43 +79,100 @@ public class SkeletonSprite extends DisplayObject { var y:Number = skeleton.y; var drawOrder:Vector. = skeleton.drawOrder; var worldVertices:Vector. = _tempVertices; + var ii:int, iii:int; + var rgb:uint, a:Number; + var mesh:SkeletonMesh; + var verticesLength:int, verticesCount:int, indicesLength:int; + var indexData:IndexData, indices:Vector., vertexData:VertexData; + var uvs: Vector.; + for (var i:int = 0, n:int = drawOrder.length; i < n; ++i) { - var slot:Slot = drawOrder[i]; - var region:RegionAttachment = slot.attachment as RegionAttachment; - if (region != null) { + var slot:Slot = drawOrder[i]; + if (slot.attachment is RegionAttachment) { + var region:RegionAttachment = slot.attachment as RegionAttachment; region.computeWorldVertices(x, y, slot.bone, worldVertices); - var a:Number = slot.a * region.a; - var rgb:uint = Color.rgb( + // FIXME pre-multiplied alpha? + a = slot.a * region.a; + rgb = Color.rgb( r * slot.r * region.r, g * slot.g * region.g, b * slot.b * region.b); - var image:SkeletonImage = region.rendererObject as SkeletonImage; - if (image == null) region.rendererObject = image = SkeletonImage(AtlasRegion(region.rendererObject).rendererObject); - - var vertexData:VertexData = image.vertexData; - vertexData.setPosition(0, worldVertices[2], worldVertices[3]); - vertexData.setColorAndAlpha(0, rgb, a); + var image:Image = region.rendererObject as Image; + if (image == null) region.rendererObject = image = Image(AtlasRegion(region.rendererObject).rendererObject); - vertexData.setPosition(1, worldVertices[4], worldVertices[5]); - vertexData.setColorAndAlpha(1, rgb, a); + image.setVertexPosition(0, worldVertices[2], worldVertices[3]); + image.setVertexColor(0, rgb); + image.setVertexAlpha(0, a); - vertexData.setPosition(2, worldVertices[0], worldVertices[1]); - vertexData.setColorAndAlpha(2, rgb, a); + image.setVertexPosition(1, worldVertices[4], worldVertices[5]); + image.setVertexColor(1, rgb); + image.setVertexAlpha(1, a); - vertexData.setPosition(3, worldVertices[6], worldVertices[7]); - vertexData.setColorAndAlpha(3, rgb, a); + image.setVertexPosition(2, worldVertices[0], worldVertices[1]); + image.setVertexColor(2, rgb); + image.setVertexAlpha(2, a); - image.updateVertices(); - support.blendMode = blendModes[slot.data.blendMode.ordinal]; - support.batchQuad(image, alpha, image.texture, _smoothing); + image.setVertexPosition(3, worldVertices[6], worldVertices[7]); + image.setVertexColor(3, rgb); + image.setVertexAlpha(3, a); + + image.setRequiresRedraw(); + painter.state.blendMode = blendModes[slot.data.blendMode.ordinal]; + // FIXME set smoothing/filter + painter.batchMesh(image); + } else if (slot.attachment is MeshAttachment) { + var meshAttachment:MeshAttachment = MeshAttachment(slot.attachment); + verticesLength = meshAttachment.worldVerticesLength; + verticesCount = verticesLength >> 1; + if (worldVertices.length < verticesLength) worldVertices.length = verticesLength; + meshAttachment.computeWorldVertices(slot, worldVertices); + mesh = meshAttachment.rendererObject as SkeletonMesh; + if (mesh == null) { + if (meshAttachment.rendererObject is Image) + meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(meshAttachment.rendererObject).texture); + if (meshAttachment.rendererObject is AtlasRegion) + meshAttachment.rendererObject = mesh = new SkeletonMesh(Image(AtlasRegion(meshAttachment.rendererObject).rendererObject).texture); + } + + if (mesh.numIndices != meshAttachment.triangles.length) { + indexData = mesh.getIndexData(); + indices = meshAttachment.triangles; + indicesLength = meshAttachment.triangles.length; + for (ii = 0; ii < indicesLength; ii++) { + indexData.setIndex(ii, indices[ii]); + } + indexData.numIndices = indicesLength; + indexData.trim(); + } + + // FIXME pre-multiplied alpha? + a = slot.a * meshAttachment.a; + rgb = Color.rgb( + r * slot.r * meshAttachment.r, + g * slot.g * meshAttachment.g, + b * slot.b * meshAttachment.b); + + vertexData = mesh.getVertexData(); + uvs = meshAttachment.uvs; + for (ii = 0, iii = 0; ii < verticesCount; ii++, iii+=2) { + mesh.setVertexPosition(ii, worldVertices[iii], worldVertices[iii+1]); + mesh.setTexCoords(ii, uvs[iii], uvs[iii+1]); + mesh.setVertexColor(ii, rgb); + mesh.setVertexAlpha(ii, alpha); + } + vertexData.numVertices = verticesCount; + // FIXME set smoothing/filter + painter.batchMesh(mesh); } } + painter.state.blendMode = originalBlendMode; } - override public function hitTest (localPoint:Point, forTouch:Boolean = false) : DisplayObject { - if (forTouch && (!visible || !touchable)) - return null; + override public function hitTest (localPoint:Point) : DisplayObject { + // FIXME what to do here? +// if (forTouch && (!visible || !touchable)) +// return null; var minX:Number = Number.MAX_VALUE, minY:Number = Number.MAX_VALUE; var maxX:Number = -Number.MAX_VALUE, maxY:Number = -Number.MAX_VALUE; @@ -237,14 +189,9 @@ public class SkeletonSprite extends DisplayObject { region.computeWorldVertices(0, 0, slot.bone, worldVertices); } else if (attachment is MeshAttachment) { var mesh:MeshAttachment = MeshAttachment(attachment); - verticesLength = mesh.vertices.length; + verticesLength = mesh.worldVerticesLength; if (worldVertices.length < verticesLength) worldVertices.length = verticesLength; - mesh.computeWorldVertices(0, 0, slot, worldVertices); - } else if (attachment is WeightedMeshAttachment) { - var weightedMesh:WeightedMeshAttachment = WeightedMeshAttachment(attachment); - verticesLength = weightedMesh.uvs.length; - if (worldVertices.length < verticesLength) worldVertices.length = verticesLength; - weightedMesh.computeWorldVertices(0, 0, slot, worldVertices); + mesh.computeWorldVertices(slot, worldVertices); } else continue; for (var ii:int = 0; ii < verticesLength; ii += 2) { @@ -298,8 +245,7 @@ public class SkeletonSprite extends DisplayObject { } public function set smoothing (smoothing:String) : void { - _smoothing = smoothing; - if (_polygonBatch) _polygonBatch.smoothing = _smoothing; + _smoothing = smoothing; } } diff --git a/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as b/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as index 3deae3290..ef5d95b41 100644 --- a/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as +++ b/spine-starling/spine-starling/src/spine/starling/StarlingAtlasAttachmentLoader.as @@ -30,13 +30,14 @@ *****************************************************************************/ package spine.starling { +import spine.attachments.PathAttachment; +import starling.display.Image; import spine.Bone; import spine.Skin; import spine.attachments.AttachmentLoader; import spine.attachments.BoundingBoxAttachment; import spine.attachments.MeshAttachment; import spine.attachments.RegionAttachment; -import spine.attachments.WeightedMeshAttachment; import starling.textures.SubTexture; import starling.textures.Texture; @@ -58,7 +59,7 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader { if (texture == null) throw new Error("Region not found in Starling atlas: " + path + " (region attachment: " + name + ")"); var attachment:RegionAttachment = new RegionAttachment(name); - attachment.rendererObject = new SkeletonImage(Texture.fromTexture(texture)); // Discard frame. + attachment.rendererObject = new Image(Texture.fromTexture(texture)); // Discard frame. var frame:Rectangle = texture.frame; attachment.regionOffsetX = frame ? -frame.x : 0; attachment.regionOffsetY = frame ? -frame.y : 0; @@ -90,37 +91,7 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader { if (texture == null) throw new Error("Region not found in Starling atlas: " + path + " (mesh attachment: " + name + ")"); var attachment:MeshAttachment = new MeshAttachment(name); - attachment.rendererObject = new SkeletonImage(Texture.fromTexture(texture)); // Discard frame. - var subTexture:SubTexture = texture as SubTexture; - if (subTexture) { - var root:Texture = subTexture.root; - var rectRegion:Rectangle = atlas.getRegion(path); - attachment.regionU = rectRegion.x / root.width; - attachment.regionV = rectRegion.y / root.height; - attachment.regionU2 = (rectRegion.x + subTexture.width) / root.width; - attachment.regionV2 = (rectRegion.y + subTexture.height) / root.height; - } else { - attachment.regionU = 0; - attachment.regionV = 1; - attachment.regionU2 = 1; - attachment.regionV2 = 0; - } - var frame:Rectangle = texture.frame; - attachment.regionOffsetX = frame ? -frame.x : 0; - attachment.regionOffsetY = frame ? -frame.y : 0; - attachment.regionWidth = texture.width; - attachment.regionHeight = texture.height; - attachment.regionOriginalWidth = frame ? frame.width : texture.width; - attachment.regionOriginalHeight = frame ? frame.height : texture.height; - return attachment; - } - - public function newWeightedMeshAttachment (skin:Skin, name:String, path:String) : WeightedMeshAttachment { - var texture:Texture = atlas.getTexture(path); - if (texture == null) - throw new Error("Region not found in Starling atlas: " + path + " (weighted mesh attachment: " + name + ")"); - var attachment:WeightedMeshAttachment = new WeightedMeshAttachment(name); - attachment.rendererObject = new SkeletonImage(Texture.fromTexture(texture)); // Discard frame. + attachment.rendererObject = new Image(Texture.fromTexture(texture)); // Discard frame. var subTexture:SubTexture = texture as SubTexture; if (subTexture) { var root:Texture = subTexture.root; @@ -129,6 +100,7 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader { attachment.regionV = rectRegion.y / root.height; attachment.regionU2 = (rectRegion.x + subTexture.width) / root.width; attachment.regionV2 = (rectRegion.y + subTexture.height) / root.height; + attachment.rendererObject = new Image(root); } else { attachment.regionU = 0; attachment.regionV = 1; @@ -148,6 +120,10 @@ public class StarlingAtlasAttachmentLoader implements AttachmentLoader { public function newBoundingBoxAttachment (skin:Skin, name:String) : BoundingBoxAttachment { return new BoundingBoxAttachment(name); } + + public function newPathAttachment (skin:Skin, name:String) : PathAttachment { + return new PathAttachment(name); + } } } diff --git a/spine-starling/spine-starling/src/spine/starling/StarlingTextureLoader.as b/spine-starling/spine-starling/src/spine/starling/StarlingTextureLoader.as index 46721a064..4dcc54e7b 100644 --- a/spine-starling/spine-starling/src/spine/starling/StarlingTextureLoader.as +++ b/spine-starling/spine-starling/src/spine/starling/StarlingTextureLoader.as @@ -30,6 +30,7 @@ *****************************************************************************/ package spine.starling { + import starling.display.Image; import spine.atlas.AtlasPage; import spine.atlas.AtlasRegion; import spine.atlas.TextureLoader; @@ -78,17 +79,17 @@ public class StarlingTextureLoader implements TextureLoader { } public function loadRegion (region:AtlasRegion) : void { - var image:SkeletonImage = new SkeletonImage(Texture(region.page.rendererObject)); - if (region.rotate) { - image.setTexCoordsTo(0, region.u, region.v2); - image.setTexCoordsTo(1, region.u, region.v); - image.setTexCoordsTo(2, region.u2, region.v2); - image.setTexCoordsTo(3, region.u2, region.v); + var image:Image = new Image(Texture(region.page.rendererObject)); + if (region.rotate) { + image.setTexCoords(0, region.u, region.v2); + image.setTexCoords(1, region.u, region.v); + image.setTexCoords(2, region.u2, region.v2); + image.setTexCoords(3, region.u2, region.v); } else { - image.setTexCoordsTo(0, region.u, region.v); - image.setTexCoordsTo(1, region.u2, region.v); - image.setTexCoordsTo(2, region.u, region.v2); - image.setTexCoordsTo(3, region.u2, region.v2); + image.setTexCoords(0, region.u, region.v); + image.setTexCoords(1, region.u2, region.v); + image.setTexCoords(2, region.u, region.v2); + image.setTexCoords(3, region.u2, region.v2); } region.rendererObject = image; }