Browse Source

[monogame] Created new MonoGame solution and projects as replacement for spine-xna. See #1949.

Mario Zechner 3 years ago
parent
commit
5e57b86ce3
41 changed files with 9566 additions and 223 deletions
  1. 7 0
      .gitignore
  2. 1 0
      spine-monogame/.mgstats
  3. 0 38
      spine-monogame/example.sln
  4. 0 146
      spine-monogame/example/spine-monogame-example.csproj
  5. 33 0
      spine-monogame/spine-monogame-example/Content/Content.mgcb
  6. 0 0
      spine-monogame/spine-monogame-example/Content/shaders/SpineEffect.fx
  7. 125 0
      spine-monogame/spine-monogame-example/Content/shaders/SpineEffectNormalmap.fx
  8. 123 0
      spine-monogame/spine-monogame-example/Content/shaders/SpineEffectOutline.fx
  9. 1 1
      spine-monogame/spine-monogame-example/ExampleGame.cs
  10. 0 0
      spine-monogame/spine-monogame-example/ExampleProgram.cs
  11. 0 0
      spine-monogame/spine-monogame-example/Icon.bmp
  12. 0 0
      spine-monogame/spine-monogame-example/Icon.ico
  13. 1 0
      spine-monogame/spine-monogame-example/app.manifest
  14. 259 0
      spine-monogame/spine-monogame-example/data/coin-pro.json
  15. BIN
      spine-monogame/spine-monogame-example/data/coin-pro.skel
  16. 18 0
      spine-monogame/spine-monogame-example/data/coin.atlas
  17. BIN
      spine-monogame/spine-monogame-example/data/coin.png
  18. 1211 0
      spine-monogame/spine-monogame-example/data/mix-and-match-pro.json
  19. 362 0
      spine-monogame/spine-monogame-example/data/mix-and-match.atlas
  20. BIN
      spine-monogame/spine-monogame-example/data/mix-and-match.png
  21. 692 0
      spine-monogame/spine-monogame-example/data/raptor-pro.json
  22. 99 0
      spine-monogame/spine-monogame-example/data/raptor.atlas
  23. BIN
      spine-monogame/spine-monogame-example/data/raptor.png
  24. BIN
      spine-monogame/spine-monogame-example/data/raptor_normals.png
  25. BIN
      spine-monogame/spine-monogame-example/data/spineboy-pro.skel
  26. 101 0
      spine-monogame/spine-monogame-example/data/spineboy.atlas
  27. BIN
      spine-monogame/spine-monogame-example/data/spineboy.png
  28. 5020 0
      spine-monogame/spine-monogame-example/data/tank-pro.json
  29. 56 0
      spine-monogame/spine-monogame-example/data/tank.atlas
  30. BIN
      spine-monogame/spine-monogame-example/data/tank.png
  31. 58 0
      spine-monogame/spine-monogame-example/spine-monogame-example.csproj
  32. 31 0
      spine-monogame/spine-monogame.sln
  33. 0 6
      spine-monogame/spine-monogame/Content/Content.mgcb
  34. 318 0
      spine-monogame/spine-monogame/spine-monogame.csproj
  35. 195 0
      spine-monogame/spine-monogame/src/MeshBatcher.cs
  36. 165 0
      spine-monogame/spine-monogame/src/ShapeRenderer.cs
  37. 228 0
      spine-monogame/spine-monogame/src/SkeletonDebugRenderer.cs
  38. 226 0
      spine-monogame/spine-monogame/src/SkeletonRenderer.cs
  39. 46 32
      spine-monogame/spine-monogame/src/Util.cs
  40. 97 0
      spine-monogame/spine-monogame/src/VertexEffect.cs
  41. 93 0
      spine-monogame/spine-monogame/src/XnaTextureLoader.cs

+ 7 - 0
.gitignore

@@ -155,3 +155,10 @@ spine-ts/spine-threejs/dist
 spine-libgdx/gradle
 spine-libgdx/gradlew
 spine-libgdx/gradlew.bat
+spine-monogame/packages
+spine-monogame/spine-monogame/bin
+spine-monogame/spine-monogame/obj
+spine-monogame/spine-monogame-example/Content/bin
+spine-monogame/spine-monogame-example/Content/obj
+spine-monogame/spine-monogame-example/bin
+spine-monogame/spine-monogame-example/obj

+ 1 - 0
spine-monogame/.mgstats

@@ -0,0 +1 @@
+Source File,Dest File,Processor Type,Content Type,Source File Size,Dest File Size,Build Seconds

+ 0 - 38
spine-monogame/example.sln

@@ -1,38 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spine-monogame-example", "example\spine-monogame-example.csproj", "{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spine-csharp", "..\spine-csharp\spine-csharp.csproj", "{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Debug|x86 = Debug|x86
-		Release|Any CPU = Release|Any CPU
-		Release|x86 = Release|x86
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Debug|x86.Build.0 = Debug|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Release|Any CPU.Build.0 = Release|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Release|x86.ActiveCfg = Release|Any CPU
-		{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}.Release|x86.Build.0 = Release|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Debug|x86.Build.0 = Debug|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Release|x86.ActiveCfg = Release|Any CPU
-		{94144E22-2431-4A8F-AC04-DEC22F7EDD8F}.Release|x86.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal

+ 0 - 146
spine-monogame/example/spine-monogame-example.csproj

@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>8.0.30703</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{0A7474EC-4DF9-40E7-B920-D1D1601F20A7}</ProjectGuid>
-    <OutputType>WinExe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>spine_monogame_example</RootNamespace>
-    <AssemblyName>spine-monogame-example</AssemblyName>
-    <FileAlignment>512</FileAlignment>
-    <MonoGamePlatform>DesktopGL</MonoGamePlatform>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\</OutputPath>
-    <DefineConstants>DEBUG;TRACE;LINUX</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x64</PlatformTarget>
-    <ErrorReport>prompt</ErrorReport>
-    <Prefer32Bit>false</Prefer32Bit>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
-    <OutputPath>bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\</OutputPath>
-    <DefineConstants>TRACE;LINUX</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <ErrorReport>prompt</ErrorReport>
-    <Prefer32Bit>false</Prefer32Bit>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>Icon.ico</ApplicationIcon>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationManifest>app.manifest</ApplicationManifest>
-  </PropertyGroup>
-  <ItemGroup>
-    <Compile Include="..\..\spine-xna\src\ShapeRenderer.cs">
-      <Link>spine-xna\ShapeRenderer.cs</Link>
-    </Compile>
-    <Compile Include="..\..\spine-xna\src\SkeletonDebugRenderer.cs">
-      <Link>spine-xna\SkeletonDebugRenderer.cs</Link>
-    </Compile>
-    <Compile Include="..\..\spine-xna\src\VertexEffect.cs">
-      <Link>spine-xna\VertexEffect.cs</Link>
-    </Compile>    
-    <Compile Include="..\..\spine-xna\src\MeshBatcher.cs">
-      <Link>spine-xna\MeshBatcher.cs</Link>
-    </Compile>
-    <Compile Include="..\..\spine-xna\src\SkeletonRenderer.cs">
-      <Link>spine-xna\SkeletonRenderer.cs</Link>
-    </Compile>
-    <Compile Include="..\..\spine-xna\src\Util.cs">
-      <Link>spine-xna\Util.cs</Link>
-    </Compile>
-    <Compile Include="..\..\spine-xna\src\XnaTextureLoader.cs">
-      <Link>spine-xna\XnaTextureLoader.cs</Link>
-    </Compile>
-    <Compile Include="ExampleGame.cs" />
-    <Compile Include="ExampleProgram.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Reference Include="MonoGame.Framework">
-      <HintPath>$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\MonoGame.Framework.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Icon.ico" />
-    <EmbeddedResource Include="Icon.bmp" />
-  </ItemGroup>
-  <ItemGroup>
-    <MonoGameContentReference Include="Content\Content.mgcb">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </MonoGameContentReference>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x86\SDL2.dll">
-      <Link>x86\SDL2.dll</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x64\SDL2.dll">
-      <Link>x64\SDL2.dll</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x86\soft_oal.dll">
-      <Link>x86\soft_oal.dll</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x64\soft_oal.dll">
-      <Link>x64\soft_oal.dll</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x86\libSDL2-2.0.so.0">
-      <Link>x86\libSDL2-2.0.so.0</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x64\libSDL2-2.0.so.0">
-      <Link>x64\libSDL2-2.0.so.0</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x86\libopenal.so.1">
-      <Link>x86\libopenal.so.1</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\x64\libopenal.so.1">
-      <Link>x64\libopenal.so.1</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\MonoGame.Framework.dll.config">
-      <Link>MonoGame.Framework.dll.config</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="app.manifest" />
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\libopenal.1.dylib">
-      <Link>x64\libopenal.1.dylib</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\libSDL2-2.0.0.dylib">
-      <Link>x64\libSDL2-2.0.0.dylib</Link>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\spine-csharp\spine-csharp.csproj">
-      <Project>{94144e22-2431-4a8f-ac04-dec22f7edd8f}</Project>
-      <Name>spine-csharp</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Content.Builder.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>

+ 33 - 0
spine-monogame/spine-monogame-example/Content/Content.mgcb

@@ -0,0 +1,33 @@
+
+#----------------------------- Global Properties ----------------------------#
+
+/outputDir:bin/$(Platform)
+/intermediateDir:obj/$(Platform)
+/platform:DesktopGL
+/config:
+/profile:Reach
+/compress:False
+
+#-------------------------------- References --------------------------------#
+
+
+#---------------------------------- Content ---------------------------------#
+
+#begin SpineEffect.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:shaders\\SpineEffect.fx
+
+#begin SpineEffectNormalMap.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:shaders\\SpineEffectNormalMap.fx
+
+#begin SpineEffectOutline.fx
+/importer:EffectImporter
+/processor:EffectProcessor
+/processorParam:DebugMode=Auto
+/build:shaders\\SpineEffectOutline.fx
+

+ 0 - 0
spine-monogame/example/Content/SpineEffect.fx → spine-monogame/spine-monogame-example/Content/shaders/SpineEffect.fx


+ 125 - 0
spine-monogame/spine-monogame-example/Content/shaders/SpineEffectNormalmap.fx

@@ -0,0 +1,125 @@
+#if OPENGL
+	#define SV_POSITION POSITION
+	#define VS_SHADERMODEL vs_3_0
+	#define PS_SHADERMODEL ps_3_0
+#else
+	#define VS_SHADERMODEL vs_4_0_level_9_1
+	#define PS_SHADERMODEL ps_4_0_level_9_1
+#endif
+
+float4x4 World;
+float4x4 View;
+float4x4 Projection;
+
+// Light0 parameters.
+// Default values set below, change them via spineEffect.Parameters["Light0_Direction"] and similar.
+float3 Light0_Direction = float3(-0.5265408f, -0.5735765f, -0.6275069f);
+float3 Light0_Diffuse = float3(1, 1, 1);
+float3 Light0_Specular = float3(1, 1, 1);
+float Light0_SpecularExponent = 2.0; // also called "shininess", "specular hardness"
+
+sampler TextureSampler : register(s0);
+sampler NormalmapSampler : register(s1);
+
+// TODO: add effect parameters here.
+
+float NormalmapIntensity = 1;
+
+float3 GetNormal(sampler normalmapSampler, float2 uv, float3 worldPos, float3 vertexNormal)
+{
+	// Reconstruct tangent space TBN matrix
+	float3 pos_dx = ddx(worldPos);
+	float3 pos_dy = ddy(worldPos);
+	float3 tex_dx = float3(ddx(uv), 0.0);
+	float3 tex_dy = float3(ddy(uv), 0.0);
+	float divisor = (tex_dx.x * tex_dy.y - tex_dy.x * tex_dx.y);
+	float3 t = (tex_dy.y * pos_dx - tex_dx.y * pos_dy) / divisor;
+
+	float divisorBinormal = (tex_dy.y * tex_dx.x - tex_dx.y * tex_dy.x);
+	float3 b = (tex_dx.x * pos_dy - tex_dy.x * pos_dx) / divisorBinormal;
+
+	t = normalize(t - vertexNormal * dot(vertexNormal, t));
+	b = normalize(b - vertexNormal * dot(vertexNormal, b));
+	float3x3 tbn = float3x3(t, b, vertexNormal);
+
+	float3 n = 2.0 * tex2D(normalmapSampler, uv).rgb - 1.0;
+#ifdef INVERT_NORMALMAP_Y
+	n.y = -n.y;
+#endif
+	n = normalize(mul(n * float3(NormalmapIntensity, NormalmapIntensity, 1.0), tbn));
+	return n;
+}
+
+void GetLightContributionBlinnPhong(inout float3 diffuseResult, inout float3 specularResult,
+	float3 lightDirection, float3 lightDiffuse, float3 lightSpecular, float specularExponent, float3 normal, float3 viewDirection)
+{
+	diffuseResult += lightDiffuse * max(0.0, dot(normal, -lightDirection));
+	half3 halfVector = normalize(-lightDirection + viewDirection);
+	float nDotH = max(0, dot(normal, halfVector));
+	specularExponent = max(0.00001, specularExponent); // prevent fx compiler error at pow() below
+	specularResult += lightSpecular * pow(nDotH, specularExponent);
+}
+
+struct VertexShaderInput
+{
+    float4 Position : POSITION0;
+	float4 Color : COLOR0;
+	float4 TextureCoordinate : TEXCOORD0;
+	float4 Color2 : COLOR1;
+};
+
+struct VertexShaderOutput
+{
+    float4 Position : POSITION0;
+	float4 Color : COLOR0;
+	float4 TextureCoordinate : TEXCOORD0;
+	float4 Color2 : COLOR1;
+	float3 WorldNormal : TEXCOORD1;
+	float4 WorldPosition : TEXCOORD2; // for tangent reconstruction
+};
+
+VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
+{
+    VertexShaderOutput output;
+
+    float4 worldPosition = mul(input.Position, World);
+    float4 viewPosition = mul(worldPosition, View);
+    output.Position = mul(viewPosition, Projection);
+	output.TextureCoordinate = input.TextureCoordinate;
+	output.Color = input.Color;
+	output.Color2 = input.Color2;
+
+	output.WorldNormal = mul(transpose(View), float4(0, 0, 1, 0)).xyz;
+	output.WorldPosition = worldPosition;
+    return output;
+}
+
+float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
+{
+	float4 texColor = tex2D(TextureSampler, input.TextureCoordinate);
+	float3 normal = GetNormal(NormalmapSampler, input.TextureCoordinate, input.WorldPosition, input.WorldNormal);
+	float3 viewDirection = -input.WorldNormal;
+
+	float alpha = texColor.a * input.Color.a;
+	float4 output;
+	output.a = alpha;
+	output.rgb = ((texColor.a - 1.0) * input.Color2.a + 1.0 - texColor.rgb) * input.Color2.rgb + texColor.rgb * input.Color.rgb;
+
+	float3 diffuseLight = float3(0, 0, 0);
+	float3 specularLight = float3(0, 0, 0);
+	GetLightContributionBlinnPhong(diffuseLight, specularLight,
+		Light0_Direction, Light0_Diffuse, Light0_Specular, Light0_SpecularExponent, normal, viewDirection);
+	output.rgb = diffuseLight * output.rgb + specularLight;
+	return output;
+}
+
+technique Technique1
+{
+    pass Pass1
+    {
+        // TODO: set renderstates here.
+
+        VertexShader = compile vs_3_0 VertexShaderFunction();
+        PixelShader = compile ps_3_0 PixelShaderFunction();
+    }
+}

+ 123 - 0
spine-monogame/spine-monogame-example/Content/shaders/SpineEffectOutline.fx

@@ -0,0 +1,123 @@
+#if OPENGL
+	#define SV_POSITION POSITION
+	#define VS_SHADERMODEL vs_3_0
+	#define PS_SHADERMODEL ps_3_0
+#else
+	#define VS_SHADERMODEL vs_4_0_level_9_1
+	#define PS_SHADERMODEL ps_4_0_level_9_1
+#endif
+
+
+float4x4 World;
+float4x4 View;
+float4x4 Projection;
+
+sampler TextureSampler : register(s0);
+
+float _OutlineWidth = 3;
+float4 _OutlineColor = float4(1, 1, 0, 1);
+float _ThresholdEnd = 0.25;
+float _OutlineSmoothness = 1.0;
+float _OutlineMipLevel = 0;
+
+// TODO: add effect parameters here.
+
+struct VertexShaderInput
+{
+    float4 Position : POSITION0;
+	float4 Color : COLOR0;
+	float4 TextureCoordinate : TEXCOORD0;
+	float4 Color2 : COLOR1;
+};
+
+struct VertexShaderOutput
+{
+    float4 Position : POSITION0;
+	float4 Color : COLOR0;
+	float4 TextureCoordinate : TEXCOORD0;
+	float4 Color2 : COLOR1;
+};
+
+VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
+{
+    VertexShaderOutput output;
+
+    float4 worldPosition = mul(input.Position, World);
+    float4 viewPosition = mul(worldPosition, View);
+    output.Position = mul(viewPosition, Projection);
+	output.TextureCoordinate = input.TextureCoordinate;
+	output.Color = input.Color;
+	output.Color2 = input.Color2;
+
+    return output;
+}
+
+float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
+{
+	float4 texColor = tex2D(TextureSampler, input.TextureCoordinate);
+	float alpha = texColor.a * input.Color.a;
+	float4 output;
+	output.a = alpha;
+	output.rgb = ((texColor.a - 1.0) * input.Color2.a + 1.0 - texColor.rgb) * input.Color2.rgb + texColor.rgb * input.Color.rgb;
+
+	return output;
+}
+
+// Outline pass
+#define _USE8NEIGHBOURHOOD_ON
+
+float4 PixelShaderFunctionOutline(VertexShaderOutput i) : COLOR0
+{
+	float4 texColor = float4(0,0,0,0);
+
+	float uvDeltaPerPixel = max(ddx(i.TextureCoordinate), ddy(i.TextureCoordinate));
+	float outlineWidthCompensated = _OutlineWidth * uvDeltaPerPixel;
+	float xOffset = outlineWidthCompensated;
+	float yOffset = outlineWidthCompensated;
+	float xOffsetDiagonal = outlineWidthCompensated * 0.7;
+	float yOffsetDiagonal = outlineWidthCompensated * 0.7;
+
+	float pixelCenter = tex2D(TextureSampler, i.TextureCoordinate).a;
+
+	float4 uvCenterWithLod = float4(i.TextureCoordinate.xy, 0, _OutlineMipLevel);
+	float pixelTop = tex2Dlod(TextureSampler, uvCenterWithLod + float4(0,  yOffset, 0, 0)).a;
+	float pixelBottom = tex2Dlod(TextureSampler, uvCenterWithLod + float4(0, -yOffset, 0, 0)).a;
+	float pixelLeft = tex2Dlod(TextureSampler, uvCenterWithLod + float4(-xOffset, 0, 0, 0)).a;
+	float pixelRight = tex2Dlod(TextureSampler, uvCenterWithLod + float4(xOffset, 0, 0, 0)).a;
+#ifdef _USE8NEIGHBOURHOOD_ON
+	float numSamples = 8;
+	float pixelTopLeft = tex2Dlod(TextureSampler, uvCenterWithLod + float4(-xOffsetDiagonal, yOffsetDiagonal, 0, 0)).a;
+	float pixelTopRight = tex2Dlod(TextureSampler, uvCenterWithLod + float4(xOffsetDiagonal, yOffsetDiagonal, 0, 0)).a;
+	float pixelBottomLeft = tex2Dlod(TextureSampler, uvCenterWithLod + float4(-xOffsetDiagonal, -yOffsetDiagonal, 0, 0)).a;
+	float pixelBottomRight = tex2Dlod(TextureSampler, uvCenterWithLod + float4(xOffsetDiagonal, -yOffsetDiagonal, 0, 0)).a;
+	float average = (pixelTop + pixelBottom + pixelLeft + pixelRight +
+		pixelTopLeft + pixelTopRight + pixelBottomLeft + pixelBottomRight)
+		* i.Color.a / numSamples;
+#else // 4 neighbourhood
+	float numSamples = 1;
+	float average = (pixelTop + pixelBottom + pixelLeft + pixelRight) * i.Color.a / numSamples;
+#endif
+
+	float thresholdStart = _ThresholdEnd * (1.0 - _OutlineSmoothness);
+	float outlineAlpha = saturate((average - thresholdStart) / (_ThresholdEnd - thresholdStart)) - pixelCenter;
+	texColor.rgba = lerp(texColor, _OutlineColor, outlineAlpha);
+	return texColor;
+}
+
+technique Technique1
+{
+    pass OutlinePass
+    {
+        // TODO: set renderstates here.
+
+        VertexShader = compile vs_3_0 VertexShaderFunction();
+        PixelShader = compile ps_3_0 PixelShaderFunctionOutline();
+    }
+	pass Pass2
+	{
+		// TODO: set renderstates here.
+
+		VertexShader = compile vs_2_0 VertexShaderFunction();
+		PixelShader = compile ps_2_0 PixelShaderFunction();
+	}
+}

+ 1 - 1
spine-monogame/example/ExampleGame.cs → spine-monogame/spine-monogame-example/ExampleGame.cs

@@ -119,7 +119,7 @@ namespace Spine {
 		public TankScreen (Example game) : base(game) {
 			// Instantiate and configure the two color tinting effect and
 			// assign it to the skeleton renderer
-			var twoColorTintEffect = game.Content.Load<Effect>("Content\\SpineEffect");
+			var twoColorTintEffect = game.Content.Load<Effect>("Content\\shaders\\SpineEffect");
 			twoColorTintEffect.Parameters["World"].SetValue(Matrix.Identity);
 			twoColorTintEffect.Parameters["View"].SetValue(Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up));
 			skeletonRenderer.Effect = twoColorTintEffect;

+ 0 - 0
spine-monogame/example/ExampleProgram.cs → spine-monogame/spine-monogame-example/ExampleProgram.cs


+ 0 - 0
spine-monogame/example/Icon.bmp → spine-monogame/spine-monogame-example/Icon.bmp


+ 0 - 0
spine-monogame/example/Icon.ico → spine-monogame/spine-monogame-example/Icon.ico


+ 1 - 0
spine-monogame/example/app.manifest → spine-monogame/spine-monogame-example/app.manifest

@@ -36,6 +36,7 @@
   <application xmlns="urn:schemas-microsoft-com:asm.v3">
     <windowsSettings>
       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
+      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness>
     </windowsSettings>
   </application>
 

+ 259 - 0
spine-monogame/spine-monogame-example/data/coin-pro.json

@@ -0,0 +1,259 @@
+{
+"skeleton": {
+	"hash": "5q2VQysgSd0",
+	"spine": "4.1.04-beta",
+	"x": -152.5,
+	"y": -151,
+	"width": 305,
+	"height": 302,
+	"images": "./images/",
+	"audio": ""
+},
+"bones": [
+	{ "name": "root" },
+	{ "name": "coin-front", "parent": "root" },
+	{ "name": "clipping", "parent": "coin-front" },
+	{ "name": "coin-sides", "parent": "root" },
+	{ "name": "coin-side-round", "parent": "coin-sides" },
+	{ "name": "coin-side-straight", "parent": "coin-sides" },
+	{ "name": "shine", "parent": "root", "x": 243.14 }
+],
+"slots": [
+	{ "name": "coin-side", "bone": "coin-side-straight", "color": "ffdb2fff", "attachment": "coin-side-straight" },
+	{ "name": "coin-side-round", "bone": "coin-side-round", "color": "ffdb2fff", "attachment": "coin-side-round" },
+	{ "name": "coin-front-texture", "bone": "coin-front", "color": "868686ff", "attachment": "coin-front-logo" },
+	{ "name": "coin-front-shine", "bone": "coin-front", "color": "888888ff", "dark": "000000", "attachment": "coin-front-shine-logo", "blend": "additive" },
+	{ "name": "clipping", "bone": "clipping", "attachment": "clipping" },
+	{ "name": "shine", "bone": "shine", "color": "ffffff60", "attachment": "shine", "blend": "additive" }
+],
+"skins": [
+	{
+		"name": "default",
+		"attachments": {
+			"clipping": {
+				"clipping": {
+					"type": "clipping",
+					"end": "clipping",
+					"vertexCount": 39,
+					"vertices": [ 0.1, 140.26, -26.4, 138.14, -50.51, 131.25, -75.42, 119.06, -98.21, 101.04, -115.44, 82.22, -127.63, 62.08, -136.11, 39.03, -140.08, 19.68, -141.41, -0.19, -140.08, -22.98, -134.78, -45.5, -125.24, -66.44, -113.32, -84.19, -98.21, -101.95, -80.46, -116.52, -61.38, -127.39, -38.92, -134.81, -18.22, -139.27, -0.14, -140.58, 24.23, -138.48, 45.45, -132.46, 67.98, -122.5, 86.58, -110.19, 102.56, -95.25, 115.4, -78.75, 125.36, -61.72, 134, -42.33, 138.46, -22.15, 139.24, -0.15, 138.46, 20.29, 133.48, 39.94, 127.19, 58.54, 117.5, 76.1, 104.4, 92.86, 88.42, 108.32, 69.03, 121.42, 50.43, 130.85, 26.32, 137.4 ],
+					"color": "ce3a3aff"
+				}
+			},
+			"coin-front-shine": {
+				"coin-front-shine-logo": { "width": 282, "height": 282 },
+				"coin-front-shine-spineboy": { "width": 282, "height": 282 }
+			},
+			"coin-front-texture": {
+				"coin-front-logo": { "width": 305, "height": 302 },
+				"coin-front-spineboy": { "width": 305, "height": 302 }
+			},
+			"coin-side": {
+				"coin-side-straight": { "x": 0.5, "width": 17, "height": 282 }
+			},
+			"coin-side-round": {
+				"coin-side-round": { "x": -69.43, "width": 144, "height": 282 }
+			},
+			"shine": {
+				"shine": { "y": 0.5, "scaleX": 1.6004, "scaleY": 1.6004, "width": 72, "height": 245 }
+			}
+		}
+	}
+],
+"animations": {
+	"animation": {
+		"slots": {
+			"coin-front-shine": {
+				"rgba2": [
+					{ "light": "7d7d7dff", "dark": "000000" },
+					{ "time": 0.2667, "light": "000000ff", "dark": "7e7e7e" },
+					{ "time": 0.664, "light": "000000ff", "dark": "000000" },
+					{ "time": 1.0333, "light": "7f7f7fff", "dark": "000000" },
+					{ "time": 1.3333, "light": "404040ff", "dark": "000000" },
+					{ "time": 1.6, "light": "000000ff", "dark": "7e7e7e" },
+					{ "time": 2.0022, "light": "000000ff", "dark": "000000" },
+					{ "time": 2.4, "light": "7f7f7fff", "dark": "000000" },
+					{ "time": 2.6667, "light": "7d7d7dff", "dark": "000000" }
+				],
+				"attachment": [
+					{ "time": 0.6667, "name": "coin-front-shine-spineboy" },
+					{ "time": 2, "name": "coin-front-shine-logo" }
+				]
+			},
+			"coin-front-texture": {
+				"rgba": [
+					{ "color": "858585ff" },
+					{ "time": 0.4, "color": "ffffffff" },
+					{
+						"time": 0.6696,
+						"color": "858585ff",
+						"curve": [ 0.725, 0.59, 0.892, 1, 0.725, 0.59, 0.892, 1, 0.725, 0.59, 0.892, 1, 0.725, 1, 0.892, 1 ]
+					},
+					{ "time": 0.9667, "color": "ffffffff" },
+					{ "time": 1.3318, "color": "858585ff", "curve": "stepped" },
+					{ "time": 1.3333, "color": "858585ff" },
+					{ "time": 1.7333, "color": "ffffffff" },
+					{ "time": 1.9982, "color": "858585ff", "curve": "stepped" },
+					{ "time": 2.0022, "color": "858585ff" },
+					{ "time": 2.3, "color": "ffffffff" },
+					{ "time": 2.6667, "color": "858585ff" }
+				],
+				"attachment": [
+					{ "time": 0.6667, "name": "coin-front-spineboy" },
+					{ "time": 2, "name": "coin-front-logo" }
+				]
+			}
+		},
+		"bones": {
+			"coin-front": {
+				"translate": [
+					{},
+					{ "time": 0.664, "x": 8.3, "curve": "stepped" },
+					{
+						"time": 0.6696,
+						"x": -8.3,
+						"curve": [ 0.794, -7.08, 1.167, 0, 0.794, 0, 1.167, 0 ]
+					},
+					{ "time": 1.3333 },
+					{ "time": 1.9982, "x": 8.3, "curve": "stepped" },
+					{ "time": 2.0022, "x": -8.3 },
+					{ "time": 2.6667 }
+				],
+				"scale": [
+					{
+						"curve": [ 0.164, 1, 0.484, 0.091, 0.164, 1, 0.484, 1 ]
+					},
+					{ "time": 0.664, "x": 0, "curve": "stepped" },
+					{
+						"time": 0.6696,
+						"x": 0.003,
+						"curve": [ 0.786, 0.153, 1.167, 1, 0.786, 1, 1.167, 1 ]
+					},
+					{
+						"time": 1.3333,
+						"curve": [ 1.442, 0.992, 1.858, 0.098, 1.442, 1, 1.858, 1 ]
+					},
+					{ "time": 1.9982, "x": 0.003, "curve": "stepped" },
+					{
+						"time": 2.0022,
+						"x": 0.003,
+						"curve": [ 2.123, 0.151, 2.501, 1, 2.123, 1, 2.501, 1 ]
+					},
+					{ "time": 2.6667 }
+				]
+			},
+			"coin-side-round": {
+				"translate": [
+					{},
+					{ "time": 0.664, "x": -6.75, "curve": "stepped" },
+					{
+						"time": 0.6696,
+						"x": 7.03,
+						"curve": [ 0.794, 5.99, 1.167, 0, 0.794, 0, 1.167, 0 ]
+					},
+					{ "time": 1.3333 },
+					{ "time": 1.9982, "x": -6.75, "curve": "stepped" },
+					{ "time": 2.0022, "x": 7.03 },
+					{ "time": 2.6667 }
+				],
+				"scale": [
+					{
+						"curve": [ 0.085, 1, 0.207, 0.789, 0.085, 1, 0.207, 1 ]
+					},
+					{
+						"time": 0.3333,
+						"x": 0.555,
+						"curve": [ 0.449, 0.347, 0.567, 0.122, 0.449, 1, 0.567, 1 ]
+					},
+					{ "time": 0.664, "x": 0.014, "curve": "stepped" },
+					{
+						"time": 0.6696,
+						"x": -0.028,
+						"curve": [ 0.723, -0.126, 0.865, -0.367, 0.723, 1, 0.865, 1 ]
+					},
+					{
+						"time": 1,
+						"x": -0.609,
+						"curve": [ 1.053, -0.778, 1.29, -0.997, 1.053, 1, 1.29, 1 ]
+					},
+					{ "time": 1.3318, "x": -1, "curve": "stepped" },
+					{
+						"time": 1.3333,
+						"curve": [ 1.384, 0.997, 1.439, 0.94, 1.384, 1, 1.439, 1 ]
+					},
+					{
+						"time": 1.5,
+						"x": 0.852,
+						"curve": [ 1.564, 0.748, 1.703, 0.509, 1.564, 1, 1.703, 1 ]
+					},
+					{
+						"time": 1.8,
+						"x": 0.315,
+						"curve": [ 1.873, 0.13, 1.987, 0.015, 1.873, 1, 1.987, 1 ]
+					},
+					{ "time": 1.9982, "x": 0.014, "curve": "stepped" },
+					{
+						"time": 2.0022,
+						"x": -0.028,
+						"curve": [ 2.039, -0.072, 2.123, -0.239, 2.039, 1, 2.123, 1 ]
+					},
+					{
+						"time": 2.2018,
+						"x": -0.365,
+						"curve": [ 2.269, -0.513, 2.337, -0.635, 2.269, 1, 2.337, 1 ]
+					},
+					{
+						"time": 2.4,
+						"x": -0.731,
+						"curve": [ 2.503, -0.871, 2.596, -0.961, 2.503, 1, 2.596, 1 ]
+					},
+					{
+						"time": 2.6592,
+						"x": -1,
+						"curve": [ 2.661, -1, 2.665, 1, 2.661, 1, 2.665, 1 ]
+					},
+					{ "time": 2.6667 }
+				]
+			},
+			"shine": {
+				"translate": [
+					{
+						"curve": [ 0.167, 0, 0.5, -473.39, 0.167, 0, 0.5, 0 ]
+					},
+					{
+						"time": 0.6667,
+						"x": -473.39,
+						"curve": [ 0.833, -473.39, 1.167, -33.16, 0.833, 0, 1.167, 0 ]
+					},
+					{
+						"time": 1.3333,
+						"x": -33.16,
+						"curve": [ 1.5, -33.16, 1.833, -473.39, 1.5, 0, 1.833, 0 ]
+					},
+					{
+						"time": 2,
+						"x": -473.39,
+						"curve": [ 2.167, -473.39, 2.5, 0, 2.167, 0, 2.5, 0 ]
+					},
+					{ "time": 2.6667 }
+				]
+			}
+		},
+		"drawOrder": [
+			{
+				"time": 0.6667,
+				"offsets": [
+					{ "slot": "coin-side", "offset": 2 }
+				]
+			},
+			{ "time": 0.6696 },
+			{
+				"time": 1.9982,
+				"offsets": [
+					{ "slot": "coin-side", "offset": 2 }
+				]
+			},
+			{ "time": 2.0022 }
+		]
+	}
+}
+}

BIN
spine-monogame/spine-monogame-example/data/coin-pro.skel


+ 18 - 0
spine-monogame/spine-monogame-example/data/coin.atlas

@@ -0,0 +1,18 @@
+coin.png
+	size: 1024, 1024
+	filter: Linear, Linear
+coin-front-logo
+	bounds: 2, 570, 305, 302
+coin-front-shine-logo
+	bounds: 2, 286, 282, 282
+coin-front-shine-spineboy
+	bounds: 305, 283, 282, 282
+coin-front-spineboy
+	bounds: 309, 567, 305, 302
+	rotate: 90
+coin-side-round
+	bounds: 2, 2, 144, 282
+coin-side-straight
+	bounds: 286, 286, 17, 282
+shine
+	bounds: 148, 39, 72, 245

BIN
spine-monogame/spine-monogame-example/data/coin.png


File diff suppressed because it is too large
+ 1211 - 0
spine-monogame/spine-monogame-example/data/mix-and-match-pro.json


+ 362 - 0
spine-monogame/spine-monogame-example/data/mix-and-match.atlas

@@ -0,0 +1,362 @@
+mix-and-match.png
+	size: 1024, 512
+	filter: Linear, Linear
+	scale: 0.5
+base-head
+	bounds: 587, 2, 95, 73
+boy/arm-front
+	bounds: 558, 271, 36, 115
+boy/backpack
+	bounds: 235, 109, 119, 153
+boy/backpack-pocket
+	bounds: 328, 73, 34, 62
+	rotate: 90
+boy/backpack-strap-front
+	bounds: 665, 79, 38, 88
+boy/backpack-up
+	bounds: 395, 364, 21, 70
+	rotate: 90
+boy/body
+	bounds: 251, 264, 97, 132
+	rotate: 90
+boy/boot-ribbon-front
+	bounds: 648, 131, 9, 11
+boy/collar
+	bounds: 744, 4, 73, 29
+	rotate: 90
+boy/ear
+	bounds: 383, 109, 19, 23
+	rotate: 90
+boy/eye-back-low-eyelid
+	bounds: 739, 284, 17, 6
+	rotate: 90
+boy/eye-back-pupil
+	bounds: 832, 443, 8, 9
+	rotate: 90
+boy/eye-back-up-eyelid
+	bounds: 558, 264, 23, 5
+boy/eye-back-up-eyelid-back
+	bounds: 802, 491, 19, 10
+	rotate: 90
+boy/eye-front-low-eyelid
+	bounds: 386, 363, 22, 7
+	rotate: 90
+boy/eye-front-pupil
+	bounds: 816, 389, 9, 9
+boy/eye-front-up-eyelid
+	bounds: 160, 71, 31, 6
+	rotate: 90
+boy/eye-front-up-eyelid-back
+	bounds: 801, 434, 26, 9
+	rotate: 90
+boy/eye-iris-back
+	bounds: 618, 264, 17, 17
+boy/eye-iris-front
+	bounds: 727, 264, 18, 18
+boy/eye-white-back
+	bounds: 580, 131, 20, 12
+boy/eye-white-front
+	bounds: 510, 130, 27, 13
+boy/eyebrow-back
+	bounds: 751, 88, 20, 11
+	rotate: 90
+boy/eyebrow-front
+	bounds: 483, 130, 25, 11
+boy/hair-back
+	bounds: 494, 388, 122, 81
+	rotate: 90
+boy/hair-bangs
+	bounds: 667, 284, 70, 37
+boy/hair-side
+	bounds: 789, 374, 25, 43
+boy/hand-backfingers
+	bounds: 467, 364, 19, 21
+boy/hand-front-fingers
+	bounds: 488, 364, 19, 21
+boy/hat
+	bounds: 615, 417, 93, 56
+	rotate: 90
+boy/leg-front
+	bounds: 138, 104, 31, 158
+boy/mouth-close
+	bounds: 551, 365, 21, 5
+	rotate: 90
+girl-blue-cape/mouth-close
+	bounds: 551, 365, 21, 5
+	rotate: 90
+girl-spring-dress/mouth-close
+	bounds: 551, 365, 21, 5
+	rotate: 90
+girl/mouth-close
+	bounds: 551, 365, 21, 5
+	rotate: 90
+boy/mouth-smile
+	bounds: 705, 79, 29, 7
+boy/nose
+	bounds: 836, 473, 17, 10
+	rotate: 90
+boy/pompom
+	bounds: 747, 273, 48, 43
+	rotate: 90
+boy/zip
+	bounds: 648, 144, 14, 23
+girl-blue-cape/back-eyebrow
+	bounds: 602, 131, 18, 12
+girl-blue-cape/body-dress
+	bounds: 2, 264, 109, 246
+girl-blue-cape/body-ribbon
+	bounds: 615, 283, 50, 38
+girl-blue-cape/cape-back
+	bounds: 2, 69, 134, 193
+girl-blue-cape/cape-back-up
+	bounds: 386, 387, 123, 106
+	rotate: 90
+girl-blue-cape/cape-ribbon
+	bounds: 675, 264, 50, 18
+girl-blue-cape/cape-shoulder-back
+	bounds: 751, 110, 49, 59
+girl-blue-cape/cape-shoulder-front
+	bounds: 113, 264, 62, 76
+	rotate: 90
+girl-blue-cape/cape-up-front
+	bounds: 399, 264, 98, 117
+	rotate: 90
+girl-blue-cape/ear
+	bounds: 775, 2, 19, 23
+girl-spring-dress/ear
+	bounds: 775, 2, 19, 23
+girl/ear
+	bounds: 775, 2, 19, 23
+girl-blue-cape/eye-back-low-eyelid
+	bounds: 802, 463, 17, 6
+girl-spring-dress/eye-back-low-eyelid
+	bounds: 802, 463, 17, 6
+girl/eye-back-low-eyelid
+	bounds: 802, 463, 17, 6
+girl-blue-cape/eye-back-pupil
+	bounds: 816, 367, 8, 9
+girl-spring-dress/eye-back-pupil
+	bounds: 816, 367, 8, 9
+girl/eye-back-pupil
+	bounds: 816, 367, 8, 9
+girl-blue-cape/eye-back-up-eyelid
+	bounds: 554, 131, 24, 12
+girl-spring-dress/eye-back-up-eyelid
+	bounds: 554, 131, 24, 12
+girl/eye-back-up-eyelid
+	bounds: 554, 131, 24, 12
+girl-blue-cape/eye-back-up-eyelid-back
+	bounds: 832, 453, 17, 11
+	rotate: 90
+girl-spring-dress/eye-back-up-eyelid-back
+	bounds: 832, 453, 17, 11
+	rotate: 90
+girl/eye-back-up-eyelid-back
+	bounds: 832, 453, 17, 11
+	rotate: 90
+girl-blue-cape/eye-front-low-eyelid
+	bounds: 739, 303, 18, 6
+	rotate: 90
+girl-spring-dress/eye-front-low-eyelid
+	bounds: 739, 303, 18, 6
+	rotate: 90
+girl/eye-front-low-eyelid
+	bounds: 739, 303, 18, 6
+	rotate: 90
+girl-blue-cape/eye-front-pupil
+	bounds: 816, 378, 9, 9
+girl-spring-dress/eye-front-pupil
+	bounds: 816, 378, 9, 9
+girl/eye-front-pupil
+	bounds: 816, 378, 9, 9
+girl-blue-cape/eye-front-up-eyelid
+	bounds: 392, 77, 30, 14
+	rotate: 90
+girl-spring-dress/eye-front-up-eyelid
+	bounds: 392, 77, 30, 14
+	rotate: 90
+girl/eye-front-up-eyelid
+	bounds: 392, 77, 30, 14
+	rotate: 90
+girl-blue-cape/eye-front-up-eyelid-back
+	bounds: 455, 130, 26, 11
+girl-spring-dress/eye-front-up-eyelid-back
+	bounds: 455, 130, 26, 11
+girl/eye-front-up-eyelid-back
+	bounds: 455, 130, 26, 11
+girl-blue-cape/eye-iris-back
+	bounds: 637, 264, 17, 17
+girl-blue-cape/eye-iris-front
+	bounds: 802, 471, 18, 18
+girl-blue-cape/eye-white-back
+	bounds: 596, 264, 20, 16
+girl-spring-dress/eye-white-back
+	bounds: 596, 264, 20, 16
+girl-blue-cape/eye-white-front
+	bounds: 796, 5, 20, 16
+	rotate: 90
+girl-spring-dress/eye-white-front
+	bounds: 796, 5, 20, 16
+	rotate: 90
+girl/eye-white-front
+	bounds: 796, 5, 20, 16
+	rotate: 90
+girl-blue-cape/front-eyebrow
+	bounds: 608, 149, 18, 12
+	rotate: 90
+girl-blue-cape/hair-back
+	bounds: 508, 145, 117, 98
+	rotate: 90
+girl-blue-cape/hair-bangs
+	bounds: 673, 419, 91, 40
+	rotate: 90
+girl-blue-cape/hair-head-side-back
+	bounds: 196, 331, 30, 52
+	rotate: 90
+girl-blue-cape/hair-head-side-front
+	bounds: 738, 323, 41, 42
+girl-blue-cape/hair-side
+	bounds: 473, 3, 36, 71
+girl-blue-cape/hand-front-fingers
+	bounds: 509, 365, 19, 21
+girl-spring-dress/hand-front-fingers
+	bounds: 509, 365, 19, 21
+girl-blue-cape/leg-front
+	bounds: 168, 72, 30, 158
+	rotate: 90
+girl-blue-cape/mouth-smile
+	bounds: 736, 79, 29, 7
+girl-spring-dress/mouth-smile
+	bounds: 736, 79, 29, 7
+girl/mouth-smile
+	bounds: 736, 79, 29, 7
+girl-blue-cape/nose
+	bounds: 747, 264, 11, 7
+girl-spring-dress/nose
+	bounds: 747, 264, 11, 7
+girl/nose
+	bounds: 747, 264, 11, 7
+girl-blue-cape/sleeve-back
+	bounds: 767, 79, 42, 29
+girl-blue-cape/sleeve-front
+	bounds: 408, 76, 52, 119
+	rotate: 90
+girl-spring-dress/arm-front
+	bounds: 596, 282, 17, 111
+girl-spring-dress/back-eyebrow
+	bounds: 801, 420, 18, 12
+girl-spring-dress/body-up
+	bounds: 179, 4, 64, 66
+girl-spring-dress/cloak-down
+	bounds: 775, 27, 50, 50
+girl-spring-dress/cloak-up
+	bounds: 360, 7, 64, 58
+	rotate: 90
+girl-spring-dress/eye-iris-back
+	bounds: 656, 264, 17, 17
+girl-spring-dress/eye-iris-front
+	bounds: 814, 492, 18, 18
+girl-spring-dress/front-eyebrow
+	bounds: 822, 472, 18, 12
+	rotate: 90
+girl-spring-dress/hair-back
+	bounds: 196, 363, 147, 93
+	rotate: 90
+girl-spring-dress/hair-bangs
+	bounds: 696, 326, 91, 40
+	rotate: 90
+girl-spring-dress/hair-head-side-back
+	bounds: 529, 76, 30, 52
+girl-spring-dress/hair-head-side-front
+	bounds: 781, 323, 41, 42
+girl-spring-dress/hair-side
+	bounds: 511, 3, 36, 71
+girl-spring-dress/leg-front
+	bounds: 171, 104, 30, 158
+girl-spring-dress/neck
+	bounds: 138, 70, 20, 32
+girl-spring-dress/shoulder-ribbon
+	bounds: 622, 131, 36, 24
+	rotate: 90
+girl-spring-dress/skirt
+	bounds: 113, 328, 182, 81
+	rotate: 90
+girl-spring-dress/underskirt
+	bounds: 2, 2, 175, 65
+girl/arm-front
+	bounds: 577, 395, 36, 115
+girl/back-eyebrow
+	bounds: 834, 492, 18, 12
+	rotate: 90
+girl/bag-base
+	bounds: 191, 264, 62, 58
+	rotate: 90
+girl/bag-strap-front
+	bounds: 385, 265, 12, 96
+girl/bag-top
+	bounds: 738, 367, 49, 50
+girl/body
+	bounds: 356, 130, 97, 132
+girl/boot-ribbon-front
+	bounds: 539, 130, 13, 13
+girl/eye-iris-back
+	bounds: 821, 424, 17, 17
+girl/eye-iris-front
+	bounds: 812, 443, 18, 18
+girl/eye-white-back
+	bounds: 814, 5, 20, 16
+	rotate: 90
+girl/front-eyebrow
+	bounds: 816, 400, 18, 12
+	rotate: 90
+girl/hair-back
+	bounds: 291, 363, 147, 93
+	rotate: 90
+girl/hair-bangs
+	bounds: 715, 419, 91, 40
+	rotate: 90
+girl/hair-flap-down-front
+	bounds: 288, 5, 70, 65
+girl/hair-head-side-back
+	bounds: 561, 77, 30, 52
+girl/hair-head-side-front
+	bounds: 757, 419, 41, 42
+	rotate: 90
+girl/hair-patch
+	bounds: 245, 4, 66, 41
+	rotate: 90
+girl/hair-side
+	bounds: 549, 3, 36, 71
+girl/hair-strand-back-1
+	bounds: 684, 3, 58, 74
+girl/hair-strand-back-2
+	bounds: 692, 171, 91, 58
+	rotate: 90
+girl/hair-strand-back-3
+	bounds: 615, 323, 92, 79
+	rotate: 90
+girl/hair-strand-front-1
+	bounds: 518, 269, 38, 94
+girl/hair-strand-front-2
+	bounds: 593, 79, 70, 50
+girl/hair-strand-front-3
+	bounds: 705, 88, 44, 81
+girl/hand-front-fingers
+	bounds: 530, 365, 19, 21
+girl/hat
+	bounds: 608, 169, 93, 82
+	rotate: 90
+girl/leg-front
+	bounds: 203, 104, 30, 158
+girl/pompom
+	bounds: 757, 462, 48, 43
+	rotate: 90
+girl/scarf
+	bounds: 455, 143, 119, 51
+	rotate: 90
+girl/scarf-back
+	bounds: 420, 2, 72, 51
+	rotate: 90
+girl/zip
+	bounds: 356, 109, 19, 25
+	rotate: 90

BIN
spine-monogame/spine-monogame-example/data/mix-and-match.png


File diff suppressed because it is too large
+ 692 - 0
spine-monogame/spine-monogame-example/data/raptor-pro.json


+ 99 - 0
spine-monogame/spine-monogame-example/data/raptor.atlas

@@ -0,0 +1,99 @@
+raptor.png
+	size: 1024, 512
+	filter: Linear, Linear
+back-arm
+	bounds: 829, 88, 46, 25
+	rotate: 90
+back-bracer
+	bounds: 195, 238, 39, 28
+	rotate: 90
+back-hand
+	bounds: 724, 140, 36, 34
+	rotate: 90
+back-knee
+	bounds: 760, 131, 49, 67
+	rotate: 90
+back-thigh
+	bounds: 225, 238, 39, 24
+	rotate: 90
+eyes-open
+	bounds: 975, 204, 47, 45
+front-arm
+	bounds: 969, 112, 48, 26
+front-bracer
+	bounds: 724, 97, 41, 29
+	rotate: 90
+front-hand
+	bounds: 251, 239, 41, 38
+front-open-hand
+	bounds: 856, 76, 43, 44
+	rotate: 90
+front-thigh
+	bounds: 729, 178, 57, 29
+	rotate: 90
+gun
+	bounds: 894, 251, 107, 103
+gun-nohand
+	bounds: 764, 241, 105, 102
+head
+	bounds: 756, 345, 136, 149
+lower-leg
+	bounds: 475, 237, 73, 98
+	rotate: 90
+mouth-grind
+	bounds: 975, 172, 47, 30
+mouth-smile
+	bounds: 975, 140, 47, 30
+neck
+	bounds: 366, 282, 18, 21
+raptor-back-arm
+	bounds: 636, 97, 82, 86
+	rotate: 90
+raptor-body
+	bounds: 2, 2, 632, 233
+raptor-front-arm
+	bounds: 871, 168, 81, 102
+	rotate: 90
+raptor-front-leg
+	bounds: 2, 237, 191, 257
+raptor-hindleg-back
+	bounds: 195, 279, 169, 215
+raptor-horn
+	bounds: 431, 312, 182, 80
+	rotate: 90
+raptor-horn-back
+	bounds: 513, 318, 176, 77
+	rotate: 90
+raptor-jaw
+	bounds: 894, 356, 126, 138
+raptor-jaw-tooth
+	bounds: 294, 240, 37, 48
+	rotate: 90
+raptor-mouth-inside
+	bounds: 344, 241, 36, 41
+	rotate: 90
+raptor-saddle-strap-back
+	bounds: 575, 242, 54, 74
+raptor-saddle-strap-front
+	bounds: 764, 182, 57, 95
+	rotate: 90
+raptor-saddle-w-shadow
+	bounds: 592, 323, 162, 171
+raptor-tail-shadow
+	bounds: 366, 305, 189, 63
+	rotate: 90
+raptor-tongue
+	bounds: 387, 239, 86, 64
+stirrup-back
+	bounds: 829, 136, 44, 35
+	rotate: 90
+stirrup-front
+	bounds: 866, 121, 45, 50
+	rotate: 90
+stirrup-strap
+	bounds: 918, 120, 49, 46
+torso
+	bounds: 636, 181, 54, 91
+	rotate: 90
+visor
+	bounds: 631, 237, 131, 84

BIN
spine-monogame/spine-monogame-example/data/raptor.png


BIN
spine-monogame/spine-monogame-example/data/raptor_normals.png


BIN
spine-monogame/spine-monogame-example/data/spineboy-pro.skel


+ 101 - 0
spine-monogame/spine-monogame-example/data/spineboy.atlas

@@ -0,0 +1,101 @@
+spineboy.png
+	size: 1024, 256
+	filter: Linear, Linear
+	scale: 0.5
+crosshair
+	bounds: 813, 160, 45, 45
+eye-indifferent
+	bounds: 569, 2, 47, 45
+eye-surprised
+	bounds: 643, 7, 47, 45
+	rotate: 90
+front-bracer
+	bounds: 811, 51, 29, 40
+front-fist-closed
+	bounds: 807, 93, 38, 41
+front-fist-open
+	bounds: 815, 210, 43, 44
+front-foot
+	bounds: 706, 64, 63, 35
+	rotate: 90
+front-shin
+	bounds: 80, 11, 41, 92
+front-thigh
+	bounds: 754, 12, 23, 56
+front-upper-arm
+	bounds: 618, 5, 23, 49
+goggles
+	bounds: 214, 20, 131, 83
+gun
+	bounds: 347, 14, 105, 102
+	rotate: 90
+head
+	bounds: 80, 105, 136, 149
+hoverboard-board
+	bounds: 2, 8, 246, 76
+	rotate: 90
+hoverboard-thruster
+	bounds: 478, 2, 30, 32
+hoverglow-small
+	bounds: 218, 117, 137, 38
+	rotate: 90
+mouth-grind
+	bounds: 775, 80, 47, 30
+	rotate: 90
+mouth-oooo
+	bounds: 779, 31, 47, 30
+	rotate: 90
+mouth-smile
+	bounds: 783, 207, 47, 30
+	rotate: 90
+muzzle-glow
+	bounds: 779, 4, 25, 25
+muzzle-ring
+	bounds: 451, 14, 25, 105
+muzzle01
+	bounds: 664, 60, 67, 40
+	rotate: 90
+muzzle02
+	bounds: 580, 56, 68, 42
+	rotate: 90
+muzzle03
+	bounds: 478, 36, 83, 53
+	rotate: 90
+muzzle04
+	bounds: 533, 49, 75, 45
+	rotate: 90
+muzzle05
+	bounds: 624, 56, 68, 38
+	rotate: 90
+neck
+	bounds: 806, 8, 18, 21
+portal-bg
+	bounds: 258, 121, 133, 133
+portal-flare1
+	bounds: 690, 2, 56, 30
+	rotate: 90
+portal-flare2
+	bounds: 510, 3, 57, 31
+portal-flare3
+	bounds: 722, 4, 58, 30
+	rotate: 90
+portal-shade
+	bounds: 393, 121, 133, 133
+portal-streaks1
+	bounds: 528, 126, 126, 128
+portal-streaks2
+	bounds: 656, 129, 125, 125
+rear-bracer
+	bounds: 826, 13, 28, 36
+rear-foot
+	bounds: 743, 70, 57, 30
+	rotate: 90
+rear-shin
+	bounds: 174, 14, 38, 89
+rear-thigh
+	bounds: 783, 158, 28, 47
+rear-upper-arm
+	bounds: 783, 136, 20, 44
+	rotate: 90
+torso
+	bounds: 123, 13, 49, 90

BIN
spine-monogame/spine-monogame-example/data/spineboy.png


+ 5020 - 0
spine-monogame/spine-monogame-example/data/tank-pro.json

@@ -0,0 +1,5020 @@
+{
+"skeleton": {
+	"hash": "zExzm/6YDxM",
+	"spine": "4.1.04-beta",
+	"x": -5852.65,
+	"y": -348.5,
+	"width": 7202.61,
+	"height": 1298.88,
+	"images": "./images/",
+	"audio": ""
+},
+"bones": [
+	{ "name": "root" },
+	{ "name": "tank-root", "parent": "root", "y": 146.79 },
+	{ "name": "tank-treads", "parent": "tank-root", "y": 48.35 },
+	{ "name": "tank-body", "parent": "tank-treads", "y": 10 },
+	{ "name": "guntower", "parent": "tank-body", "x": -21.72, "y": 245.48 },
+	{ "name": "antenna-root", "parent": "guntower", "x": 164.61, "y": 202.53 },
+	{ "name": "antenna1", "parent": "antenna-root", "length": 40, "rotation": 90, "y": 40, "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": "cannon-connector", "parent": "guntower", "x": -235.05, "y": 96.07 },
+	{ "name": "cannon-target", "parent": "tank-root", "x": -2276.67, "y": 400.17, "color": "0096ffff" },
+	{ "name": "cannon", "parent": "cannon-connector", "length": 946.68, "rotation": 180, "color": "ff4000ff" },
+	{
+		"name": "machinegun-mount",
+		"parent": "guntower",
+		"length": 90.98,
+		"rotation": 90,
+		"x": -123.73,
+		"y": 218.33,
+		"color": "15ff00ff"
+	},
+	{ "name": "machinegun-target", "parent": "tank-root", "x": -2272.76, "y": 607.77, "color": "0096ffff" },
+	{
+		"name": "machinegun",
+		"parent": "machinegun-mount",
+		"length": 208.95,
+		"rotation": 90,
+		"x": 91.52,
+		"y": -1.03,
+		"color": "15ff00ff"
+	},
+	{ "name": "machinegun-tip", "parent": "machinegun", "x": 210.43, "y": -12.21 },
+	{ "name": "rock", "parent": "root", "x": -1925.2, "y": 33.17 },
+	{
+		"name": "smoke-root",
+		"parent": "tank-root",
+		"x": -1200.38,
+		"y": 405.76,
+		"scaleX": -6.5,
+		"scaleY": 6.5,
+		"color": "ff4000ff"
+	},
+	{ "name": "smoke-glow", "parent": "smoke-root", "x": 62.92, "y": -0.71, "color": "ff4000ff" },
+	{
+		"name": "smoke1",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke10",
+		"parent": "smoke-root",
+		"rotation": -103.52,
+		"x": 25.45,
+		"y": 2.48,
+		"scaleX": 3.9011,
+		"scaleY": 2.8523,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke11",
+		"parent": "smoke-root",
+		"rotation": -103.52,
+		"x": 25.45,
+		"y": 2.48,
+		"scaleX": 3.9011,
+		"scaleY": 2.8523,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke12",
+		"parent": "smoke-root",
+		"rotation": -103.52,
+		"x": 25.45,
+		"y": 2.48,
+		"scaleX": 3.9011,
+		"scaleY": 2.8523,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke13",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke14",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke15",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke16",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke17",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke18",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke2",
+		"parent": "smoke-root",
+		"rotation": -84.14,
+		"x": 45.06,
+		"y": 29.7,
+		"scaleX": 3.3345,
+		"scaleY": 3.3345,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke20",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke21",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke22",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke23",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke24",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke25",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke26",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke27",
+		"parent": "smoke-root",
+		"rotation": -179.99,
+		"x": 14.75,
+		"y": -1.55,
+		"scaleX": 1.6484,
+		"scaleY": 1.6484,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke3",
+		"parent": "smoke-root",
+		"rotation": -87.91,
+		"x": 55.15,
+		"y": -17.5,
+		"scaleX": 3.0415,
+		"scaleY": 4.157,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke4",
+		"parent": "smoke-root",
+		"rotation": -87.91,
+		"x": 69.25,
+		"y": 8.01,
+		"scaleX": 2.1808,
+		"scaleY": 2.9807,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke5",
+		"parent": "smoke-root",
+		"rotation": -87.91,
+		"x": 80.63,
+		"y": 59.88,
+		"scaleX": 4.5119,
+		"scaleY": 2.9725,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke6",
+		"parent": "smoke-root",
+		"rotation": -87.91,
+		"x": 96.19,
+		"y": 25.65,
+		"scaleX": 3.7912,
+		"scaleY": 3.0552,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke7",
+		"parent": "smoke-root",
+		"rotation": 153.68,
+		"x": 85.65,
+		"y": -50.47,
+		"scaleX": 4.8523,
+		"scaleY": 3.6528,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke8",
+		"parent": "smoke-root",
+		"rotation": 67.58,
+		"x": 47.85,
+		"y": -42.55,
+		"scaleX": 4.0006,
+		"scaleY": 3.4796,
+		"color": "ff4000ff"
+	},
+	{
+		"name": "smoke9",
+		"parent": "smoke-root",
+		"rotation": 150.05,
+		"x": 104.02,
+		"y": -8.73,
+		"scaleX": 4.2074,
+		"scaleY": 3.0762,
+		"color": "ff4000ff"
+	},
+	{ "name": "tank-glow", "parent": "tank-root", "x": -247.72, "y": 404.37, "scaleX": 1.0582, "scaleY": 0.6785 },
+	{
+		"name": "tread",
+		"parent": "tank-root",
+		"length": 82,
+		"rotation": 180,
+		"x": -22.9,
+		"y": 213.86,
+		"scaleX": 0.9933,
+		"color": "e64344ff"
+	},
+	{ "name": "wheel-mid-center", "parent": "tank-root", "y": -66.21 },
+	{ "name": "tread-collider1", "parent": "wheel-mid-center", "x": -329.58, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "tread-collider2", "parent": "wheel-mid-center", "x": -165.95, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "tread-collider3", "parent": "wheel-mid-center", "y": -85.44, "color": "ff00fbff" },
+	{ "name": "tread-collider4", "parent": "wheel-mid-center", "x": 163.56, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "tread-collider5", "parent": "wheel-mid-center", "x": 329.12, "y": -85.44, "color": "ff00fbff" },
+	{ "name": "tread-gravity1", "parent": "tank-root", "rotation": 180, "x": -175.35, "y": 149.31, "color": "ff00fbff" },
+	{ "name": "tread-gravity2", "parent": "tank-root", "rotation": 180, "x": 177.89, "y": 144.78, "color": "ff00fbff" },
+	{
+		"name": "tread10",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 48.85,
+		"x": 662.9,
+		"y": -120.35,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread11",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 97.99,
+		"x": 651.5,
+		"y": -39.69,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread12",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 113.79,
+		"x": 618.43,
+		"y": 34.83,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread13",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 122.96,
+		"x": 573.82,
+		"y": 103.18,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread14",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 142.01,
+		"x": 509.19,
+		"y": 153.3,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread15",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.84,
+		"x": 433.25,
+		"y": 184.02,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread16",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.37,
+		"x": 357.56,
+		"y": 215.37,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread17",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.29,
+		"x": 281.92,
+		"y": 246.8,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread18",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.19,
+		"x": 206.33,
+		"y": 278.38,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread19",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.14,
+		"x": 130.77,
+		"y": 310.02,
+		"color": "e64344ff"
+	},
+	{ "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" },
+	{
+		"name": "tread20",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.34,
+		"x": 55.1,
+		"y": 341.41,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread21",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 158.11,
+		"x": -20.99,
+		"y": 371.77,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread22",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.99,
+		"x": -97.02,
+		"y": 402.28,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread23",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 157.59,
+		"x": -172.83,
+		"y": 433.33,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread24",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 156.86,
+		"x": -248.23,
+		"y": 465.34,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread25",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 177.94,
+		"x": -330.17,
+		"y": 468.27,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread26",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -169.55,
+		"x": -410.81,
+		"y": 453.5,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread27",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -163.86,
+		"x": -489.58,
+		"y": 430.86,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread28",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -139.13,
+		"x": -551.59,
+		"y": 377.57,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread29",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -89.04,
+		"x": -550.21,
+		"y": 296.14,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread3",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -8.91,
+		"x": 163.01,
+		"y": -12.61,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread30",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -38.99,
+		"x": -486.48,
+		"y": 244.89,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread31",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -20.04,
+		"x": -409.45,
+		"y": 216.98,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread32",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -46.24,
+		"x": -352.74,
+		"y": 158.15,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread33",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -27.95,
+		"x": -280.3,
+		"y": 119.98,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread34",
+		"parent": "tread",
+		"length": 82,
+		"rotation": 10.46,
+		"x": -199.66,
+		"y": 134.77,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread35",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -17.9,
+		"x": -121.63,
+		"y": 109.73,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread36",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -36.82,
+		"x": -55.99,
+		"y": 60.92,
+		"color": "fbff00ff"
+	},
+	{
+		"name": "tread4",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -29.27,
+		"x": 234.55,
+		"y": -52.43,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread5",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -45.26,
+		"x": 292.26,
+		"y": -110.28,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread6",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -15.29,
+		"x": 371.36,
+		"y": -131.76,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread7",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -5.49,
+		"x": 452.98,
+		"y": -139.55,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread8",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -24.99,
+		"x": 527.31,
+		"y": -173.95,
+		"color": "e64344ff"
+	},
+	{
+		"name": "tread9",
+		"parent": "tread",
+		"length": 82,
+		"rotation": -5.44,
+		"x": 608.94,
+		"y": -181.68,
+		"color": "e64344ff"
+	},
+	{ "name": "wheel-big-root1", "parent": "tank-treads", "x": -549.6, "y": 14.4, "color": "abe323ff" },
+	{ "name": "wheel-big-root2", "parent": "tank-treads", "x": 547.34, "y": 14.4 },
+	{ "name": "wheel-big1", "parent": "wheel-big-root1", "x": -0.02, "color": "abe323ff" },
+	{ "name": "wheel-big2", "parent": "wheel-big-root2" },
+	{ "name": "wheel-mid-root1", "parent": "wheel-mid-center", "x": -410.57, "color": "abe323ff" },
+	{ "name": "wheel-mid-root2", "parent": "wheel-mid-center", "x": -246.95 },
+	{ "name": "wheel-mid-root3", "parent": "wheel-mid-center", "x": -82.73 },
+	{ "name": "wheel-mid-root4", "parent": "wheel-mid-center", "x": 80.89 },
+	{ "name": "wheel-mid-root5", "parent": "wheel-mid-center", "x": 244.51 },
+	{ "name": "wheel-mid-root6", "parent": "wheel-mid-center", "x": 408.74 },
+	{ "name": "wheel-mid1", "parent": "wheel-mid-root1", "color": "abe323ff" },
+	{ "name": "wheel-mid2", "parent": "wheel-mid-root2" },
+	{ "name": "wheel-mid3", "parent": "wheel-mid-root3" },
+	{ "name": "wheel-mid4", "parent": "wheel-mid-root4" },
+	{ "name": "wheel-mid5", "parent": "wheel-mid-root5" },
+	{ "name": "wheel-mid6", "parent": "wheel-mid-root6" },
+	{ "name": "wheel-small-root1", "parent": "tank-treads", "x": -337.39, "y": 109.43 },
+	{ "name": "wheel-small-root2", "parent": "tank-treads", "x": 0.09, "y": 109.43 },
+	{ "name": "wheel-small-root3", "parent": "tank-treads", "x": 334.69, "y": 109.43 },
+	{ "name": "wheel-small1", "parent": "wheel-small-root1", "color": "abe323ff" },
+	{ "name": "wheel-small2", "parent": "wheel-small-root2" },
+	{ "name": "wheel-small3", "parent": "wheel-small-root3" }
+],
+"slots": [
+	{ "name": "rock", "bone": "rock", "attachment": "rock" },
+	{ "name": "ground", "bone": "root", "attachment": "ground" },
+	{ "name": "ground2", "bone": "root", "attachment": "ground" },
+	{ "name": "ground3", "bone": "root", "attachment": "ground" },
+	{ "name": "ground4", "bone": "root", "attachment": "ground" },
+	{ "name": "ground5", "bone": "root", "attachment": "ground" },
+	{ "name": "ground6", "bone": "root", "attachment": "ground" },
+	{ "name": "ground7", "bone": "root", "attachment": "ground" },
+	{ "name": "tank-body-shadow", "bone": "tank-body", "color": "ffffffb9", "attachment": "tank-bottom-shadow" },
+	{ "name": "bottom", "bone": "tank-body", "attachment": "tank-bottom" },
+	{ "name": "tread-inside1", "bone": "tread", "attachment": "tread-inside" },
+	{ "name": "tread-inside53", "bone": "tread27", "attachment": "tread-inside" },
+	{ "name": "tread-inside27", "bone": "tread14", "attachment": "tread-inside" },
+	{ "name": "tread-inside3", "bone": "tread2", "attachment": "tread-inside" },
+	{ "name": "tread-inside55", "bone": "tread28", "attachment": "tread-inside" },
+	{ "name": "tread-inside29", "bone": "tread15", "attachment": "tread-inside" },
+	{ "name": "tread-inside5", "bone": "tread3", "attachment": "tread-inside" },
+	{ "name": "tread-inside57", "bone": "tread29", "attachment": "tread-inside" },
+	{ "name": "tread-inside31", "bone": "tread16", "attachment": "tread-inside" },
+	{ "name": "tread-inside7", "bone": "tread4", "attachment": "tread-inside" },
+	{ "name": "tread-inside59", "bone": "tread30", "attachment": "tread-inside" },
+	{ "name": "tread-inside33", "bone": "tread17", "attachment": "tread-inside" },
+	{ "name": "tread-inside9", "bone": "tread5", "attachment": "tread-inside" },
+	{ "name": "tread-inside61", "bone": "tread31", "attachment": "tread-inside" },
+	{ "name": "tread-inside35", "bone": "tread18", "attachment": "tread-inside" },
+	{ "name": "tread-inside11", "bone": "tread6", "attachment": "tread-inside" },
+	{ "name": "tread-inside63", "bone": "tread32", "attachment": "tread-inside" },
+	{ "name": "tread-inside37", "bone": "tread19", "attachment": "tread-inside" },
+	{ "name": "tread-inside13", "bone": "tread7", "attachment": "tread-inside" },
+	{ "name": "tread-inside65", "bone": "tread33", "attachment": "tread-inside" },
+	{ "name": "tread-inside39", "bone": "tread20", "attachment": "tread-inside" },
+	{ "name": "tread-inside15", "bone": "tread8", "attachment": "tread-inside" },
+	{ "name": "tread-inside67", "bone": "tread34", "attachment": "tread-inside" },
+	{ "name": "tread-inside69", "bone": "tread35", "attachment": "tread-inside" },
+	{ "name": "tread-inside71", "bone": "tread36", "attachment": "tread-inside" },
+	{ "name": "tread-inside41", "bone": "tread21", "attachment": "tread-inside" },
+	{ "name": "tread-inside17", "bone": "tread9", "attachment": "tread-inside" },
+	{ "name": "tread-inside43", "bone": "tread22", "attachment": "tread-inside" },
+	{ "name": "tread-inside19", "bone": "tread10", "attachment": "tread-inside" },
+	{ "name": "tread-inside45", "bone": "tread23", "attachment": "tread-inside" },
+	{ "name": "tread-inside21", "bone": "tread11", "attachment": "tread-inside" },
+	{ "name": "tread-inside47", "bone": "tread24", "attachment": "tread-inside" },
+	{ "name": "tread-inside23", "bone": "tread12", "attachment": "tread-inside" },
+	{ "name": "tread-inside49", "bone": "tread25", "attachment": "tread-inside" },
+	{ "name": "tread-inside25", "bone": "tread13", "attachment": "tread-inside" },
+	{ "name": "tread-inside51", "bone": "tread26", "attachment": "tread-inside" },
+	{ "name": "tread-inside2", "bone": "tread", "attachment": "tread-inside" },
+	{ "name": "tread-inside54", "bone": "tread27", "attachment": "tread-inside" },
+	{ "name": "tread-inside28", "bone": "tread14", "attachment": "tread-inside" },
+	{ "name": "tread-inside4", "bone": "tread2", "attachment": "tread-inside" },
+	{ "name": "tread-inside56", "bone": "tread28", "attachment": "tread-inside" },
+	{ "name": "tread-inside30", "bone": "tread15", "attachment": "tread-inside" },
+	{ "name": "tread-inside6", "bone": "tread3", "attachment": "tread-inside" },
+	{ "name": "tread-inside58", "bone": "tread29", "attachment": "tread-inside" },
+	{ "name": "tread-inside32", "bone": "tread16", "attachment": "tread-inside" },
+	{ "name": "tread-inside8", "bone": "tread4", "attachment": "tread-inside" },
+	{ "name": "tread-inside60", "bone": "tread30", "attachment": "tread-inside" },
+	{ "name": "tread-inside34", "bone": "tread17", "attachment": "tread-inside" },
+	{ "name": "tread-inside10", "bone": "tread5", "attachment": "tread-inside" },
+	{ "name": "tread-inside62", "bone": "tread31", "attachment": "tread-inside" },
+	{ "name": "tread-inside36", "bone": "tread18", "attachment": "tread-inside" },
+	{ "name": "tread-inside12", "bone": "tread6", "attachment": "tread-inside" },
+	{ "name": "tread-inside64", "bone": "tread32", "attachment": "tread-inside" },
+	{ "name": "tread-inside38", "bone": "tread19", "attachment": "tread-inside" },
+	{ "name": "tread-inside14", "bone": "tread7", "attachment": "tread-inside" },
+	{ "name": "tread-inside66", "bone": "tread33", "attachment": "tread-inside" },
+	{ "name": "tread-inside40", "bone": "tread20", "attachment": "tread-inside" },
+	{ "name": "tread-inside16", "bone": "tread8", "attachment": "tread-inside" },
+	{ "name": "tread-inside68", "bone": "tread34", "attachment": "tread-inside" },
+	{ "name": "tread-inside70", "bone": "tread35", "attachment": "tread-inside" },
+	{ "name": "tread-inside72", "bone": "tread36", "attachment": "tread-inside" },
+	{ "name": "tread-inside42", "bone": "tread21", "attachment": "tread-inside" },
+	{ "name": "tread-inside18", "bone": "tread9", "attachment": "tread-inside" },
+	{ "name": "tread-inside44", "bone": "tread22", "attachment": "tread-inside" },
+	{ "name": "tread-inside20", "bone": "tread10", "attachment": "tread-inside" },
+	{ "name": "tread-inside46", "bone": "tread23", "attachment": "tread-inside" },
+	{ "name": "tread-inside22", "bone": "tread11", "attachment": "tread-inside" },
+	{ "name": "tread-inside48", "bone": "tread24", "attachment": "tread-inside" },
+	{ "name": "tread-inside24", "bone": "tread12", "attachment": "tread-inside" },
+	{ "name": "tread-inside50", "bone": "tread25", "attachment": "tread-inside" },
+	{ "name": "tread-inside26", "bone": "tread13", "attachment": "tread-inside" },
+	{ "name": "tread-inside52", "bone": "tread26", "attachment": "tread-inside" },
+	{ "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "wheel-big" },
+	{ "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "wheel-big" },
+	{ "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "wheel-mid" },
+	{ "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "wheel-mid" },
+	{ "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "wheel-mid" },
+	{ "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "wheel-mid" },
+	{ "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "wheel-mid" },
+	{ "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "wheel-mid" },
+	{ "name": "wheel-small", "bone": "wheel-small1", "attachment": "wheel-small" },
+	{ "name": "wheel-small2", "bone": "wheel-small2", "attachment": "wheel-small" },
+	{ "name": "wheel-small3", "bone": "wheel-small3", "attachment": "wheel-small" },
+	{ "name": "wheel-mid-overlay", "bone": "wheel-mid-root1", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-mid-overlay2", "bone": "wheel-mid-root2", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-mid-overlay3", "bone": "wheel-mid-root3", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-mid-overlay4", "bone": "wheel-mid-root4", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-mid-overlay5", "bone": "wheel-mid-root5", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-mid-overlay6", "bone": "wheel-mid-root6", "color": "ffffffec", "attachment": "wheel-mid-overlay", "blend": "multiply" },
+	{ "name": "wheel-big-overlay1", "bone": "wheel-big-root1", "color": "ffffffe9", "attachment": "wheel-big-overlay", "blend": "multiply" },
+	{ "name": "wheel-big-overlay2", "bone": "wheel-big-root2", "color": "ffffffe9", "attachment": "wheel-big-overlay", "blend": "multiply" },
+	{ "name": "treads-path", "bone": "tank-root", "attachment": "treads-path" },
+	{ "name": "tread", "bone": "tread", "attachment": "tread" },
+	{ "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread14", "bone": "tread14", "attachment": "tread" },
+	{ "name": "tread2", "bone": "tread2", "attachment": "tread" },
+	{ "name": "tread28", "bone": "tread28", "attachment": "tread" },
+	{ "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread16", "bone": "tread16", "attachment": "tread" },
+	{ "name": "tread4", "bone": "tread4", "attachment": "tread" },
+	{ "name": "tread30", "bone": "tread30", "attachment": "tread" },
+	{ "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread18", "bone": "tread18", "attachment": "tread" },
+	{ "name": "tread6", "bone": "tread6", "attachment": "tread" },
+	{ "name": "tread32", "bone": "tread32", "attachment": "tread" },
+	{ "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread20", "bone": "tread20", "attachment": "tread" },
+	{ "name": "tread8", "bone": "tread8", "attachment": "tread" },
+	{ "name": "tread34", "bone": "tread34", "attachment": "tread" },
+	{ "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread22", "bone": "tread22", "attachment": "tread" },
+	{ "name": "tread10", "bone": "tread10", "attachment": "tread" },
+	{ "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread24", "bone": "tread24", "attachment": "tread" },
+	{ "name": "tread12", "bone": "tread12", "attachment": "tread" },
+	{ "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "tread" },
+	{ "name": "tread26", "bone": "tread26", "attachment": "tread" },
+	{ "name": "machinegun", "bone": "machinegun", "attachment": "machinegun" },
+	{ "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "machinegun-mount" },
+	{ "name": "tank-top", "bone": "tank-body", "attachment": "tank-top" },
+	{ "name": "guntower", "bone": "guntower", "attachment": "guntower" },
+	{ "name": "cannon", "bone": "cannon", "attachment": "cannon" },
+	{ "name": "cannon-connector", "bone": "cannon-connector", "attachment": "cannon-connector" },
+	{ "name": "antenna", "bone": "antenna-root", "attachment": "antenna" },
+	{ "name": "smoke-puff1-bg", "bone": "smoke1", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg13", "bone": "smoke13", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg14", "bone": "smoke14", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg15", "bone": "smoke15", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg16", "bone": "smoke16", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg17", "bone": "smoke17", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg18", "bone": "smoke18", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg20", "bone": "smoke20", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg21", "bone": "smoke21", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg22", "bone": "smoke22", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg23", "bone": "smoke23", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg24", "bone": "smoke24", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg25", "bone": "smoke25", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg26", "bone": "smoke26", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg27", "bone": "smoke27", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg2", "bone": "smoke2", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg5", "bone": "smoke5", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg6", "bone": "smoke6", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg7", "bone": "smoke7", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg10", "bone": "smoke10", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg11", "bone": "smoke11", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg12", "bone": "smoke12", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg8", "bone": "smoke8", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg9", "bone": "smoke9", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg4", "bone": "smoke4", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-bg3", "bone": "smoke3", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg", "bone": "smoke1", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg13", "bone": "smoke13", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg14", "bone": "smoke14", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg15", "bone": "smoke15", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg16", "bone": "smoke16", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg17", "bone": "smoke17", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg18", "bone": "smoke18", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg20", "bone": "smoke20", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg21", "bone": "smoke21", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg22", "bone": "smoke22", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg23", "bone": "smoke23", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg24", "bone": "smoke24", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg25", "bone": "smoke25", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg26", "bone": "smoke26", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg27", "bone": "smoke27", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg2", "bone": "smoke2", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg5", "bone": "smoke5", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg6", "bone": "smoke6", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg7", "bone": "smoke7", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg10", "bone": "smoke10", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg11", "bone": "smoke11", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg12", "bone": "smoke12", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg8", "bone": "smoke8", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg9", "bone": "smoke9", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg4", "bone": "smoke4", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-puff1-fg3", "bone": "smoke3", "color": "ecececff", "dark": "000000" },
+	{ "name": "smoke-glow", "bone": "smoke-glow", "blend": "additive" },
+	{ "name": "clipping", "bone": "tank-body", "attachment": "clipping" },
+	{ "name": "tank-glow", "bone": "tank-glow", "color": "fcdc6da7", "blend": "additive" }
+],
+"ik": [
+	{
+		"name": "cannon-ik",
+		"bones": [ "cannon" ],
+		"target": "cannon-target"
+	},
+	{
+		"name": "machinegun-ik",
+		"order": 1,
+		"bones": [ "machinegun" ],
+		"target": "machinegun-target",
+		"mix": 0
+	}
+],
+"transform": [
+	{
+		"name": "wheel-big-transform",
+		"order": 8,
+		"bones": [ "wheel-big2" ],
+		"target": "wheel-big1",
+		"rotation": 65.6,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	},
+	{
+		"name": "wheel-mid1-transform",
+		"order": 3,
+		"bones": [ "wheel-mid2", "wheel-mid4" ],
+		"target": "wheel-mid1",
+		"rotation": 93,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	},
+	{
+		"name": "wheel-mid2-transform",
+		"order": 4,
+		"bones": [ "wheel-mid3", "wheel-mid5" ],
+		"target": "wheel-mid1",
+		"rotation": -89,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	},
+	{
+		"name": "wheel-mid3-transform",
+		"order": 5,
+		"bones": [ "wheel-mid6" ],
+		"target": "wheel-mid1",
+		"rotation": -152.6,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	},
+	{
+		"name": "wheel-small1-transform",
+		"order": 6,
+		"bones": [ "wheel-small2" ],
+		"target": "wheel-small1",
+		"rotation": 87,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	},
+	{
+		"name": "wheel-small2-transform",
+		"order": 7,
+		"bones": [ "wheel-small3" ],
+		"target": "wheel-small1",
+		"rotation": 54.9,
+		"mixX": 0,
+		"mixScaleX": 0,
+		"mixShearY": 0
+	}
+],
+"path": [
+	{
+		"name": "treads-path",
+		"order": 2,
+		"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-path",
+		"rotateMode": "chain"
+	}
+],
+"skins": [
+	{
+		"name": "default",
+		"attachments": {
+			"antenna": {
+				"antenna": {
+					"type": "mesh",
+					"uvs": [ 0.64286, 0.07876, 0.65354, 0.1535, 0.66325, 0.22138, 0.67367, 0.29433, 0.68383, 0.36543, 0.6936, 0.43374, 0.70311, 0.5003, 0.71311, 0.57031, 0.72327, 0.64139, 0.73406, 0.71689, 0.74441, 0.7893, 0.75614, 0.87141, 0.76905, 0.94311, 1, 0.94311, 1, 1, 0, 1, 0, 0.94311, 0.20106, 0.94311, 0.20106, 0.87094, 0.21461, 0.78847, 0.22651, 0.71607, 0.23886, 0.64099, 0.25036, 0.57105, 0.26206, 0.49983, 0.27306, 0.43291, 0.2843, 0.36454, 0.29593, 0.29382, 0.308, 0.22038, 0.319, 0.15345, 0.33142, 0.07796, 0.34423, 0, 0.63161, 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.38, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 2, 10, 42.73, -3.38, 0.66667, 11, 0.73, -3.38, 0.33333, 2, 9, 64.17, -3.59, 0.33333, 10, 22.17, -3.59, 0.66667, 2, 9, 42.06, -3.82, 0.66667, 10, 0.06, -3.82, 0.33333, 2, 8, 62.52, -4.04, 0.33333, 9, 20.52, -4.04, 0.66667, 2, 8, 41.82, -4.26, 0.66667, 9, -0.18, -4.26, 0.33333, 2, 7, 63.65, -4.47, 0.33333, 8, 21.65, -4.47, 0.66667, 2, 7, 42.44, -4.69, 0.66667, 8, 0.44, -4.69, 0.33333, 2, 6, 62.9, -4.91, 0.33333, 7, 20.9, -4.91, 0.66667, 2, 6, 40.03, -5.15, 0.66667, 7, -1.97, -5.15, 0.33333, 2, 5, 5.38, 58.09, 0.4, 6, 18.09, -5.38, 0.6, 1, 5, 5.64, 33.21, 1, 1, 5, 5.92, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 11, -5.76, 1, 1, 5, -11, -5.76, 1, 1, 5, -11, 11.48, 1, 1, 5, -6.58, 11.48, 1, 1, 5, -6.58, 33.35, 1, 2, 5, -6.28, 58.34, 0.4, 6, 18.34, 6.28, 0.6, 2, 6, 40.27, 6.02, 0.66667, 7, -1.73, 6.02, 0.33333, 2, 6, 63.03, 5.75, 0.33333, 7, 21.03, 5.75, 0.66667, 2, 7, 42.22, 5.49, 0.66667, 8, 0.22, 5.49, 0.33333, 2, 7, 63.8, 5.23, 0.33333, 8, 21.8, 5.23, 0.66667, 2, 8, 42.07, 4.99, 0.66667, 9, 0.07, 4.99, 0.33333, 2, 8, 62.79, 4.75, 0.33333, 9, 20.79, 4.75, 0.66667, 2, 9, 42.22, 4.49, 0.66667, 10, 0.22, 4.49, 0.33333, 2, 9, 64.47, 4.22, 0.33333, 10, 22.47, 4.22, 0.66667, 2, 10, 42.75, 3.98, 0.66667, 11, 0.75, 3.98, 0.33333, 2, 10, 65.62, 3.71, 0.3125, 11, 23.62, 3.71, 0.6875, 1, 11, 47.24, 3.43, 1, 1, 11, 47.24, -2.9, 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": {
+				"tank-bottom": { "x": -16.67, "y": 9.89, "width": 1285, "height": 276 }
+			},
+			"cannon": {
+				"cannon": { "x": 481.95, "y": -0.03, "rotation": 180, "width": 931, "height": 58 }
+			},
+			"cannon-connector": {
+				"cannon-connector": {
+					"type": "mesh",
+					"uvs": [ 1, 0.03237, 1, 0.10603, 0.90988, 0.32859, 0.81975, 0.55116, 0.72963, 0.77373, 0.6395, 0.9963, 0.42157, 0.9963, 0.20364, 0.9963, 0, 0.85434, 0, 0.69902, 0.02268, 0.52884, 0, 0.31444, 0.21602, 0.12998, 0.43368, 0, 0.63547, 0.0037, 0.48408, 0.77059, 0.31496, 0.52497, 0.64133, 0.19648, 0.21516, 0.76766, 0.58346, 0.56471, 0.68444, 0.40146, 0.46758, 0.36649, 0.28935, 0.34604 ],
+					"triangles": [ 7, 18, 6, 6, 18, 15, 7, 8, 18, 8, 9, 18, 18, 16, 15, 15, 16, 19, 9, 10, 18, 18, 10, 16, 16, 21, 19, 19, 21, 20, 10, 22, 16, 10, 11, 22, 16, 22, 21, 21, 17, 20, 21, 12, 13, 17, 13, 14, 17, 21, 13, 11, 12, 22, 21, 22, 12, 6, 15, 5, 5, 15, 4, 15, 19, 4, 4, 19, 3, 19, 20, 3, 3, 20, 2, 20, 17, 2, 2, 17, 1, 17, 14, 1, 14, 0, 1 ],
+					"vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.14, 1, 1, 12, 25.82, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.05, 1, 2, 12, -28.87, -61.05, 0.33333, 14, 28.87, 61.03, 0.66667, 1, 14, 53.28, 61.02, 1, 1, 14, 76.09, 41.84, 1, 1, 14, 71.17, 21.63, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.38, -29.12, 1, 1, 14, 50.67, -56.14, 1, 2, 12, -28.43, 74.38, 0.41, 14, 28.43, -74.4, 0.59, 2, 12, -4.92, 72.95, 0.52, 14, 4.92, -72.95, 0.48, 2, 12, -21.87, -30.58, 0.49, 14, 21.87, 30.57, 0.51, 1, 14, 40.81, -2.6, 1, 2, 12, -4.26, 46.93, 0.49, 14, 4.26, -46.93, 0.51, 1, 14, 51.99, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.78, 0.51, 2, 12, 0.57, 19.25, 0.49, 14, -0.57, -19.25, 0.51, 1, 14, 23.72, -23.99, 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
+				}
+			},
+			"clipping": {
+				"clipping": {
+					"type": "clipping",
+					"end": "tank-glow",
+					"vertexCount": 32,
+					"vertices": [ 1, 3, 165.84, 455.67, 1, 1, 3, 114.21, 493.01, 1, 1, 3, -38.53, 492.23, 1, 1, 3, -193.4, 464.18, 1, 2, 3, -280.85, 415.48, 0.752, 14, 24.09, -73.93, 0.248, 1, 14, 70.34, -27.32, 1, 1, 14, 412.56, -22.02, 1, 1, 14, 412.82, -29.21, 1, 1, 14, 539.26, -29.34, 1, 1, 14, 539.52, -17.09, 1, 1, 14, 894.02, -16.8, 1, 1, 14, 902.99, -28.89, 1, 1, 14, 942.06, -28.58, 1, 1, 14, 948.14, -16.64, 1, 1, 14, 947.9, 14.29, 1, 1, 14, 539.3, 14.55, 1, 1, 14, 539, 29.22, 1, 1, 14, 412.51, 29.88, 1, 1, 14, 412.51, 21.73, 1, 1, 14, 74.24, 27.28, 1, 1, 3, -296.64, 281.2, 1, 1, 3, -316.06, 225.71, 1, 1, 3, -521.69, 190.74, 1, 1, 3, -610.03, 141.02, 1, 1, 3, -671.84, 87.13, 1, 1, 3, -652.23, -11.24, 1, 1, 3, -618.53, -71.36, 1, 1, 3, -478.77, -114.21, 1, 1, 3, -274.11, -116.26, 1, 1, 3, 1.38, -45.75, 1, 1, 3, 189.67, 148.78, 1, 1, 3, 215.75, 276.59, 1 ],
+					"color": "ce3a3aff"
+				}
+			},
+			"ground": {
+				"ground": { "x": 837.96, "y": -172, "width": 1024, "height": 353 }
+			},
+			"ground2": {
+				"ground": { "x": -179.89, "y": -172, "width": 1024, "height": 353 }
+			},
+			"ground3": {
+				"ground": { "x": -1213.48, "y": -172, "scaleX": 1.035, "width": 1024, "height": 353 }
+			},
+			"ground4": {
+				"ground": { "x": -2268.51, "y": -172, "scaleX": 1.04, "width": 1024, "height": 353 }
+			},
+			"ground5": {
+				"ground": { "x": -3306.54, "y": -172, "width": 1024, "height": 353 }
+			},
+			"ground6": {
+				"ground": { "x": -4322.71, "y": -172, "width": 1024, "height": 353 }
+			},
+			"ground7": {
+				"ground": { "x": -5340.65, "y": -172, "width": 1024, "height": 353 }
+			},
+			"guntower": {
+				"guntower": { "x": 77.22, "y": 122.59, "width": 730, "height": 289 }
+			},
+			"machinegun": {
+				"machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 }
+			},
+			"machinegun-mount": {
+				"machinegun-mount": { "x": 47.42, "y": -1.54, "rotation": -90, "width": 72, "height": 96 }
+			},
+			"rock": {
+				"rock": { "x": 25.24, "y": 27.35, "width": 580, "height": 127 }
+			},
+			"smoke-glow": {
+				"smoke-glow": {
+					"type": "mesh",
+					"uvs": [ 1, 0.24906, 1, 0.51991, 1, 0.73165, 0.70776, 1, 0.49012, 1, 0.24373, 1, 0, 0.71158, 0, 0.50308, 0, 0.26235, 0.28107, 0, 0.47435, 0, 0.73345, 0, 0.48858, 0.51759 ],
+					"triangles": [ 12, 7, 8, 12, 10, 11, 12, 11, 0, 9, 10, 12, 12, 8, 9, 12, 0, 1, 6, 7, 12, 12, 1, 2, 5, 6, 12, 3, 4, 12, 5, 12, 4, 2, 3, 12 ],
+					"vertices": [ 49.99, 25.1, 50, -1.98, 50.01, -23.15, 20.79, -50, -0.98, -50, -25.62, -50.01, -50, -21.17, -50, -0.32, -50.01, 23.75, -21.9, 50, -2.58, 50, 23.33, 50.01, -1.14, -1.76 ],
+					"hull": 12,
+					"edges": [ 2, 24, 24, 14, 20, 24, 24, 8, 2, 0, 20, 22, 0, 22, 18, 20, 14, 16, 18, 16, 12, 14, 8, 10, 12, 10, 6, 8, 2, 4, 6, 4 ],
+					"width": 100,
+					"height": 100
+				}
+			},
+			"smoke-puff1-bg": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg2": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg3": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg4": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg5": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg6": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg7": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg8": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg9": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg10": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg11": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg12": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg13": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg14": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg15": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg16": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg17": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg18": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg20": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg21": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg22": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg23": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg24": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg25": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg26": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-bg27": {
+				"smoke-puff01-bg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				}
+			},
+			"smoke-puff1-fg": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg2": {
+				"smoke-puff01-fg": {
+					"x": -1.01,
+					"y": -0.07,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.82,
+					"y": -0.39,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.82,
+					"y": -0.39,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.82,
+					"y": -0.39,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg3": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.02,
+					"y": -0.25,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1145,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.03,
+					"y": -0.43,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg4": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.63,
+					"y": -0.09,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.63,
+					"y": -0.09,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.63,
+					"y": -0.09,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg5": {
+				"smoke-puff01-fg": {
+					"x": -1.21,
+					"y": -0.08,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.89,
+					"y": -0.04,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.89,
+					"y": -0.04,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.89,
+					"y": -0.04,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg6": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.48,
+					"y": -0.07,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.48,
+					"y": -0.07,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.48,
+					"y": -0.07,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg7": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -0.7,
+					"y": -0.36,
+					"scaleX": 0.1216,
+					"scaleY": 0.1214,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -0.56,
+					"y": -0.15,
+					"scaleX": 0.1224,
+					"scaleY": 0.1224,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -0.56,
+					"y": -0.15,
+					"scaleX": 0.1224,
+					"scaleY": 0.1224,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg8": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -0.65,
+					"y": 0.01,
+					"scaleX": 0.1226,
+					"scaleY": 0.1226,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -0.75,
+					"y": -0.15,
+					"scaleX": 0.1211,
+					"scaleY": 0.1211,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -0.75,
+					"y": -0.15,
+					"scaleX": 0.1211,
+					"scaleY": 0.1211,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg9": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.99,
+					"y": -0.09,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.99,
+					"y": -0.09,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -0.95,
+					"y": -0.48,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg10": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.27,
+					"y": -0.37,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.27,
+					"y": -0.37,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.27,
+					"y": -0.37,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg11": {
+				"smoke-puff04-fg": {
+					"x": -1.27,
+					"y": -0.37,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg12": {
+				"smoke-puff04-fg": {
+					"x": -1.27,
+					"y": -0.37,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg13": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg14": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg15": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg16": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg17": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg18": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg20": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg21": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg22": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg23": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg24": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg25": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg26": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"smoke-puff1-fg27": {
+				"smoke-puff01-fg": {
+					"x": -0.5,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 175,
+					"height": 118
+				},
+				"smoke-puff02-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff03-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 184,
+					"height": 123
+				},
+				"smoke-puff04-fg": {
+					"x": -1.38,
+					"y": -0.12,
+					"scaleX": 0.1106,
+					"scaleY": 0.1106,
+					"rotation": 88.58,
+					"width": 155,
+					"height": 96
+				}
+			},
+			"tank-body-shadow": {
+				"tank-bottom-shadow": { "x": -11.44, "y": -42.89, "width": 1291, "height": 341 }
+			},
+			"tank-glow": {
+				"smoke-glow": {
+					"type": "mesh",
+					"uvs": [ 1, 1, 0, 1, 1, 0 ],
+					"triangles": [ 1, 2, 0 ],
+					"vertices": [ 469.64, -738.08, -1660.32, -738.08, 469.64, 1391.88 ],
+					"hull": 3,
+					"edges": [ 0, 2, 0, 4, 2, 4 ],
+					"width": 100,
+					"height": 100
+				}
+			},
+			"tank-top": {
+				"tank-top": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 }
+			},
+			"tread": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread-inside1": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside2": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside3": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside4": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside5": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside6": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside7": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside8": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside9": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside10": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside11": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside12": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside13": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside14": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside15": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside16": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside17": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside18": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside19": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside20": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside21": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside22": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside23": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside24": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside25": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside26": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside27": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside28": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside29": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside30": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside31": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside32": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside33": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside34": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside35": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside36": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside37": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside38": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside39": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside40": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside41": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside42": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside43": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside44": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside45": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside46": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside47": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside48": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside49": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside50": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside51": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside52": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside53": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside54": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside55": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside56": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside57": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside58": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside59": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside60": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside61": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside62": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside63": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside64": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside65": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside66": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside67": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside68": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside69": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside70": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside71": {
+				"tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread-inside72": {
+				"tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 }
+			},
+			"tread2": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread3": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread4": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread5": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread6": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread7": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread8": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread9": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread10": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread11": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread12": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread13": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread14": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread15": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread16": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread17": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread18": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread19": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread20": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread21": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread22": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread23": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread24": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread25": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread26": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread27": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread28": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread29": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread30": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread31": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread32": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread33": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread34": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread35": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"tread36": {
+				"tread": { "x": 45.47, "y": -8.28, "rotation": -180, "width": 96, "height": 30 }
+			},
+			"treads-path": {
+				"treads-path": {
+					"type": "path",
+					"closed": true,
+					"lengths": [ 185.21, 354.53, 478.3, 608.52, 786, 1058.49, 1138.97, 1223.96, 1303.87, 1388.23, 1471.11, 1551.64, 1633.55, 1713.27, 1799.89, 1882.28, 2164.2, 2326.85, 2444.07, 2584.91, 2754.15, 2940.62 ],
+					"vertexCount": 66,
+					"vertices": [ 1, 110, 11.23, 41.87, 1, 1, 110, 0.79, 41.95, 1, 1, 110, -34.72, 42.24, 1, 1, 56, -104.22, 0.41, 1, 1, 56, 0.07, 0.55, 1, 1, 56, 68.8, 0.65, 1, 1, 109, 20.5, 43.47, 1, 1, 109, 1.14, 40.82, 1, 1, 109, -27.38, 36.85, 1, 1, 93, 147.07, 105.01, 1, 1, 93, 96.21, 96.63, 1, 1, 93, 43.87, 87.72, 1, 1, 93, 16.18, 103.35, 1, 1, 93, -33.67, 94.21, 1, 1, 93, -99.36, 81.25, 1, 1, 93, -122.05, -1.7, 1, 1, 93, -83.58, -47.93, 1, 1, 93, -33.53, -109.37, 1, 1, 97, -83.57, -66.1, 1, 1, 97, -2.17, -67.9, 1, 2, 97, 56.68, -41.49, 0.68, 51, -24.31, -41.49, 0.32, 1, 51, -26.59, 16.7, 1, 1, 51, -2.69, 16.7, 1, 1, 51, 13.52, 16.7, 1, 2, 98, -52.42, -46.51, 0.744, 51, 30.21, -46.52, 0.256, 1, 98, -0.32, -68.92, 1, 2, 98, 52.09, -44.73, 0.712, 52, -28.91, -44.73, 0.288, 1, 52, -22.81, 16.24, 1, 1, 52, -1.42, 16.24, 1, 1, 52, 20.48, 16.24, 1, 2, 99, -47.21, -47.46, 0.744, 52, 36.01, -47.46, 0.256, 1, 99, -0.29, -69.66, 1, 2, 99, 45.24, -47.26, 0.736, 53, -37.49, -47.26, 0.264, 1, 53, -23.76, 15.28, 1, 1, 53, -0.14, 15.28, 1, 1, 53, 24.45, 15.28, 1, 2, 100, -47.37, -48.7, 0.744, 53, 33.53, -48.7, 0.256, 1, 100, -0.5, -70.4, 1, 2, 100, 49.09, -48.34, 0.744, 54, -33.58, -48.34, 0.256, 1, 54, -20.89, 15.84, 1, 1, 54, -1.26, 15.84, 1, 1, 54, 15.78, 15.84, 1, 2, 101, -52.5, -48.21, 0.76, 54, 28.45, -48.22, 0.24, 1, 101, -2.5, -68.92, 1, 2, 101, 55.72, -47.82, 0.752, 55, -28.88, -47.83, 0.248, 1, 55, -21.64, 16.7, 1, 1, 55, -0.48, 16.7, 1, 1, 55, 20.74, 16.7, 1, 2, 102, -53.65, -48.9, 0.76, 55, 25.97, -48.9, 0.24, 1, 102, 2.28, -69.66, 1, 1, 102, 44.95, -69.74, 1, 1, 94, 76.03, -85.61, 1, 1, 94, 93.58, -42.24, 1, 1, 94, 118.67, 19.75, 1, 1, 94, 78.59, 76.62, 1, 1, 94, 37.27, 95.07, 1, 1, 94, 31.45, 97.67, 1, 1, 94, -15.16, 87.48, 1, 1, 94, -79.8, 92.52, 1, 1, 94, -119.06, 95.58, 1, 1, 111, 47.07, 42.29, 1, 1, 111, 0.25, 42.75, 1, 1, 111, -29.64, 43.29, 1, 1, 57, -86.65, 1.35, 1, 1, 57, 0.49, 0.26, 1, 1, 57, 92.42, -0.9, 1 ],
+					"color": "ff8819ff"
+				}
+			},
+			"wheel-big": {
+				"wheel-big": { "width": 191, "height": 191 }
+			},
+			"wheel-big-overlay1": {
+				"wheel-big-overlay": { "width": 186, "height": 186 }
+			},
+			"wheel-big-overlay2": {
+				"wheel-big-overlay": { "width": 186, "height": 186 }
+			},
+			"wheel-big2": {
+				"wheel-big": { "width": 191, "height": 191 }
+			},
+			"wheel-mid": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay2": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay3": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay4": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay5": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid-overlay6": {
+				"wheel-mid-overlay": { "width": 136, "height": 136 }
+			},
+			"wheel-mid2": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-mid3": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-mid4": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-mid5": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-mid6": {
+				"wheel-mid": { "width": 136, "height": 136 }
+			},
+			"wheel-small": {
+				"wheel-small": { "width": 71, "height": 71 }
+			},
+			"wheel-small2": {
+				"wheel-small": { "width": 71, "height": 71 }
+			},
+			"wheel-small3": {
+				"wheel-small": { "width": 71, "height": 71 }
+			}
+		}
+	}
+],
+"animations": {
+	"drive": {
+		"bones": {
+			"tank-root": {
+				"rotate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "value": 1.99 },
+					{ "time": 2.5, "value": -15.63 },
+					{
+						"time": 2.6667,
+						"value": -10.37,
+						"curve": [ 2.718, -10.37, 2.78, -8.34 ]
+					},
+					{
+						"time": 2.8333,
+						"value": -6.13,
+						"curve": [ 2.909, -2.8, 2.974, 0.8 ]
+					},
+					{ "time": 3, "value": 1.84 },
+					{ "time": 3.0667, "value": 5.32 },
+					{ "time": 3.1667, "value": 10.99 },
+					{ "time": 3.2333, "value": 9.73 },
+					{
+						"time": 3.4333,
+						"value": -4.52,
+						"curve": [ 3.474, -3.99, 3.608, 0.01 ]
+					},
+					{ "time": 3.6667, "value": 0.01 }
+				],
+				"translate": [
+					{
+						"curve": [ 1.019, 0, 1.608, -582.83, 1.019, 0, 1.608, 0 ]
+					},
+					{ "time": 2, "x": -1209.75 },
+					{ "time": 2.3333, "x": -1652.84, "y": 26.05 },
+					{ "time": 2.5, "x": -1877.69, "y": 71.5 },
+					{ "time": 2.6667, "x": -2053.37, "y": 100.44 },
+					{ "time": 2.8333, "x": -2183.86, "y": 97.42 },
+					{ "time": 3, "x": -2312.32, "y": 74.12 },
+					{ "time": 3.0667, "x": -2340.68, "y": 45.94 },
+					{ "time": 3.1333, "x": -2403.04, "y": 17.04 },
+					{ "time": 3.1667, "x": -2439.84, "y": 5.45 },
+					{ "time": 3.2333, "x": -2523.34, "y": -3.31 },
+					{ "time": 3.4333, "x": -2728.27, "y": -12.73 },
+					{
+						"time": 3.5,
+						"x": -2795.65,
+						"y": -6.14,
+						"curve": [ 3.538, -2829.89, 3.583, -2878.59, 3.538, -4.93, 3.583, -3.21 ]
+					},
+					{
+						"time": 3.6333,
+						"x": -2938.53,
+						"y": -1.09,
+						"curve": [ 3.89, -3218.84, 4.404, -3972.02, 3.89, -0.79, 4.404, 0 ]
+					},
+					{ "time": 4.8333, "x": -3972.02 },
+					{ "time": 5, "x": -3991.31 },
+					{ "time": 5.3667, "x": -3973.94 }
+				]
+			},
+			"tread-collider1": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "y": 9.99 },
+					{ "time": 2.1667, "y": 37.69 },
+					{ "time": 2.3333, "y": 53.45 },
+					{ "time": 2.5, "y": 30.97 },
+					{ "time": 2.6667, "y": -2.89 },
+					{ "time": 2.8333, "y": -0.71 },
+					{ "time": 3.0667, "y": -13.64 },
+					{ "time": 3.1667, "y": 59.3 },
+					{ "time": 3.2333, "y": 48.2 },
+					{ "time": 3.4333, "y": -11.27 },
+					{ "time": 3.6333, "y": 4.15 }
+				]
+			},
+			"tread-collider2": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "y": -2.83 },
+					{ "time": 2.1667, "y": -17.44 },
+					{ "time": 2.3333, "y": 46.07 },
+					{ "time": 2.5, "y": 19.45 },
+					{ "time": 2.6667, "y": 13.46 },
+					{ "time": 2.8333, "y": -1.92, "curve": "stepped" },
+					{ "time": 2.9667, "y": -1.92 },
+					{ "time": 3, "y": -13.17 },
+					{ "time": 3.0667, "y": -23.25 },
+					{ "time": 3.1667, "y": 28.13 },
+					{ "time": 3.2333, "y": 25.63 },
+					{ "time": 3.4333, "y": -1.52 },
+					{ "time": 3.6333, "y": 1.15 }
+				]
+			},
+			"tread-collider3": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "y": -7.76 },
+					{ "time": 2.1667, "y": -16.61 },
+					{ "time": 2.5, "y": 29.05 },
+					{ "time": 2.6667, "y": 30.12 },
+					{ "time": 2.8333, "y": 5.3 },
+					{ "time": 3, "y": -0.38 },
+					{ "time": 3.1667, "y": 2.6 },
+					{ "time": 3.4333, "y": 15.41 },
+					{ "time": 3.6333, "y": 1.44 }
+				]
+			},
+			"tread-collider4": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": -6.72 },
+					{ "time": 2.3333, "y": -0.92 },
+					{ "time": 2.5, "y": 18.37 },
+					{ "time": 2.6667, "y": 38.77 },
+					{ "time": 2.8333, "y": 30.6 },
+					{ "time": 3.1667, "y": 12.61 },
+					{ "time": 3.2333, "y": -16 },
+					{ "time": 3.4333, "y": 25.62 },
+					{ "time": 3.6333, "y": -0.68 }
+				]
+			},
+			"tread-collider5": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": 3.35 },
+					{ "time": 2.3333, "y": 22.17 },
+					{ "time": 2.6667, "y": 13.35 },
+					{ "time": 2.8333, "y": 39 },
+					{ "time": 3, "y": 39.88 },
+					{ "time": 3.1667, "y": 26.57 },
+					{ "time": 3.2333, "y": -10.15 },
+					{ "time": 3.4333, "y": 35.98 },
+					{ "time": 3.6333, "y": -1.36 }
+				]
+			},
+			"wheel-mid-root6": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": 5.61 },
+					{ "time": 2.3333, "y": 27.21 },
+					{ "time": 2.5, "y": 30.28 },
+					{ "time": 2.6667, "y": -2.81 },
+					{ "time": 2.8333, "y": 19.59 },
+					{ "time": 3, "y": 29.11 },
+					{ "time": 3.1667, "y": 32.55 },
+					{ "time": 3.2333, "y": 3.55 },
+					{ "time": 3.4333, "y": 40.54 },
+					{ "time": 3.6333 }
+				]
+			},
+			"wheel-mid-root5": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": -7.46 },
+					{ "time": 2.3333, "y": 9.53 },
+					{ "time": 2.6667, "y": 36.78 },
+					{ "time": 2.8333, "y": 46.11 },
+					{ "time": 3.1667, "y": 7.55 },
+					{ "time": 3.2333, "y": -16.28 },
+					{ "time": 3.4333, "y": 26.21 },
+					{ "time": 3.6333 }
+				]
+			},
+			"wheel-mid-root4": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": -13.98 },
+					{ "time": 2.3333, "y": -8.26 },
+					{ "time": 2.5, "y": 24.27 },
+					{ "time": 2.6667, "y": 34.42 },
+					{ "time": 2.8333, "y": 8.88 },
+					{ "time": 3.1667, "y": 10.32 },
+					{ "time": 3.2333, "y": -7.63 },
+					{ "time": 3.4333, "y": 19.69 },
+					{ "time": 3.6333 }
+				]
+			},
+			"wheel-mid-root3": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1667, "y": -21.14 },
+					{ "time": 2.3333, "y": 22.83 },
+					{ "time": 2.5, "y": 23.34 },
+					{ "time": 2.6667, "y": 18.07 },
+					{ "time": 2.8333, "y": 1.2 },
+					{ "time": 3.0667, "y": -13.36 },
+					{ "time": 3.1667, "y": 15.48 },
+					{ "time": 3.2333, "y": 13.34 },
+					{ "time": 3.4333, "y": 6.4 },
+					{ "time": 3.6333 }
+				]
+			},
+			"wheel-mid-root2": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "y": -4.39 },
+					{ "time": 2.1667, "y": 3.13 },
+					{ "time": 2.3333, "y": 53.56 },
+					{ "time": 2.5, "y": 16.65 },
+					{ "time": 2.6667, "y": 8.39 },
+					{ "time": 3.0667, "y": -19.16 },
+					{ "time": 3.1667, "y": 43.25 },
+					{ "time": 3.2333, "y": 39.04 },
+					{ "time": 3.4333, "y": -8.61 },
+					{ "time": 3.6333 }
+				]
+			},
+			"wheel-mid-root1": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0333, "y": 22.64 },
+					{ "time": 2.0667, "y": 53.65 },
+					{ "time": 2.1667, "y": 71.18 },
+					{ "time": 2.5, "y": 46.83 },
+					{ "time": 2.6667, "y": 8.38 },
+					{ "time": 3.0667, "y": -10.03 },
+					{ "time": 3.1667, "y": 72.71 },
+					{ "time": 3.2333, "y": 64.74 },
+					{ "time": 3.4333, "y": -17.65 },
+					{ "time": 3.6333 }
+				]
+			},
+			"tank-body": {
+				"rotate": [
+					{
+						"curve": [ 0.208, 0, 0.625, -4.39 ]
+					},
+					{ "time": 0.8333, "value": -4.39 },
+					{ "time": 2 },
+					{ "time": 2.1667, "value": -1.34 },
+					{ "time": 2.3333, "value": -6.23 },
+					{ "time": 2.5, "value": -5.45 },
+					{ "time": 2.9667, "value": -5.07 },
+					{ "time": 3.0667, "value": -2.39 },
+					{ "time": 3.1667, "value": -0.98 },
+					{ "time": 3.2333, "value": -1.1 },
+					{
+						"time": 3.4,
+						"value": 0.43,
+						"curve": [ 3.433, 0.43, 3.483, -1.56 ]
+					},
+					{
+						"time": 3.5333,
+						"value": -3.55,
+						"curve": [ 3.675, -3.47, 3.754, 1.49 ]
+					},
+					{ "time": 3.8333, "value": 1.93 },
+					{ "time": 4, "value": 0.48 },
+					{
+						"time": 4.3333,
+						"curve": [ 4.476, 0.59, 4.833, 3.8 ]
+					},
+					{
+						"time": 5,
+						"value": 3.8,
+						"curve": [ 5.286, 3.8, 5.35, -2.17 ]
+					},
+					{ "time": 5.4667, "value": -2.17 },
+					{ "time": 5.6, "value": -0.61 }
+				]
+			},
+			"wheel-big-root1": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.0667, "y": 20.07 },
+					{ "time": 2.3333, "y": 67.24 },
+					{ "time": 2.6667, "y": 21.04 },
+					{ "time": 3, "y": 10.28 },
+					{ "time": 3.1, "y": 11.28 },
+					{ "time": 3.1667, "y": 29.43 },
+					{ "time": 3.2333, "y": 35.31 },
+					{ "time": 3.4333, "y": 18.38 },
+					{ "time": 3.5 }
+				]
+			},
+			"tank-treads": {
+				"rotate": [
+					{},
+					{ "time": 0.8333, "value": -2.4 },
+					{ "time": 2 },
+					{ "time": 2.0667, "value": 1.72 },
+					{ "time": 2.4333, "value": -0.37 },
+					{ "time": 2.8 },
+					{ "time": 3, "value": -1.41 },
+					{ "time": 3.1667, "value": 0.54 },
+					{
+						"time": 3.2667,
+						"value": 2.22,
+						"curve": [ 3.348, 2.22, 3.392, -1.31 ]
+					},
+					{ "time": 3.4333, "value": -1.31 },
+					{ "time": 3.7333, "value": -1.14 },
+					{
+						"time": 4.3333,
+						"curve": [ 4.476, 0.35, 4.833, 2.24 ]
+					},
+					{
+						"time": 5,
+						"value": 2.24,
+						"curve": [ 5.286, 2.24, 5.35, 0 ]
+					},
+					{ "time": 5.4667 }
+				]
+			},
+			"cannon-target": {
+				"translate": [
+					{},
+					{ "time": 0.8333, "y": 121.95 },
+					{ "time": 2, "y": 45.73 }
+				]
+			},
+			"wheel-big-root2": {
+				"translate": [
+					{ "time": 3.4333, "y": 13.01 }
+				]
+			},
+			"wheel-big1": {
+				"rotate": [
+					{
+						"curve": [ 0.51, 0, 0.804, 57.81 ]
+					},
+					{ "time": 1, "value": 120 },
+					{ "time": 1.2667, "value": 240 },
+					{ "time": 1.5333, "value": 360 },
+					{ "time": 1.7667, "value": 480 },
+					{ "time": 2.0333, "value": 600 },
+					{ "time": 2.2, "value": 720 },
+					{ "time": 2.4, "value": 840 },
+					{ "time": 2.5667, "value": 960 },
+					{ "time": 2.7333, "value": 1080 },
+					{ "time": 2.9333, "value": 1200 },
+					{ "time": 3.1333, "value": 1320 },
+					{ "time": 3.3333, "value": 1440 },
+					{ "time": 3.5, "value": 1560 },
+					{ "time": 3.6667, "value": 1680 },
+					{ "time": 3.8667, "value": 1800 },
+					{ "time": 4.0667, "value": 1920 },
+					{ "time": 4.2667, "value": 2040 },
+					{
+						"time": 4.5,
+						"value": 2160,
+						"curve": [ 4.563, 2194.34, 4.695, 2225.3 ]
+					},
+					{ "time": 4.8333, "value": 2247.67 }
+				]
+			},
+			"wheel-mid1": {
+				"rotate": [
+					{
+						"curve": [ 0.459, 0, 0.724, 57.81 ]
+					},
+					{ "time": 0.9, "value": 120 },
+					{ "time": 1.1667, "value": 240 },
+					{ "time": 1.4333, "value": 360 },
+					{ "time": 1.6333, "value": 480 },
+					{ "time": 1.8333, "value": 600 },
+					{ "time": 2, "value": 720 },
+					{ "time": 2.1333, "value": 840 },
+					{ "time": 2.2667, "value": 960 },
+					{ "time": 2.4, "value": 1080 },
+					{ "time": 2.5333, "value": 1200 },
+					{ "time": 2.6667, "value": 1320 },
+					{ "time": 2.8333, "value": 1440 },
+					{ "time": 2.9667, "value": 1560 },
+					{ "time": 3.1, "value": 1680 },
+					{ "time": 3.2333, "value": 1800 },
+					{ "time": 3.3667, "value": 1920 },
+					{ "time": 3.5, "value": 2040 },
+					{ "time": 3.6333, "value": 2160 },
+					{ "time": 3.7667, "value": 2280 },
+					{ "time": 3.9, "value": 2400 },
+					{ "time": 4.0333, "value": 2520 },
+					{ "time": 4.1667, "value": 2640 },
+					{ "time": 4.3, "value": 2760 },
+					{
+						"time": 4.4667,
+						"value": 2880,
+						"curve": [ 4.538, 2949.2, 4.742, 3000 ]
+					},
+					{ "time": 4.8333, "value": 3000 }
+				]
+			},
+			"wheel-small1": {
+				"rotate": [
+					{
+						"curve": [ 0.34, 0, 0.536, 57.81 ]
+					},
+					{ "time": 0.6667, "value": 120 },
+					{ "time": 0.8667, "value": 240 },
+					{ "time": 1.0333, "value": 360 },
+					{ "time": 1.1667, "value": 480 },
+					{ "time": 1.3, "value": 600 },
+					{ "time": 1.4333, "value": 720 },
+					{ "time": 1.5333, "value": 840 },
+					{ "time": 1.6333, "value": 960 },
+					{ "time": 1.7333, "value": 1080 },
+					{ "time": 1.8333, "value": 1200 },
+					{ "time": 1.9333, "value": 1320 },
+					{ "time": 2.0333, "value": 1440 },
+					{ "time": 2.1333, "value": 1560 },
+					{ "time": 2.2333, "value": 1680 },
+					{ "time": 2.3333, "value": 1800 },
+					{ "time": 2.4333, "value": 1920 },
+					{ "time": 2.5333, "value": 2040 },
+					{ "time": 2.6333, "value": 2160 },
+					{ "time": 2.7333, "value": 2280 },
+					{ "time": 2.8333, "value": 2400 },
+					{ "time": 2.9333, "value": 2520 },
+					{ "time": 3.0333, "value": 2640 },
+					{ "time": 3.1333, "value": 2760 },
+					{ "time": 3.2333, "value": 2880 },
+					{ "time": 3.3333, "value": 3000 },
+					{ "time": 3.4333, "value": 3120 },
+					{ "time": 3.5333, "value": 3240 },
+					{ "time": 3.6333, "value": 3360 },
+					{ "time": 3.7333, "value": 3480 },
+					{ "time": 3.8333, "value": 3600 },
+					{ "time": 3.9333, "value": 3720 },
+					{ "time": 4.0333, "value": 3840 },
+					{ "time": 4.1333, "value": 3960 },
+					{ "time": 4.2333, "value": 4080 },
+					{ "time": 4.3333, "value": 4200 },
+					{ "time": 4.4333, "value": 4320 },
+					{ "time": 4.6667, "value": 4440 },
+					{ "time": 4.9, "value": 4490 }
+				]
+			},
+			"wheel-small-root1": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.1333, "y": 12.37 },
+					{ "time": 2.4667, "y": 32.37 },
+					{ "time": 2.7333, "y": -5.27 },
+					{ "time": 2.9667, "y": 14.31 },
+					{ "time": 3.1667, "y": 19.54 },
+					{ "time": 3.4667, "y": 7.5 },
+					{ "time": 4.3667, "y": -2.4 }
+				]
+			},
+			"wheel-small-root2": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.9, "y": 5.26 },
+					{ "time": 3.1667, "y": 10.67 },
+					{ "time": 3.4667, "y": -4.71 }
+				]
+			},
+			"wheel-small-root3": {
+				"translate": [
+					{ "time": 2 },
+					{ "time": 2.4667, "y": -10.56 },
+					{ "time": 2.9, "y": -16.08 },
+					{ "time": 3.1667, "y": 10.12 },
+					{ "time": 3.4667, "y": 4.1 },
+					{ "time": 4.3667, "y": -0.03 }
+				]
+			},
+			"antenna1": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"antenna2": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"antenna3": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"antenna4": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"antenna5": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"antenna6": {
+				"rotate": [
+					{},
+					{
+						"time": 0.3333,
+						"value": 1.05,
+						"curve": [ 0.731, 1.05, 1.008, -4.55 ]
+					},
+					{
+						"time": 1.2333,
+						"value": -4.55,
+						"curve": [ 1.35, -4.55, 1.583, 0.53 ]
+					},
+					{ "time": 1.7, "value": 0.53 },
+					{ "time": 2, "value": -2.13 },
+					{ "time": 2.2, "value": 4.71 },
+					{ "time": 2.3667, "value": -7.26 },
+					{ "time": 2.5667, "value": 2.26 },
+					{ "time": 2.7333, "value": -3.39 },
+					{ "time": 3.0667, "value": -5.53 },
+					{ "time": 3.2333, "value": 7.78 },
+					{ "time": 3.4667, "value": -5.99 },
+					{ "time": 3.7, "value": 3.11 },
+					{ "time": 3.9, "value": -3.05 },
+					{ "time": 4.1, "value": 0.31 },
+					{ "time": 4.3, "value": -3.06 },
+					{ "time": 4.5333, "value": 0.36 },
+					{
+						"time": 4.8667,
+						"value": 4.94,
+						"curve": [ 4.925, 4.94, 5.042, -2.38 ]
+					},
+					{ "time": 5.1, "value": -2.38 },
+					{ "time": 5.2667, "value": 3.65 },
+					{ "time": 5.4, "value": -3.04 },
+					{ "time": 5.5, "value": 1.49 },
+					{ "time": 5.6, "value": -1.86 },
+					{ "time": 5.7, "value": 0.42 }
+				]
+			},
+			"machinegun": {
+				"rotate": [
+					{ "value": 8.07, "curve": "stepped" },
+					{ "time": 2.0667, "value": 8.07 },
+					{ "time": 2.1667, "value": 3.11 },
+					{ "time": 2.5667, "value": -10.99, "curve": "stepped" },
+					{ "time": 3.1333, "value": -10.99 },
+					{ "time": 3.2667, "value": 18.18 },
+					{ "time": 3.4333, "value": 2.75, "curve": "stepped" },
+					{ "time": 4.7, "value": 2.75 },
+					{ "time": 4.9, "value": 8.07 }
+				]
+			}
+		},
+		"path": {
+			"treads-path": {
+				"position": [
+					{
+						"curve": [ 0.984, 0, 1.588, 0.1788 ]
+					},
+					{
+						"time": 2,
+						"value": 0.385,
+						"curve": [ 2.023, 0.3916, 2.045, 0.3983 ]
+					},
+					{ "time": 2.0667, "value": 0.405 },
+					{ "time": 2.3333, "value": 0.555 },
+					{ "time": 2.5, "value": 0.605 },
+					{ "time": 2.6667, "value": 0.685 },
+					{ "time": 2.8333, "value": 0.745 },
+					{ "time": 3, "value": 0.785 },
+					{ "time": 3.0667, "value": 0.8 },
+					{ "time": 3.1333, "value": 0.825 },
+					{ "time": 3.1667, "value": 0.835 },
+					{ "time": 3.2333, "value": 0.87 },
+					{
+						"time": 3.5,
+						"value": 0.98,
+						"curve": [ 3.726, 1.0474, 4.335, 1.4 ]
+					},
+					{ "time": 4.8333, "value": 1.4 }
+				]
+			}
+		}
+	},
+	"shoot": {
+		"slots": {
+			"rock": {
+				"attachment": [
+					{}
+				]
+			},
+			"smoke-glow": {
+				"rgba": [
+					{ "time": 0.1333, "color": "ffffffff" },
+					{ "time": 0.1667, "color": "ffbc8af4" },
+					{ "time": 0.2, "color": "fc8e8e90" },
+					{ "time": 0.2667, "color": "fa3e3e1e" }
+				],
+				"attachment": [
+					{ "time": 0.0667, "name": "smoke-glow" },
+					{ "time": 0.3 }
+				]
+			},
+			"smoke-puff1-bg": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 1.0333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.0667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg2": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg3": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg4": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.9, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg5": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.9, "light": "ffd50c00", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg6": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg7": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3333, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg8": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4333, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.9333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg9": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.5333, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg10": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.5333, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg11": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7667, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg12": {
+				"rgba2": [
+					{ "time": 0.3333, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8667, "light": "ffd50c00", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg13": {
+				"rgba2": [
+					{ "time": 0.3667, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 1, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg14": {
+				"rgba2": [
+					{ "time": 0.4333, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 1.0667, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.4333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg15": {
+				"rgba2": [
+					{ "time": 0.4, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.4, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg16": {
+				"rgba2": [
+					{ "time": 0.4, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.4, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg17": {
+				"rgba2": [
+					{ "time": 0.2333, "light": "ffd50cff", "dark": "534035" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.6667, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.2333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg18": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.5, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.2333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg20": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.8, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3333, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg21": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7, "light": "ffd50c00", "dark": "604b3f" }
+				]
+			},
+			"smoke-puff1-bg22": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7, "light": "ffd50c00", "dark": "604b3f" }
+				]
+			},
+			"smoke-puff1-bg23": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffd50cff", "dark": "3b2c23" },
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.5, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7667, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg24": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg25": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 1, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg26": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.6, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.9333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-bg27": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ffd50cff", "dark": "604b3f", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ffd50cff", "dark": "604b3f" },
+					{ "time": 0.7333, "light": "ffd50c00", "dark": "604b3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff01-bg" }
+				]
+			},
+			"smoke-puff1-fg": {
+				"rgba2": [
+					{ "time": 0.0667, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1333, "light": "fde252ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 1.0333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.0667, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg2": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg3": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffe457ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg4": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "fae781ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.9, "light": "ac8c7500", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg5": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.9, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg6": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg7": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3333, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ac8c7500", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg8": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4333, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.9333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg9": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.5333, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg10": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "fce35dff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.5333, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ac8c7500", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.1333, "name": "smoke-puff01-fg" },
+					{ "time": 0.1667, "name": "smoke-puff02-fg" },
+					{ "time": 0.2, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg11": {
+				"rgba2": [
+					{ "time": 0.3333, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7667, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg12": {
+				"rgba2": [
+					{ "time": 0.3667, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8667, "light": "ac8c7500", "dark": "604a3f" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg13": {
+				"rgba2": [
+					{ "time": 0.3667, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 1, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg14": {
+				"rgba2": [
+					{ "time": 0.4333, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 1.0667, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.4333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg15": {
+				"rgba2": [
+					{ "time": 0.4, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.4, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg16": {
+				"rgba2": [
+					{ "time": 0.4, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.4, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg17": {
+				"rgba2": [
+					{ "time": 0.2333, "light": "e3c05eff", "dark": "ab7e59" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.6667, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.2333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg18": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.5, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7667, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.2333, "name": "smoke-puff03-fg" },
+					{ "time": 0.2667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg20": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.8, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3333, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg21": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7, "light": "ab764c00", "dark": "ac8d75" }
+				]
+			},
+			"smoke-puff1-fg22": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7, "light": "ab764c00", "dark": "ac8d75" }
+				]
+			},
+			"smoke-puff1-fg23": {
+				"rgba2": [
+					{ "time": 0.1333, "light": "ffdf31ff", "dark": "ff0000" },
+					{ "time": 0.1667, "light": "ffe568ff", "dark": "e26425" },
+					{ "time": 0.2, "light": "ffe568ff", "dark": "ab774c" },
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.5, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7667, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg24": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg25": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 1, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg26": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.6, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.9333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"smoke-puff1-fg27": {
+				"rgba2": [
+					{ "time": 0.3, "light": "ab764cff", "dark": "ac8d75", "curve": "stepped" },
+					{ "time": 0.4667, "light": "ab764cff", "dark": "ac8d75" },
+					{ "time": 0.7333, "light": "ab764c00", "dark": "ac8d75" }
+				],
+				"attachment": [
+					{ "time": 0.3667, "name": "smoke-puff04-fg" }
+				]
+			},
+			"tank-glow": {
+				"rgba": [
+					{ "time": 0.0667, "color": "fc994d84" },
+					{
+						"time": 0.1333,
+						"color": "f5b16bc8",
+						"curve": [ 0.221, 0.96, 0.252, 0.98, 0.221, 0.69, 0.252, 0.62, 0.221, 0.42, 0.252, 0.33, 0.221, 0.78, 0.252, 0.32 ]
+					},
+					{ "time": 0.2667, "color": "fc994c30" }
+				],
+				"attachment": [
+					{ "time": 0.0667, "name": "smoke-glow" },
+					{ "time": 0.2667 }
+				]
+			}
+		},
+		"bones": {
+			"cannon": {
+				"translate": [
+					{ "time": 0.0667 },
+					{ "time": 0.1667, "x": 34.77, "y": 0.9 },
+					{ "time": 0.2667, "x": 1.3 }
+				]
+			},
+			"tank-body": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{
+						"time": 0.1667,
+						"value": -4.29,
+						"curve": [ 0.2, -4.29, 0.267, 2.37 ]
+					},
+					{
+						"time": 0.3,
+						"value": 2.37,
+						"curve": [ 0.333, 2.37, 0.4, 0 ]
+					},
+					{ "time": 0.4333 }
+				],
+				"translate": [
+					{ "time": 0.0667 },
+					{
+						"time": 0.1667,
+						"x": 31.04,
+						"y": 1.67,
+						"curve": [ 0.2, 31.04, 0.267, -12.05, 0.2, 1.67, 0.267, -0.23 ]
+					},
+					{ "time": 0.3, "x": -12.05, "y": -0.23 },
+					{ "time": 0.3667 }
+				]
+			},
+			"tank-treads": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.1667, "value": -3.08 },
+					{ "time": 0.3, "value": -0.42 }
+				]
+			},
+			"smoke1": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.1333, "value": 2.88 },
+					{ "time": 0.1667, "value": 2.34 },
+					{ "time": 0.2, "value": 124.36 },
+					{ "time": 0.2667, "value": 142.26 },
+					{ "time": 0.3333, "value": 86.78 },
+					{ "time": 0.4667, "value": 128.79 },
+					{ "time": 0.6333, "value": 146.22 },
+					{ "time": 1.0333, "value": 210.7 }
+				],
+				"translate": [
+					{ "time": 0.0667, "x": -9.69, "y": 1.05 },
+					{ "time": 0.1333, "x": 7.53, "y": 1.21 },
+					{ "time": 0.1667, "x": 3.26, "y": 4.07 },
+					{ "time": 0.2, "x": 29.64, "y": -17.46 },
+					{ "time": 0.2667, "x": 86.97, "y": 17.83 },
+					{ "time": 0.3333, "x": 193.74, "y": -38.98 },
+					{ "time": 0.4, "x": 341.67, "y": -39.52 },
+					{ "time": 0.6333, "x": 393.24, "y": -4.01 },
+					{ "time": 1.0333, "x": 410.76, "y": 6.35 }
+				],
+				"scale": [
+					{ "time": 0.0667 },
+					{ "time": 0.1333, "x": 3.171, "y": 0.756 },
+					{ "time": 0.1667, "x": 3.488, "y": 1.279 },
+					{ "time": 0.2, "x": 5.151, "y": 2.369 },
+					{ "time": 0.2667, "x": 4.735, "y": 3.622 },
+					{ "time": 0.3, "x": 4.735, "y": 4.019 },
+					{ "time": 0.3333, "x": 4.613, "y": 3.339 },
+					{ "time": 0.3667, "x": 4.918, "y": 3.561 },
+					{ "time": 0.4, "x": 4.6, "y": 4.263 },
+					{ "time": 0.6333, "x": 4.449, "y": 2.62 },
+					{ "time": 1.0333, "x": 3.09, "y": 1.447 }
+				]
+			},
+			"smoke2": {
+				"rotate": [
+					{ "time": 0.1667, "value": 31.55 },
+					{ "time": 0.3, "value": -22.63 },
+					{ "time": 0.4667, "value": 142.89 },
+					{ "time": 0.6, "value": 253.78 },
+					{ "time": 0.8333, "value": 299.28 }
+				],
+				"translate": [
+					{ "time": 0.1667, "x": 17.26, "y": 4.86 },
+					{ "time": 0.2333, "x": 141.22, "y": 27.27 },
+					{ "time": 0.3, "x": 178.86, "y": 56.63 },
+					{ "time": 0.3667, "x": 200.46, "y": 71.05 },
+					{ "time": 0.4333, "x": 213.12, "y": 78.39 },
+					{ "time": 0.6333, "x": 221.44, "y": 73.1 },
+					{ "time": 0.8333, "x": 223.32, "y": 73.74 }
+				],
+				"scale": [
+					{ "time": 0.1667, "x": 1.34, "y": 1.34 },
+					{ "time": 0.2333, "x": 2.81, "y": 1.317 },
+					{ "time": 0.3, "x": 2.932, "y": 1.374 },
+					{ "time": 0.4667, "x": 1.247, "y": 0.639 },
+					{ "time": 0.8333, "x": 0.778, "y": 0.515 }
+				]
+			},
+			"smoke3": {
+				"rotate": [
+					{ "time": 0.1667, "value": -5.54 },
+					{ "time": 0.2333, "value": 0.2 },
+					{ "time": 0.3333, "value": 20.27 },
+					{ "time": 0.4, "value": 31.36 },
+					{ "time": 0.4667, "value": 68.52 },
+					{ "time": 0.5333, "value": 99.74 },
+					{ "time": 0.6333, "value": 145.8 },
+					{ "time": 0.8333, "value": 193.28 }
+				],
+				"translate": [
+					{ "time": 0.1333, "x": 1.17, "y": 8.53 },
+					{ "time": 0.1667, "x": 37.53, "y": 4.84 },
+					{ "time": 0.2, "x": 67.99, "y": 9.85 },
+					{ "time": 0.2333, "x": 134.14, "y": -13.5 },
+					{ "time": 0.2667, "x": 181.31, "y": -19.93 },
+					{ "time": 0.3, "x": 238.28, "y": -8.82 },
+					{ "time": 0.3333, "x": 268.51, "y": -25.75 },
+					{ "time": 0.3667, "x": 359.06, "y": -28.49 },
+					{ "time": 0.4, "x": 432.96, "y": -24.11 },
+					{ "time": 0.4667, "x": 452.16, "y": -16.73 },
+					{ "time": 0.6333, "x": 456.28, "y": -0.41 },
+					{ "time": 0.8333, "x": 454.14, "y": 16.41 }
+				],
+				"scale": [
+					{ "time": 0.1333, "x": 2.258, "y": 1.366 },
+					{ "time": 0.1667, "x": 2.656, "y": 1.47 },
+					{ "time": 0.2, "x": 3.202, "y": 1.772 },
+					{ "time": 0.2333, "x": 3.202, "y": 1.93 },
+					{ "time": 0.2667, "x": 3.124, "y": 1.896 },
+					{ "time": 0.3, "x": 3.593, "y": 1.896 },
+					{ "time": 0.3333, "x": 2.363, "y": 1.247 },
+					{ "time": 0.3667, "x": 1.845, "y": 0.973 },
+					{ "time": 0.4, "x": 1.754, "y": 0.926 },
+					{ "time": 0.4333, "x": 1.448, "y": 0.695 },
+					{ "time": 0.4667, "x": 1.441, "y": 0.688 },
+					{ "time": 0.5333, "x": 0.865, "y": 0.456 },
+					{ "time": 0.7, "x": 0.86, "y": 0.454 },
+					{ "time": 0.8333, "x": 0.211, "y": 0.111 }
+				]
+			},
+			"smoke4": {
+				"rotate": [
+					{ "time": 0.1667, "value": -20.35 },
+					{ "time": 0.2333, "value": 18.5 },
+					{ "time": 0.3, "value": 57.77 },
+					{ "time": 0.4, "value": 105.85 },
+					{ "time": 0.6, "value": 161.28 },
+					{ "time": 0.9, "value": 208.43 }
+				],
+				"translate": [
+					{ "time": 0.1667, "x": 35.95, "y": 25.54 },
+					{ "time": 0.2333, "x": 34.17, "y": 1.87 },
+					{ "time": 0.3, "x": 136.7, "y": 21.5 },
+					{ "time": 0.4, "x": 138.61, "y": 34.8 },
+					{ "time": 0.6, "x": 160.38, "y": 37.13 },
+					{ "time": 0.9, "x": 196.41, "y": 30.36 }
+				],
+				"scale": [
+					{ "time": 0.1667, "x": 2.751, "y": 1.754 },
+					{ "time": 0.2333, "x": 3.486, "y": 2.224 },
+					{ "time": 0.2667, "x": 3.486, "y": 2.586 },
+					{ "time": 0.3, "x": 3.847, "y": 2.109 },
+					{ "time": 0.4, "x": 1.96, "y": 1.074 },
+					{ "time": 0.9, "x": 0.825, "y": 0.452 }
+				]
+			},
+			"smoke5": {
+				"rotate": [
+					{ "time": 0.2, "value": 23.09 },
+					{ "time": 0.2667, "value": 12.24 },
+					{ "time": 0.3333, "value": 36.92 },
+					{ "time": 0.4333, "value": -37.33 },
+					{ "time": 0.5333, "value": -0.66 },
+					{ "time": 0.9, "value": 64.02 }
+				],
+				"translate": [
+					{ "time": 0.1333 },
+					{ "time": 0.2333, "x": 123.76, "y": 19.44 },
+					{ "time": 0.3, "x": 239.08, "y": -49.72 },
+					{ "time": 0.3667, "x": 280.23, "y": -51.46 },
+					{ "time": 0.7, "x": 340.62, "y": -20.09 },
+					{ "time": 0.9, "x": 349.18, "y": -5.25 }
+				],
+				"scale": [
+					{ "time": 0.1333 },
+					{ "time": 0.1667, "x": 1.718, "y": 1.718 },
+					{ "time": 0.2, "x": 2.109, "y": 2.109 },
+					{ "time": 0.2333, "x": 1.781, "y": 2.183 },
+					{ "time": 0.2667, "x": 2.148, "y": 2.633 },
+					{ "time": 0.3333, "x": 2.234, "y": 2.738 },
+					{ "time": 0.3667, "x": 1.366, "y": 2.148 },
+					{ "time": 0.4, "x": 0.97, "y": 1.524 },
+					{ "time": 0.4333, "x": 1.078, "y": 1.157 },
+					{ "time": 0.4667, "x": 1.126, "y": 1.005 },
+					{ "time": 0.7, "x": 1.241, "y": 1.301 },
+					{ "time": 0.9, "x": 0.709, "y": 0.893 }
+				]
+			},
+			"smoke6": {
+				"rotate": [
+					{ "time": 0.1667, "value": -37.43 },
+					{ "time": 0.2333, "value": -18.36 },
+					{ "time": 0.3333, "value": 28.58 },
+					{ "time": 0.4, "value": 150.54 },
+					{ "time": 0.7, "value": 301.59 }
+				],
+				"translate": [
+					{ "time": 0.1333 },
+					{ "time": 0.2, "x": 68.04, "y": 16.15 },
+					{ "time": 0.2667, "x": 214.52, "y": 13.25 },
+					{ "time": 0.3333, "x": 285.4, "y": 17.95 },
+					{ "time": 0.4, "x": 202.91, "y": 101.43 },
+					{ "time": 0.4667, "x": 189.25, "y": 116.39 },
+					{ "time": 0.7, "x": 182.77, "y": 137.4 }
+				],
+				"scale": [
+					{ "time": 0.1333 },
+					{ "time": 0.1667, "x": 1.152, "y": 1.288 },
+					{ "time": 0.2, "x": 1.939, "y": 2.168 },
+					{ "time": 0.2333, "x": 2.278, "y": 2.223 },
+					{ "time": 0.2667, "x": 2.023, "y": 1.974 },
+					{ "time": 0.3, "x": 2.644, "y": 1.974 },
+					{ "time": 0.4, "x": 1.539, "y": 1.425 },
+					{ "time": 0.4667, "x": 1.14, "y": 0.939 },
+					{ "time": 0.7, "x": 0.215, "y": 0.161 }
+				]
+			},
+			"smoke7": {
+				"rotate": [
+					{ "time": 0.1667, "value": -243.11 },
+					{ "time": 0.4, "value": -182.02 },
+					{ "time": 0.8333, "value": -83.02 }
+				],
+				"translate": [
+					{ "time": 0.1333, "x": 3.19, "y": -6.53 },
+					{ "time": 0.1667, "x": 44.54, "y": 1.12 },
+					{ "time": 0.2, "x": 65.84, "y": 6.02 },
+					{ "time": 0.2333, "x": 173.84, "y": 97.51 },
+					{ "time": 0.4, "x": 167.39, "y": 74.58 },
+					{ "time": 0.8333, "x": 227.77, "y": 84.64 }
+				],
+				"scale": [
+					{ "time": 0.1333, "x": 0.878, "y": 0.878 },
+					{ "time": 0.1667, "x": 1.235, "y": 1.235 },
+					{ "time": 0.2, "x": 1.461, "y": 1.461 },
+					{ "time": 0.2333, "x": 1.114, "y": 1.114 },
+					{ "time": 0.3333, "x": 1.067, "y": 1.067 },
+					{ "time": 0.4667, "x": 0.81, "y": 0.753 },
+					{ "time": 0.8333, "x": 0.52, "y": 0.484 }
+				]
+			},
+			"smoke8": {
+				"rotate": [
+					{ "time": 0.1667, "value": -156.52 },
+					{ "time": 0.2667, "value": -154.05 },
+					{ "time": 0.3333, "value": -108.35 },
+					{ "time": 0.6, "value": -93.14 },
+					{ "time": 0.9333, "value": -70.89 }
+				],
+				"translate": [
+					{ "time": 0.1667, "x": 20.72, "y": 0.25 },
+					{ "time": 0.2333, "x": 46.1, "y": -10.06 },
+					{ "time": 0.3, "x": 149.77, "y": 0.92 },
+					{ "time": 0.3667, "x": 241.21, "y": 49.01 },
+					{ "time": 0.5333, "x": 276, "y": 58.76 },
+					{ "time": 0.7, "x": 292.02, "y": 65.91 },
+					{ "time": 0.9333, "x": 308.7, "y": 69.51 }
+				],
+				"scale": [
+					{ "time": 0.1333, "y": 1.174 },
+					{ "time": 0.1667, "x": 1.813, "y": 1.438 },
+					{ "time": 0.2, "x": 1.813, "y": 1.878 },
+					{ "time": 0.2333, "x": 1.211, "y": 1.878 },
+					{ "time": 0.2667, "x": 1.584, "y": 1.596 },
+					{ "time": 0.3, "x": 1.958, "y": 1.878 },
+					{ "time": 0.4667, "x": 1.139, "y": 0.958 },
+					{ "time": 0.9333, "x": 0.839, "y": 0.591 }
+				]
+			},
+			"smoke9": {
+				"rotate": [
+					{ "time": 0.1333, "value": -44.34 },
+					{ "time": 0.1667, "value": 14.73 },
+					{ "time": 0.2333, "value": 116.07 },
+					{ "time": 0.2667, "value": 118.29 },
+					{ "time": 0.3333, "value": 148.13 },
+					{ "time": 0.3667, "value": 172.74 },
+					{ "time": 0.4, "value": 235.69 },
+					{ "time": 0.4333, "value": 283.36 },
+					{ "time": 0.7667, "value": 358.76 }
+				],
+				"translate": [
+					{ "time": 0.1333, "x": -3.49, "y": 0.04 },
+					{ "time": 0.2, "x": 87.4, "y": -7.97 },
+					{ "time": 0.2667, "x": 233.69, "y": -33.86 },
+					{ "time": 0.3333, "x": 296.44, "y": -30.87 },
+					{ "time": 0.4, "x": 390.8, "y": 4 },
+					{ "time": 0.4667, "x": 391.42, "y": 13.17 },
+					{ "time": 0.6333, "x": 413.3, "y": 36.13 },
+					{ "time": 0.7667, "x": 408.59, "y": 40.75 }
+				],
+				"scale": [
+					{ "time": 0.1333, "x": 1.289, "y": 1.501 },
+					{ "time": 0.2, "x": 1.751, "y": 2.039 },
+					{ "time": 0.2667, "x": 2.064, "y": 2.347 },
+					{ "time": 0.3333, "x": 1.822, "y": 2.072 },
+					{ "time": 0.4, "x": 1.296, "y": 1.045 },
+					{ "time": 0.4667, "x": 1.872, "y": 1.526 },
+					{ "time": 0.6333, "x": 1.181, "y": 1.037 },
+					{ "time": 0.7667, "x": 0.716, "y": 0.615 }
+				]
+			},
+			"smoke10": {
+				"rotate": [
+					{ "time": 0.1333, "value": 12.16 },
+					{ "time": 0.2, "value": 49.19 },
+					{ "time": 0.2667, "value": 33.17 },
+					{ "time": 0.3333, "value": 42.23 },
+					{ "time": 0.4, "value": 11.69 },
+					{ "time": 0.4667, "value": 41.83 },
+					{ "time": 0.5333, "value": 54.86 },
+					{ "time": 0.6333, "value": 75.25 },
+					{ "time": 0.8333, "value": 126.4 }
+				],
+				"translate": [
+					{ "time": 0.1333, "x": 7.74, "y": 10.25 },
+					{ "time": 0.2, "x": 42.9, "y": 72.89 },
+					{ "time": 0.2667, "x": 221.58, "y": 82.27 },
+					{ "time": 0.3333, "x": 297.31, "y": 85.39 },
+					{ "time": 0.4, "x": 322.91, "y": 81.04 },
+					{ "time": 0.4667, "x": 346.62, "y": 76.68 },
+					{ "time": 0.6667, "x": 377.46, "y": 81.85 },
+					{ "time": 0.8333, "x": 402.18, "y": 101.03 }
+				],
+				"scale": [
+					{ "time": 0.1333, "x": 0.537, "y": 1.062 },
+					{ "time": 0.1667, "x": 1.042, "y": 0.841 },
+					{ "time": 0.2, "x": 1.937, "y": 1.563 },
+					{ "time": 0.2333, "x": 1.937, "y": 2.176 },
+					{ "time": 0.2667, "x": 2.254, "y": 2.532 },
+					{ "time": 0.3, "x": 2.24, "y": 2.516 },
+					{ "time": 0.5333, "x": 1.731, "y": 1.882 },
+					{ "time": 0.8333, "x": 0.855, "y": 0.867 }
+				]
+			},
+			"smoke-glow": {
+				"translate": [
+					{ "time": 0.0667, "x": -57.08, "y": 0.01 },
+					{ "time": 0.1, "x": -49.68, "y": -1.46 },
+					{ "time": 0.1333, "x": 6.3, "y": -2.92 },
+					{ "time": 0.1667, "x": 31.57, "y": 0.44 },
+					{ "time": 0.2, "x": 34.04, "y": 0.27 },
+					{ "time": 0.2333, "x": 109.29, "y": 1.02 },
+					{ "time": 0.4, "x": 119.89, "y": 1.01 },
+					{ "time": 0.4333, "x": 135.2, "y": 1.03 },
+					{ "time": 0.4667, "x": 152.86, "y": 1.06 },
+					{ "time": 0.5333, "x": 164.64, "y": 1.07 },
+					{ "time": 0.6, "x": 179.94, "y": 1.09 },
+					{ "time": 0.6333, "x": 190.54, "y": 1.1 }
+				],
+				"scale": [
+					{ "time": 0.0667, "x": 0.233, "y": 0.233 },
+					{ "time": 0.1, "x": 0.42, "y": 0.288 },
+					{ "time": 0.1333, "x": 1.669, "y": 1.072 },
+					{ "time": 0.1667, "x": 1.669, "y": 1.785, "curve": "stepped" },
+					{ "time": 0.2, "x": 1.669, "y": 1.785 },
+					{ "time": 0.2333, "x": 2.544, "y": 1.785 },
+					{ "time": 0.4333, "x": 3.48, "y": 2.22 },
+					{ "time": 0.4667, "x": 4.337, "y": 2.655 }
+				]
+			},
+			"smoke11": {
+				"rotate": [
+					{ "time": 0.4, "value": 47.07 },
+					{ "time": 0.4333, "value": 109.71 },
+					{ "time": 0.4667, "value": 164.62 },
+					{ "time": 0.8333, "value": 276.93 }
+				],
+				"translate": [
+					{ "time": 0.3333, "x": 280.31, "y": 126.85 },
+					{ "time": 0.4, "x": 296.27, "y": 125.62 },
+					{ "time": 0.4667, "x": 312.45, "y": 131.57 },
+					{ "time": 0.6667, "x": 310.5, "y": 149.67 },
+					{ "time": 0.8333, "x": 307.08, "y": 153.94 }
+				],
+				"scale": [
+					{ "time": 0.3333, "x": 1.491, "y": 1.491 },
+					{ "time": 0.4667, "x": 1.144, "y": 0.948 },
+					{ "time": 0.5667, "x": 0.491, "y": 0.491 },
+					{ "time": 0.8333, "x": 0.985, "y": 0.91 }
+				]
+			},
+			"smoke12": {
+				"rotate": [
+					{ "time": 0.3667, "value": -37.96 },
+					{ "time": 0.4333, "value": 28.55 },
+					{ "time": 0.5333, "value": 108.53 },
+					{ "time": 0.8667, "value": 191.85 }
+				],
+				"translate": [
+					{ "time": 0.3667, "x": 390.22, "y": -1.06 },
+					{ "time": 0.4333, "x": 411.78, "y": 26.39 },
+					{ "time": 0.5333, "x": 428.12, "y": 56.28 },
+					{ "time": 0.8667, "x": 444.34, "y": 68.06 }
+				],
+				"scale": [
+					{ "time": 0.3667, "x": 2.006, "y": 1.821 },
+					{ "time": 0.5333, "x": 1.719, "y": 1.293 },
+					{ "time": 0.7333, "x": 1.562, "y": 1.304 },
+					{ "time": 0.8667, "x": 0.727, "y": 0.637 }
+				]
+			},
+			"smoke13": {
+				"rotate": [
+					{ "time": 0.3667, "value": 305.8 },
+					{ "time": 0.4, "value": 478.49 },
+					{ "time": 0.4333, "value": 537.45 },
+					{ "time": 0.4667, "value": 573.84 },
+					{ "time": 0.5333, "value": 596.4 },
+					{ "time": 0.7, "value": 622.3 },
+					{ "time": 1, "value": 657.95 }
+				],
+				"translate": [
+					{ "time": 0.3667, "x": 331.84, "y": -25.82 },
+					{ "time": 0.4, "x": 417.88, "y": -42.62 },
+					{ "time": 0.4667, "x": 451.61, "y": -42.21 },
+					{ "time": 0.5333, "x": 453.81, "y": -37.03 },
+					{ "time": 0.6, "x": 451.86, "y": -31.89 },
+					{ "time": 0.7, "x": 453.37, "y": -27.28 },
+					{ "time": 1, "x": 454.04, "y": -17.89 }
+				],
+				"scale": [
+					{ "time": 0.3667, "x": 4.509, "y": 3.114 },
+					{ "time": 0.4, "x": 3.673, "y": 2.537 },
+					{ "time": 0.4333, "x": 4.201, "y": 2.638 },
+					{ "time": 0.4667, "x": 4.27, "y": 2.399 },
+					{ "time": 0.6, "x": 2.798, "y": 1.932 },
+					{ "time": 0.8333, "x": 2.316, "y": 1.599 },
+					{ "time": 1, "x": 1.081, "y": 0.746 }
+				]
+			},
+			"smoke14": {
+				"rotate": [
+					{ "time": 0.4333, "value": 271.03 },
+					{ "time": 0.7, "value": 299.97 },
+					{ "time": 1.0667, "value": 331.16 }
+				],
+				"translate": [
+					{ "time": 0.4333, "x": 371.68, "y": -29.8 },
+					{ "time": 0.7667, "x": 400.59, "y": -44.36 },
+					{ "time": 1.0667, "x": 432.26, "y": -44.79 }
+				],
+				"scale": [
+					{ "time": 0.4333, "x": 4.011, "y": 3.366 },
+					{ "time": 0.7667, "x": 2.071, "y": 1.624 },
+					{ "time": 1.0667, "x": 1.798, "y": 1.111 }
+				]
+			},
+			"smoke15": {
+				"rotate": [
+					{ "time": 0.4, "value": 111.75 },
+					{ "time": 0.4667, "value": 171.93 },
+					{ "time": 0.6, "value": 256.95 },
+					{ "time": 0.8333, "value": 299.15 }
+				],
+				"translate": [
+					{ "time": 0.4, "x": 266.71, "y": -53.04 },
+					{ "time": 0.4333, "x": 290.84, "y": -51.43 },
+					{ "time": 0.5333, "x": 305.65, "y": -44.32 },
+					{ "time": 0.6667, "x": 318.96, "y": -38.95 },
+					{ "time": 0.8333, "x": 342.65, "y": -27.33 }
+				],
+				"scale": [
+					{ "time": 0.4, "x": 2.749, "y": 2.095 },
+					{ "time": 0.4333, "x": 3.302, "y": 2.289 },
+					{ "time": 0.4667, "x": 2.591, "y": 1.895 },
+					{ "time": 0.5333, "x": 1.777, "y": 1.354 },
+					{ "time": 0.7, "x": 1.932, "y": 1.267 },
+					{ "time": 0.8333, "x": 1.002, "y": 1.546 }
+				]
+			},
+			"smoke16": {
+				"rotate": [
+					{ "time": 0.4, "value": 89.78 },
+					{ "time": 0.4667, "value": 137.83 },
+					{ "time": 0.5333, "value": 193.49 },
+					{ "time": 0.6, "value": 235.26 },
+					{ "time": 0.6333, "value": 286.8 }
+				],
+				"translate": [
+					{ "time": 0.4, "x": 217.23, "y": -21.45 },
+					{ "time": 0.4667, "x": 249.95, "y": -13.73 },
+					{ "time": 0.5333, "x": 264.96, "y": -9.87 },
+					{ "time": 0.6, "x": 278.95, "y": 6.37 },
+					{ "time": 0.6333, "x": 245.65, "y": 11.77 }
+				],
+				"scale": [
+					{ "time": 0.4, "x": 2.265, "y": 1.859 },
+					{ "time": 0.4333, "x": 2.621, "y": 1.955 },
+					{ "time": 0.4667, "x": 1.953, "y": 1.538 },
+					{ "time": 0.6, "x": 1.005, "y": 0.825 },
+					{ "time": 0.6333, "x": 0.387, "y": 0.318 }
+				]
+			},
+			"smoke17": {
+				"rotate": [
+					{ "time": 0.2333, "value": 99.02 },
+					{ "time": 0.3, "value": 58.06 },
+					{ "time": 0.3333, "value": 34.05 },
+					{ "time": 0.3667, "value": -17.34 },
+					{ "time": 0.6667, "value": -62.36 }
+				],
+				"translate": [
+					{ "time": 0.2333, "x": 18.91, "y": -62.91 },
+					{ "time": 0.3, "x": 2.43, "y": -61.54 },
+					{ "time": 0.3333, "x": 1.89, "y": -36.55 },
+					{ "time": 0.3667, "x": 6.97, "y": -29.52 },
+					{ "time": 0.4333, "x": 10.78, "y": -20.55 },
+					{ "time": 0.6667, "x": 18.65, "y": -13.19 }
+				],
+				"scale": [
+					{ "time": 0.2333, "x": 1.915, "y": 1.915 },
+					{ "time": 0.3, "x": 1.509, "y": 1.509 },
+					{ "time": 0.3333, "x": 1.01, "y": 1.01 },
+					{ "time": 0.3667, "x": 0.715, "y": 0.715 },
+					{ "time": 0.4333, "x": 0.949, "y": 0.721 },
+					{ "time": 0.5667, "x": 0.785, "y": 0.74 }
+				]
+			},
+			"smoke18": {
+				"rotate": [
+					{ "time": 0.2333, "value": 141.75 },
+					{ "time": 0.2667, "value": 134.51 },
+					{ "time": 0.3333, "value": 249.12 },
+					{ "time": 0.5, "value": 363.82 },
+					{ "time": 0.7333, "value": 450.54 }
+				],
+				"translate": [
+					{ "time": 0.2333, "x": 60.81, "y": 56.17 },
+					{ "time": 0.2667, "x": 68.74, "y": 69.4 },
+					{ "time": 0.3333, "x": 76.85, "y": 69.07 },
+					{ "time": 0.5, "x": 101.49, "y": 89.87 },
+					{ "time": 0.7333, "x": 118.58, "y": 101.16 }
+				],
+				"scale": [
+					{ "time": 0.2333, "x": 2.288, "y": 2.288 },
+					{ "time": 0.2667, "x": 2.288, "y": 1.628 },
+					{ "time": 0.3, "x": 1.524, "y": 1.308 },
+					{ "time": 0.5, "x": 1.757, "y": 1.385 },
+					{ "time": 0.5333, "x": 2.08, "y": 1.51 },
+					{ "time": 0.7333, "x": 1.405, "y": 0.896 }
+				]
+			},
+			"smoke20": {
+				"rotate": [
+					{ "time": 0.3333, "value": 95.16 },
+					{ "time": 0.3667, "value": 130.42 },
+					{ "time": 0.4, "value": 170.7 },
+					{ "time": 0.4333, "value": 266.75 },
+					{ "time": 0.4667, "value": 299.82 },
+					{ "time": 0.5333, "value": 326.88 },
+					{ "time": 0.6, "value": 350.8 },
+					{ "time": 0.9, "value": 403.14 }
+				],
+				"translate": [
+					{ "time": 0.3333, "x": 124.61, "y": -46.55 },
+					{ "time": 0.5333, "x": 173.8, "y": -36.62 },
+					{ "time": 0.7, "x": 186.5, "y": -35.41 },
+					{ "time": 0.9, "x": 188.56, "y": -37.75 }
+				],
+				"scale": [
+					{ "time": 0.3333, "x": 3.346, "y": 2.654 },
+					{ "time": 0.3667, "x": 2.661, "y": 2.111 },
+					{ "time": 0.4333, "x": 2.751, "y": 1.984 },
+					{ "time": 0.4667, "x": 3.059, "y": 2.21 },
+					{ "time": 0.5333, "x": 2.159, "y": 1.712 },
+					{ "time": 0.7, "x": 1.601, "y": 1.27 },
+					{ "time": 0.9, "x": 1.679, "y": 0.856 }
+				]
+			},
+			"smoke23": {
+				"rotate": [
+					{ "time": 0.3, "value": 115.12 },
+					{ "time": 0.3667, "value": 79.01 },
+					{ "time": 0.7667, "value": 6.96 }
+				],
+				"translate": [
+					{ "time": 0.3, "x": 75.15, "y": -50.92 },
+					{ "time": 0.3667, "x": 59.33, "y": -53.52 },
+					{ "time": 0.7667, "x": 39.68, "y": -48.64 }
+				],
+				"scale": [
+					{ "time": 0.3, "x": 3.331, "y": 2.096 },
+					{ "time": 0.4333, "x": 2.4, "y": 2.006 },
+					{ "time": 0.5, "x": 2.555, "y": 2.094 },
+					{ "time": 0.7667, "x": 1.35, "y": 1.241 }
+				]
+			},
+			"antenna1": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"antenna2": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"antenna3": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"antenna4": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"antenna5": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"antenna6": {
+				"rotate": [
+					{ "time": 0.0667 },
+					{ "time": 0.2, "value": 11.78 },
+					{ "time": 0.3, "value": -9.52 },
+					{ "time": 0.4, "value": 8.07 },
+					{ "time": 0.5, "value": -4.45 },
+					{ "time": 0.6, "value": 1.54 },
+					{ "time": 0.7, "value": -0.34 }
+				]
+			},
+			"smoke24": {
+				"rotate": [
+					{ "time": 0.3, "value": 71.32 },
+					{ "time": 0.3667, "value": 112.39 },
+					{ "time": 0.4667, "value": 159.56 },
+					{ "time": 0.7, "value": 224.21 }
+				],
+				"translate": [
+					{ "time": 0.3, "x": 90.72, "y": -18.79 },
+					{ "time": 0.3667, "x": 149.69, "y": -7.78 },
+					{ "time": 0.4667, "x": 176.26, "y": 12.31 },
+					{ "time": 0.7, "x": 184.07, "y": 31.75 }
+				],
+				"scale": [
+					{ "time": 0.3, "x": 2.906, "y": 2.311 },
+					{ "time": 0.4333, "x": 3.567, "y": 2.58 },
+					{ "time": 0.4667, "x": 3.157, "y": 2.41 },
+					{ "time": 0.7, "x": 1.705, "y": 1.356 }
+				]
+			},
+			"smoke25": {
+				"rotate": [
+					{ "time": 0.3667, "value": 91.25 },
+					{ "time": 0.4333, "value": 117.56 },
+					{ "time": 0.6333, "value": 150.9 },
+					{ "time": 1, "value": 189.47 }
+				],
+				"translate": [
+					{ "time": 0.3667, "x": 187.21, "y": -51.18 },
+					{ "time": 0.5333, "x": 245.48, "y": -46.28 },
+					{ "time": 0.6667, "x": 277.36, "y": -43.12 },
+					{ "time": 1, "x": 313.27, "y": -38.14 }
+				],
+				"scale": [
+					{ "time": 0.3667, "x": 3.606, "y": 2.657 },
+					{ "time": 0.4333, "x": 4.166, "y": 2.792 },
+					{ "time": 0.5333, "x": 3.09, "y": 2.091 },
+					{ "time": 1, "x": 3.062, "y": 1.801 }
+				]
+			},
+			"smoke26": {
+				"rotate": [
+					{ "time": 0.3667, "value": 10.64 },
+					{ "time": 0.4, "value": 60.85 },
+					{ "time": 0.4667, "value": 89.45 },
+					{ "time": 0.7, "value": 125.01 },
+					{ "time": 0.9333, "value": 155.24 }
+				],
+				"translate": [
+					{ "time": 0.3667, "x": 442.07, "y": -13.19 },
+					{ "time": 0.4, "x": 453.7, "y": 0.81 },
+					{ "time": 0.4667, "x": 443.57, "y": -6.95 },
+					{ "time": 0.7, "x": 460.97, "y": 15.79 },
+					{ "time": 0.9333, "x": 465.22, "y": 20.92 }
+				],
+				"scale": [
+					{ "time": 0.3667, "x": 2.726, "y": 2.726 },
+					{ "time": 0.4333, "x": 3.729, "y": 2.822 },
+					{ "time": 0.4667, "x": 3.398, "y": 2.441 },
+					{ "time": 0.7, "x": 4.324, "y": 3.159 },
+					{ "time": 0.9, "x": 1.977, "y": 1.48 }
+				]
+			},
+			"smoke27": {
+				"rotate": [
+					{ "time": 0.3667, "value": 24.75 },
+					{ "time": 0.4333, "value": -5.43 },
+					{ "time": 0.5333, "value": -39.76 },
+					{ "time": 0.8333, "value": -56.25 }
+				],
+				"translate": [
+					{ "time": 0.3667, "x": 92.98, "y": -49.06 },
+					{ "time": 0.5333, "x": 129.81, "y": -33.09 },
+					{ "time": 0.8333, "x": 143.68, "y": -25.27 }
+				],
+				"scale": [
+					{ "time": 0.3667, "x": 3.633, "y": 2.223 },
+					{ "time": 0.4333, "x": 2.745, "y": 2.283 },
+					{ "time": 0.4667, "x": 2.962, "y": 2.122 },
+					{ "time": 0.5333, "x": 2.007, "y": 1.266 }
+				]
+			},
+			"cannon-target": {
+				"translate": [
+					{ "time": 0.1333 },
+					{
+						"time": 0.2,
+						"y": 128.38,
+						"curve": [ 0.4, 0, 0.8, 0, 0.4, 128.38, 0.8, 0 ]
+					},
+					{ "time": 1 }
+				],
+				"scale": [
+					{ "time": 0.4333, "x": 0.632, "y": 1.244 },
+					{ "time": 0.4667, "x": 0.477, "y": 1.487 }
+				]
+			},
+			"machinegun-target": {
+				"scale": [
+					{ "time": 0.4333, "x": 0.632, "y": 1.244 },
+					{ "time": 0.4667, "x": 0.477, "y": 1.487 }
+				]
+			},
+			"machinegun": {
+				"rotate": [
+					{ "value": 8.07, "curve": "stepped" },
+					{ "time": 0.0667, "value": 8.07 },
+					{
+						"time": 0.2333,
+						"value": -18.67,
+						"curve": [ 0.894, -18.44, 0.832, 7.5 ]
+					},
+					{ "time": 0.9, "value": 8.07 }
+				]
+			},
+			"tank-root": {
+				"translate": [
+					{ "time": 0.0667 },
+					{
+						"time": 0.1667,
+						"x": 46.59,
+						"curve": [ 0.192, 46.59, 0.242, 0, 0.192, 0, 0.242, 0 ]
+					},
+					{ "time": 0.2667 }
+				]
+			},
+			"tank-glow": {
+				"translate": [
+					{
+						"time": 0.1333,
+						"x": 198.14,
+						"curve": [ 0.199, 190.76, 0.222, -255.89, 0.199, 0, 0.222, 0 ]
+					},
+					{ "time": 0.2333, "x": -390 }
+				],
+				"scale": [
+					{ "time": 0.0667 },
+					{
+						"time": 0.1333,
+						"x": 1.185,
+						"y": 0.945,
+						"curve": [ 0.199, 1.182, 0.222, 1.048, 0.199, 0.939, 0.222, 0.579 ]
+					},
+					{ "time": 0.2333, "x": 1.008, "y": 0.471 }
+				]
+			}
+		},
+		"attachments": {
+			"default": {
+				"clipping": {
+					"clipping": {
+						"deform": [
+							{
+								"time": 0.0667,
+								"offset": 54,
+								"vertices": [ 4.59198, -4.59192 ]
+							},
+							{
+								"time": 0.1333,
+								"offset": 8,
+								"vertices": [ -8.97369, -1.88211, 9.11177, 1.02258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.73321, -45.16878, -30.31448, -84.4631, -32.24969, -108.78421, 70.26825, -36.90201 ]
+							},
+							{
+								"time": 0.1667,
+								"offset": 8,
+								"vertices": [ -11.32373, -1.65065, 11.42179, 0.53259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.36503, -69.18713, -4.45626, -121.90839, 5.46554, -115.23274, 71.78526, -33.85687 ]
+							},
+							{
+								"time": 0.2,
+								"offset": 8,
+								"vertices": [ -8.70522, 1.02196, 8.65102, -1.4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.59198, -4.59192 ]
+							},
+							{
+								"time": 0.2333,
+								"offset": 8,
+								"vertices": [ -5.23146, 0.85796, 5.23882, -0.81519 ]
+							},
+							{
+								"time": 0.2667,
+								"offset": 54,
+								"vertices": [ 4.59198, -4.59192 ]
+							}
+						]
+					}
+				},
+				"smoke-glow": {
+					"smoke-glow": {
+						"deform": [
+							{
+								"time": 0.1333,
+								"vertices": [ -14.17073, 19.14352, 0, 0, -10.97961, -15.09065, -5.79558, -24.82121, 0.68117, -17.78759, -1.1179, -5.4463, 0, 0, 0, 0, 17.52957, 6.89397, -0.33841, -2.21582, 5.51004, 18.88118, -6.80153, 20.91101 ]
+							},
+							{
+								"time": 0.1667,
+								"vertices": [ -4.34264, 39.78125, 5.6649, -2.42686, -8.39346, -22.52338, -2.66431, 5.08595, -19.28093, 3.98568, -11.21397, 10.2879, 4.56749, 4.1329, -19.50706, -2.28786, 11.35747, 4.55941, 9.04341, -11.72194, 2.15381, 5.14344, -12.82158, 16.08209, -23.19814, 1.81836 ]
+							},
+							{
+								"time": 0.2,
+								"vertices": [ -3.95581, 36.12203, 37.20779, -0.87419, 21.29579, -15.76854, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -12.2858, 3.25454, -12.75876, 3.71516, 9.67891, 15.48546 ]
+							},
+							{
+								"time": 0.2333,
+								"vertices": [ -11.9371, 26.01078, 2.91821, -0.27533, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 7.70584, -0.7169, -6.69733, -2.62048, 17.91826, 7.77333, -4.30551, -6.01406, -12.75876, 3.71516, -5.10017, 17.59191 ]
+							},
+							{
+								"time": 0.2667,
+								"vertices": [ 0.5959, 23.58176, 20.74303, 0.93943, 7.69899, -17.45375, -2.02438, 6.16526, -5.92201, 4.19709, -1.39027, 9.92793, 20.51733, 2.52203, 13.35544, 2.64274, 24.32408, -1.94308, 8.50604, -20.99353, 13.14276, 5.73959, 6.31876, 19.2114, 16.98909, 0.80981 ]
+							}
+						]
+					}
+				}
+			}
+		},
+		"drawOrder": [
+			{
+				"time": 0.3,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 24 },
+					{ "slot": "smoke-puff1-bg8", "offset": 19 },
+					{ "slot": "smoke-puff1-bg9", "offset": 22 },
+					{ "slot": "smoke-puff1-bg3", "offset": 17 },
+					{ "slot": "smoke-puff1-fg17", "offset": 13 },
+					{ "slot": "smoke-puff1-fg2", "offset": 2 },
+					{ "slot": "smoke-puff1-fg5", "offset": 8 },
+					{ "slot": "smoke-puff1-fg6", "offset": 4 },
+					{ "slot": "smoke-puff1-fg7", "offset": -4 },
+					{ "slot": "smoke-puff1-fg4", "offset": -4 }
+				]
+			},
+			{
+				"time": 0.3333,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 8 },
+					{ "slot": "smoke-puff1-bg8", "offset": 5 },
+					{ "slot": "smoke-puff1-bg9", "offset": 3 },
+					{ "slot": "smoke-puff1-fg", "offset": 24 },
+					{ "slot": "smoke-puff1-fg5", "offset": -14 },
+					{ "slot": "smoke-puff1-fg6", "offset": -21 },
+					{ "slot": "smoke-puff1-fg7", "offset": -19 },
+					{ "slot": "smoke-puff1-fg10", "offset": -21 }
+				]
+			},
+			{
+				"time": 0.3667,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 7 },
+					{ "slot": "smoke-puff1-bg9", "offset": 4 },
+					{ "slot": "smoke-puff1-fg", "offset": 24 },
+					{ "slot": "smoke-puff1-fg2", "offset": 5 },
+					{ "slot": "smoke-puff1-fg6", "offset": -22 },
+					{ "slot": "smoke-puff1-fg7", "offset": -18 },
+					{ "slot": "smoke-puff1-fg10", "offset": -20 }
+				]
+			},
+			{
+				"time": 0.4,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 5 },
+					{ "slot": "smoke-puff1-bg4", "offset": 0 },
+					{ "slot": "smoke-puff1-fg", "offset": 24 },
+					{ "slot": "smoke-puff1-fg2", "offset": 5 },
+					{ "slot": "smoke-puff1-fg6", "offset": -21 },
+					{ "slot": "smoke-puff1-fg7", "offset": -18 },
+					{ "slot": "smoke-puff1-fg10", "offset": -22 }
+				]
+			},
+			{
+				"time": 0.4333,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 4 },
+					{ "slot": "smoke-puff1-bg9", "offset": 4 },
+					{ "slot": "smoke-puff1-fg", "offset": 24 },
+					{ "slot": "smoke-puff1-fg2", "offset": 5 },
+					{ "slot": "smoke-puff1-fg6", "offset": -17 },
+					{ "slot": "smoke-puff1-fg7", "offset": -19 },
+					{ "slot": "smoke-puff1-fg10", "offset": -23 }
+				]
+			},
+			{
+				"time": 0.5333,
+				"offsets": [
+					{ "slot": "smoke-puff1-bg2", "offset": 9 },
+					{ "slot": "smoke-puff1-bg12", "offset": 0 },
+					{ "slot": "smoke-puff1-fg", "offset": 24 },
+					{ "slot": "smoke-puff1-fg2", "offset": 6 },
+					{ "slot": "smoke-puff1-fg6", "offset": -20 },
+					{ "slot": "smoke-puff1-fg7", "offset": -19 },
+					{ "slot": "smoke-puff1-fg10", "offset": -23 },
+					{ "slot": "smoke-puff1-fg4", "offset": -5 }
+				]
+			}
+		]
+	}
+}
+}

+ 56 - 0
spine-monogame/spine-monogame-example/data/tank.atlas

@@ -0,0 +1,56 @@
+tank.png
+	size: 1024, 1024
+	filter: Linear, Linear
+	scale: 0.5
+antenna
+	bounds: 2, 712, 11, 152
+	rotate: 90
+cannon
+	bounds: 222, 694, 466, 29
+cannon-connector
+	bounds: 82, 654, 56, 68
+	rotate: 90
+ground
+	bounds: 2, 175, 512, 177
+guntower
+	bounds: 647, 347, 365, 145
+machinegun
+	bounds: 690, 694, 166, 29
+machinegun-mount
+	bounds: 858, 687, 36, 48
+	rotate: 90
+rock
+	bounds: 664, 607, 290, 64
+smoke-glow
+	bounds: 946, 673, 50, 50
+smoke-puff01-bg
+	bounds: 312, 630, 92, 62
+smoke-puff01-fg
+	bounds: 222, 633, 88, 59
+smoke-puff02-fg
+	bounds: 406, 630, 92, 62
+smoke-puff03-fg
+	bounds: 500, 630, 92, 62
+smoke-puff04-fg
+	bounds: 2, 662, 78, 48
+tank-bottom
+	bounds: 2, 354, 643, 138
+tank-bottom-shadow
+	bounds: 2, 2, 646, 171
+tank-top
+	bounds: 195, 494, 704, 111
+tread
+	bounds: 172, 708, 48, 15
+tread-inside
+	bounds: 156, 710, 13, 14
+	rotate: 90
+wheel-big
+	bounds: 97, 540, 96, 96
+wheel-big-overlay
+	bounds: 2, 559, 93, 93
+wheel-mid
+	bounds: 594, 624, 68, 68
+wheel-mid-overlay
+	bounds: 152, 638, 68, 68
+wheel-small
+	bounds: 908, 687, 36, 36

BIN
spine-monogame/spine-monogame-example/data/tank.png


+ 58 - 0
spine-monogame/spine-monogame-example/spine-monogame-example.csproj

@@ -0,0 +1,58 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <OutputType>WinExe</OutputType>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
+    <PublishReadyToRun>false</PublishReadyToRun>
+    <TieredCompilation>false</TieredCompilation>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
+    <ApplicationIcon>Icon.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <None Remove="Icon.ico" />
+    <None Remove="Icon.bmp" />
+    <None Remove="Content\skeletons\coin-pro.json" />
+    <None Remove="Content\skeletons\coin-pro.skel" />
+    <None Remove="Content\skeletons\coin.atlas" />
+    <None Remove="Content\skeletons\coin.png" />
+    <None Remove="Content\skeletons\mix-and-match-pro.json" />
+    <None Remove="Content\skeletons\mix-and-match.atlas" />
+    <None Remove="Content\skeletons\mix-and-match.png" />
+    <None Remove="Content\skeletons\raptor_normals.png" />
+    <None Remove="Content\skeletons\raptor-pro.json" />
+    <None Remove="Content\skeletons\raptor.atlas" />
+    <None Remove="Content\skeletons\raptor.png" />
+    <None Remove="Content\skeletons\spineboy-pro.skel" />
+    <None Remove="Content\skeletons\spineboy.atlas" />
+    <None Remove="Content\skeletons\spineboy.png" />
+    <None Remove="Content\skeletons\tank-pro.json" />
+    <None Remove="Content\skeletons\tank.atlas" />
+    <None Remove="Content\skeletons\tank.png" />
+    <None Remove="Content\shaders\SpineEffect.fx" />
+    <None Remove="Content\shaders\SpineEffectOutline.fx" />
+    <None Remove="Content\shaders\SpineEffectNormalmap.fx" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Icon.ico" />
+    <EmbeddedResource Include="Icon.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <MonoGameContentReference Include="Content\Content.mgcb" />
+  </ItemGroup>
+  <ItemGroup>
+    <TrimmerRootAssembly Include="Microsoft.Xna.Framework.Content.ContentTypeReader" Visible="false" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.0.1641" />
+    <PackageReference Include="MonoGame.Content.Builder.Task" Version="3.8.0.1641" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\spine-monogame\spine-monogame.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Content\shaders\SpineEffect.fx" />
+    <Content Include="Content\shaders\SpineEffectOutline.fx" />
+    <Content Include="Content\shaders\SpineEffectNormalmap.fx" />
+  </ItemGroup>
+</Project>

+ 31 - 0
spine-monogame/spine-monogame.sln

@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.810.17
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spine-monogame-example", "spine-monogame-example\spine-monogame-example.csproj", "{B6A0B6D0-1186-46A6-89C5-4CD15CA6C18D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "spine-monogame", "spine-monogame\spine-monogame.csproj", "{82271611-1E77-4E5F-B78A-18F8CDBFDF84}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{B6A0B6D0-1186-46A6-89C5-4CD15CA6C18D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B6A0B6D0-1186-46A6-89C5-4CD15CA6C18D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B6A0B6D0-1186-46A6-89C5-4CD15CA6C18D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B6A0B6D0-1186-46A6-89C5-4CD15CA6C18D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{82271611-1E77-4E5F-B78A-18F8CDBFDF84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{82271611-1E77-4E5F-B78A-18F8CDBFDF84}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{82271611-1E77-4E5F-B78A-18F8CDBFDF84}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{82271611-1E77-4E5F-B78A-18F8CDBFDF84}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {1D10CEBB-7A36-4BCD-A598-BF9A61769961}
+	EndGlobalSection
+EndGlobal

+ 0 - 6
spine-monogame/example/Content/Content.mgcb → spine-monogame/spine-monogame/Content/Content.mgcb

@@ -13,9 +13,3 @@
 
 #---------------------------------- Content ---------------------------------#
 
-#begin SpineEffect.fx
-/importer:EffectImporter
-/processor:EffectProcessor
-/processorParam:DebugMode=Auto
-/build:SpineEffect.fx
-

+ 318 - 0
spine-monogame/spine-monogame/spine-monogame.csproj

@@ -0,0 +1,318 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+  </PropertyGroup>
+  <ItemGroup>
+    <PackageReference Include="MonoGame.Framework.DesktopGL" Version="3.8.0.1641">
+      <PrivateAssets>All</PrivateAssets>
+    </PackageReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Remove="spine-csharp\" />
+    <None Remove="spine-csharp\Attachments\" />
+    <None Remove="src\" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="spine-csharp\" />
+    <Folder Include="spine-csharp\Attachments\" />
+    <Folder Include="src\" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\spine-csharp\src\Animation.cs">
+      <Link>spine-csharp\Animation.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\AnimationState.cs">
+      <Link>spine-csharp\AnimationState.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\AnimationStateData.cs">
+      <Link>spine-csharp\AnimationStateData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Atlas.cs">
+      <Link>spine-csharp\Atlas.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\BlendMode.cs">
+      <Link>spine-csharp\BlendMode.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Bone.cs">
+      <Link>spine-csharp\Bone.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\BoneData.cs">
+      <Link>spine-csharp\BoneData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\ConstraintData.cs">
+      <Link>spine-csharp\ConstraintData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Event.cs">
+      <Link>spine-csharp\Event.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\EventData.cs">
+      <Link>spine-csharp\EventData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\ExposedList.cs">
+      <Link>spine-csharp\ExposedList.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\IkConstraint.cs">
+      <Link>spine-csharp\IkConstraint.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\IkConstraintData.cs">
+      <Link>spine-csharp\IkConstraintData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\IUpdatable.cs">
+      <Link>spine-csharp\IUpdatable.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Json.cs">
+      <Link>spine-csharp\Json.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\MathUtils.cs">
+      <Link>spine-csharp\MathUtils.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\PathConstraint.cs">
+      <Link>spine-csharp\PathConstraint.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\PathConstraintData.cs">
+      <Link>spine-csharp\PathConstraintData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Skeleton.cs">
+      <Link>spine-csharp\Skeleton.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonBinary.cs">
+      <Link>spine-csharp\SkeletonBinary.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonBounds.cs">
+      <Link>spine-csharp\SkeletonBounds.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonClipping.cs">
+      <Link>spine-csharp\SkeletonClipping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonData.cs">
+      <Link>spine-csharp\SkeletonData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonJson.cs">
+      <Link>spine-csharp\SkeletonJson.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SkeletonLoader.cs">
+      <Link>spine-csharp\SkeletonLoader.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Skin.cs">
+      <Link>spine-csharp\Skin.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Slot.cs">
+      <Link>spine-csharp\Slot.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SlotData.cs">
+      <Link>spine-csharp\SlotData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SpringConstraint.cs">
+      <Link>spine-csharp\SpringConstraint.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\SpringConstraintData.cs">
+      <Link>spine-csharp\SpringConstraintData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\TextureRegion.cs">
+      <Link>spine-csharp\TextureRegion.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\TransformConstraint.cs">
+      <Link>spine-csharp\TransformConstraint.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\TransformConstraintData.cs">
+      <Link>spine-csharp\TransformConstraintData.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Triangulator.cs">
+      <Link>spine-csharp\Triangulator.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\AtlasAttachmentLoader.cs">
+      <Link>spine-csharp\Attachments\AtlasAttachmentLoader.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\Attachment.cs">
+      <Link>spine-csharp\Attachments\Attachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\AttachmentLoader.cs">
+      <Link>spine-csharp\Attachments\AttachmentLoader.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\AttachmentType.cs">
+      <Link>spine-csharp\Attachments\AttachmentType.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\BoundingBoxAttachment.cs">
+      <Link>spine-csharp\Attachments\BoundingBoxAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\ClippingAttachment.cs">
+      <Link>spine-csharp\Attachments\ClippingAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\IHasTextureRegion.cs">
+      <Link>spine-csharp\Attachments\IHasTextureRegion.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\MeshAttachment.cs">
+      <Link>spine-csharp\Attachments\MeshAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\PathAttachment.cs">
+      <Link>spine-csharp\Attachments\PathAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\PointAttachment.cs">
+      <Link>spine-csharp\Attachments\PointAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\RegionAttachment.cs">
+      <Link>spine-csharp\Attachments\RegionAttachment.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\Sequence.cs">
+      <Link>spine-csharp\Attachments\Sequence.cs</Link>
+    </Compile>
+    <Compile Include="..\..\spine-csharp\src\Attachments\VertexAttachment.cs">
+      <Link>spine-csharp\Attachments\VertexAttachment.cs</Link>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\spine-csharp\src\Animation.cs.meta">
+      <Link>spine-csharp\Animation.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\AnimationState.cs.meta">
+      <Link>spine-csharp\AnimationState.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\AnimationStateData.cs.meta">
+      <Link>spine-csharp\AnimationStateData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Atlas.cs.meta">
+      <Link>spine-csharp\Atlas.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments.meta">
+      <Link>spine-csharp\Attachments.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\BlendMode.cs.meta">
+      <Link>spine-csharp\BlendMode.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Bone.cs.meta">
+      <Link>spine-csharp\Bone.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\BoneData.cs.meta">
+      <Link>spine-csharp\BoneData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\ConstraintData.cs.meta">
+      <Link>spine-csharp\ConstraintData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Event.cs.meta">
+      <Link>spine-csharp\Event.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\EventData.cs.meta">
+      <Link>spine-csharp\EventData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\ExposedList.cs.meta">
+      <Link>spine-csharp\ExposedList.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\IkConstraint.cs.meta">
+      <Link>spine-csharp\IkConstraint.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\IkConstraintData.cs.meta">
+      <Link>spine-csharp\IkConstraintData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\IUpdatable.cs.meta">
+      <Link>spine-csharp\IUpdatable.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Json.cs.meta">
+      <Link>spine-csharp\Json.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\MathUtils.cs.meta">
+      <Link>spine-csharp\MathUtils.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\package.json">
+      <Link>spine-csharp\package.json</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\package.json.meta">
+      <Link>spine-csharp\package.json.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\PathConstraint.cs.meta">
+      <Link>spine-csharp\PathConstraint.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\PathConstraintData.cs.meta">
+      <Link>spine-csharp\PathConstraintData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Skeleton.cs.meta">
+      <Link>spine-csharp\Skeleton.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonBinary.cs.meta">
+      <Link>spine-csharp\SkeletonBinary.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonBounds.cs.meta">
+      <Link>spine-csharp\SkeletonBounds.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonClipping.cs.meta">
+      <Link>spine-csharp\SkeletonClipping.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonData.cs.meta">
+      <Link>spine-csharp\SkeletonData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonJson.cs.meta">
+      <Link>spine-csharp\SkeletonJson.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SkeletonLoader.cs.meta">
+      <Link>spine-csharp\SkeletonLoader.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Skin.cs.meta">
+      <Link>spine-csharp\Skin.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Slot.cs.meta">
+      <Link>spine-csharp\Slot.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SlotData.cs.meta">
+      <Link>spine-csharp\SlotData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\spine-csharp.asmdef">
+      <Link>spine-csharp\spine-csharp.asmdef</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\spine-csharp.asmdef.meta">
+      <Link>spine-csharp\spine-csharp.asmdef.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SpringConstraint.cs.meta">
+      <Link>spine-csharp\SpringConstraint.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\SpringConstraintData.cs.meta">
+      <Link>spine-csharp\SpringConstraintData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\TransformConstraint.cs.meta">
+      <Link>spine-csharp\TransformConstraint.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\TransformConstraintData.cs.meta">
+      <Link>spine-csharp\TransformConstraintData.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Triangulator.cs.meta">
+      <Link>spine-csharp\Triangulator.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\AtlasAttachmentLoader.cs.meta">
+      <Link>spine-csharp\Attachments\AtlasAttachmentLoader.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\Attachment.cs.meta">
+      <Link>spine-csharp\Attachments\Attachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\AttachmentLoader.cs.meta">
+      <Link>spine-csharp\Attachments\AttachmentLoader.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\AttachmentType.cs.meta">
+      <Link>spine-csharp\Attachments\AttachmentType.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\BoundingBoxAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\BoundingBoxAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\ClippingAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\ClippingAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\IHasTextureRegion.cs.meta">
+      <Link>spine-csharp\Attachments\IHasTextureRegion.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\MeshAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\MeshAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\PathAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\PathAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\PointAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\PointAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\RegionAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\RegionAttachment.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\Sequence.cs.meta">
+      <Link>spine-csharp\Attachments\Sequence.cs.meta</Link>
+    </None>
+    <None Include="..\..\spine-csharp\src\Attachments\VertexAttachment.cs.meta">
+      <Link>spine-csharp\Attachments\VertexAttachment.cs.meta</Link>
+    </None>
+  </ItemGroup>
+</Project>

+ 195 - 0
spine-monogame/spine-monogame/src/MeshBatcher.cs

@@ -0,0 +1,195 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+
+namespace Spine {
+	public struct VertexPositionColorTextureColor : IVertexType {
+		public Vector3 Position;
+		public Color Color;
+		public Vector2 TextureCoordinate;
+		public Color Color2;
+
+		public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
+		(
+			new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
+			new VertexElement(12, VertexElementFormat.Color, VertexElementUsage.Color, 0),
+			new VertexElement(16, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0),
+			new VertexElement(24, VertexElementFormat.Color, VertexElementUsage.Color, 1)
+		);
+
+		VertexDeclaration IVertexType.VertexDeclaration {
+			get { return VertexDeclaration; }
+		}
+	}
+
+	// #region License
+	// /*
+	// Microsoft Public License (Ms-PL)
+	// MonoGame - Copyright � 2009 The MonoGame Team
+	//
+	// All rights reserved.
+	//
+	// This license governs use of the accompanying software. If you use the software, you accept this license. If you do not
+	// accept the license, do not use the software.
+	//
+	// 1. Definitions
+	// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under
+	// U.S. copyright law.
+	//
+	// A "contribution" is the original software, or any additions or changes to the software.
+	// A "contributor" is any person that distributes its contribution under this license.
+	// "Licensed patents" are a contributor's patent claims that read directly on its contribution.
+	//
+	// 2. Grant of Rights
+	// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3,
+	// each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+	// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3,
+	// each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+	//
+	// 3. Conditions and Limitations
+	// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
+	// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software,
+	// your patent license from such contributor to the software ends automatically.
+	// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution
+	// notices that are present in the software.
+	// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including
+	// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object
+	// code form, you may only do so under a license that complies with this license.
+	// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees
+	// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent
+	// permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular
+	// purpose and non-infringement.
+	// */
+	// #endregion License
+	//
+
+	/// <summary>Draws batched meshes.</summary>
+	public class MeshBatcher {
+		private readonly List<MeshItem> items;
+		private readonly Queue<MeshItem> freeItems;
+		private VertexPositionColorTextureColor[] vertexArray = { };
+		private short[] triangles = { };
+
+		public MeshBatcher () {
+			items = new List<MeshItem>(256);
+			freeItems = new Queue<MeshItem>(256);
+			EnsureCapacity(256, 512);
+		}
+
+		/// <summary>Returns a pooled MeshItem.</summary>
+		public MeshItem NextItem (int vertexCount, int triangleCount) {
+			MeshItem item = freeItems.Count > 0 ? freeItems.Dequeue() : new MeshItem();
+			if (item.vertices.Length < vertexCount) item.vertices = new VertexPositionColorTextureColor[vertexCount];
+			if (item.triangles.Length < triangleCount) item.triangles = new int[triangleCount];
+			item.vertexCount = vertexCount;
+			item.triangleCount = triangleCount;
+			items.Add(item);
+			return item;
+		}
+
+		private void EnsureCapacity (int vertexCount, int triangleCount) {
+			if (vertexArray.Length < vertexCount) vertexArray = new VertexPositionColorTextureColor[vertexCount];
+			if (triangles.Length < triangleCount) triangles = new short[triangleCount];
+		}
+
+		public void Draw (GraphicsDevice device) {
+			if (items.Count == 0) return;
+
+			int itemCount = items.Count;
+			int vertexCount = 0, triangleCount = 0;
+			for (int i = 0; i < itemCount; i++) {
+				MeshItem item = items[i];
+				vertexCount += item.vertexCount;
+				triangleCount += item.triangleCount;
+			}
+			EnsureCapacity(vertexCount, triangleCount);
+
+			vertexCount = 0;
+			triangleCount = 0;
+			Texture2D lastTexture = null;
+			for (int i = 0; i < itemCount; i++) {
+				MeshItem item = items[i];
+				int itemVertexCount = item.vertexCount;
+
+				if (item.texture != lastTexture || vertexCount + itemVertexCount > short.MaxValue) {
+					FlushVertexArray(device, vertexCount, triangleCount);
+					vertexCount = 0;
+					triangleCount = 0;
+					lastTexture = item.texture;
+					device.Textures[0] = lastTexture;
+					if (item.textureLayers != null) {
+						for (int layer = 1; layer < item.textureLayers.Length; ++layer)
+							device.Textures[layer] = item.textureLayers[layer];
+					}
+				}
+
+				int[] itemTriangles = item.triangles;
+				int itemTriangleCount = item.triangleCount;
+				for (int ii = 0, t = triangleCount; ii < itemTriangleCount; ii++, t++)
+					triangles[t] = (short)(itemTriangles[ii] + vertexCount);
+				triangleCount += itemTriangleCount;
+
+				Array.Copy(item.vertices, 0, vertexArray, vertexCount, itemVertexCount);
+				vertexCount += itemVertexCount;
+			}
+			FlushVertexArray(device, vertexCount, triangleCount);
+		}
+
+		public void AfterLastDrawPass () {
+			int itemCount = items.Count;
+			for (int i = 0; i < itemCount; i++) {
+				var item = items[i];
+				item.texture = null;
+				freeItems.Enqueue(item);
+			}
+			items.Clear();
+		}
+
+		private void FlushVertexArray (GraphicsDevice device, int vertexCount, int triangleCount) {
+			if (vertexCount == 0) return;
+			device.DrawUserIndexedPrimitives(
+				PrimitiveType.TriangleList,
+				vertexArray, 0, vertexCount,
+				triangles, 0, triangleCount / 3,
+				VertexPositionColorTextureColor.VertexDeclaration);
+		}
+	}
+
+	public class MeshItem {
+		public Texture2D texture = null;
+		public Texture2D[] textureLayers = null;
+		public int vertexCount, triangleCount;
+		public VertexPositionColorTextureColor[] vertices = { };
+		public int[] triangles = { };
+	}
+}

+ 165 - 0
spine-monogame/spine-monogame/src/ShapeRenderer.cs

@@ -0,0 +1,165 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Spine {
+	/// <summary>
+	/// Batch drawing of lines and shapes that can be derived from lines.
+	///
+	/// Call drawing methods in between Begin()/End()
+	/// </summary>
+	public class ShapeRenderer {
+		GraphicsDevice device;
+		List<VertexPositionColor> vertices = new List<VertexPositionColor>();
+		Color color = Color.White;
+		BasicEffect effect;
+		public BasicEffect Effect { get { return effect; } set { effect = value; } }
+
+		public ShapeRenderer (GraphicsDevice device) {
+			this.device = device;
+			this.effect = new BasicEffect(device);
+			effect.World = Matrix.Identity;
+			effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up);
+			effect.TextureEnabled = false;
+			effect.VertexColorEnabled = true;
+		}
+
+		public void SetColor (Color color) {
+			this.color = color;
+		}
+
+		public void Begin () {
+			device.RasterizerState = new RasterizerState();
+			device.BlendState = BlendState.AlphaBlend;
+		}
+
+		public void Line (float x1, float y1, float x2, float y2) {
+			vertices.Add(new VertexPositionColor(new Vector3(x1, y1, 0), color));
+			vertices.Add(new VertexPositionColor(new Vector3(x2, y2, 0), color));
+		}
+
+		/** Calls {@link #circle(float, float, float, int)} by estimating the number of segments needed for a smooth circle. */
+		public void Circle (float x, float y, float radius) {
+			Circle(x, y, radius, Math.Max(1, (int)(6 * (float)Math.Pow(radius, 1.0f / 3.0f))));
+		}
+
+		/** Draws a circle using {@link ShapeType#Line} or {@link ShapeType#Filled}. */
+		public void Circle (float x, float y, float radius, int segments) {
+			if (segments <= 0) throw new ArgumentException("segments must be > 0.");
+			float angle = 2 * MathUtils.PI / segments;
+			float cos = MathUtils.Cos(angle);
+			float sin = MathUtils.Sin(angle);
+			float cx = radius, cy = 0;
+			float temp = 0;
+
+			for (int i = 0; i < segments; i++) {
+				vertices.Add(new VertexPositionColor(new Vector3(x + cx, y + cy, 0), color));
+				temp = cx;
+				cx = cos * cx - sin * cy;
+				cy = sin * temp + cos * cy;
+				vertices.Add(new VertexPositionColor(new Vector3(x + cx, y + cy, 0), color));
+			}
+			vertices.Add(new VertexPositionColor(new Vector3(x + cx, y + cy, 0), color));
+
+			temp = cx;
+			cx = radius;
+			cy = 0;
+			vertices.Add(new VertexPositionColor(new Vector3(x + cx, y + cy, 0), color));
+		}
+
+		public void Triangle (float x1, float y1, float x2, float y2, float x3, float y3) {
+			vertices.Add(new VertexPositionColor(new Vector3(x1, y1, 0), color));
+			vertices.Add(new VertexPositionColor(new Vector3(x2, y2, 0), color));
+
+			vertices.Add(new VertexPositionColor(new Vector3(x2, y2, 0), color));
+			vertices.Add(new VertexPositionColor(new Vector3(x3, y3, 0), color));
+
+			vertices.Add(new VertexPositionColor(new Vector3(x3, y3, 0), color));
+			vertices.Add(new VertexPositionColor(new Vector3(x1, y1, 0), color));
+		}
+
+		public void X (float x, float y, float len) {
+			Line(x + len, y + len, x - len, y - len);
+			Line(x - len, y + len, x + len, y - len);
+		}
+
+		public void Polygon (float[] polygonVertices, int offset, int count) {
+			if (count < 3) throw new ArgumentException("Polygon must contain at least 3 vertices");
+
+			offset <<= 1;
+
+			var firstX = polygonVertices[offset];
+			var firstY = polygonVertices[offset + 1];
+			var last = offset + count;
+
+			for (int i = offset, n = offset + count; i < n; i += 2) {
+				var x1 = polygonVertices[i];
+				var y1 = polygonVertices[i + 1];
+
+				var x2 = 0f;
+				var y2 = 0f;
+
+				if (i + 2 >= last) {
+					x2 = firstX;
+					y2 = firstY;
+				} else {
+					x2 = polygonVertices[i + 2];
+					y2 = polygonVertices[i + 3];
+				}
+
+				Line(x1, y1, x2, y2);
+			}
+		}
+
+		public void Rect (float x, float y, float width, float height) {
+			Line(x, y, x + width, y);
+			Line(x + width, y, x + width, y + height);
+			Line(x + width, y + height, x, y + height);
+			Line(x, y + height, x, y);
+		}
+
+		public void End () {
+			if (vertices.Count == 0) return;
+			var verticesArray = vertices.ToArray();
+
+			foreach (EffectPass pass in effect.CurrentTechnique.Passes) {
+				pass.Apply();
+				device.DrawUserPrimitives(PrimitiveType.LineList, verticesArray, 0, verticesArray.Length / 2);
+			}
+
+			vertices.Clear();
+		}
+	}
+}

+ 228 - 0
spine-monogame/spine-monogame/src/SkeletonDebugRenderer.cs

@@ -0,0 +1,228 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Spine {
+	public class SkeletonDebugRenderer {
+		ShapeRenderer renderer;
+
+		public static Color boneLineColor = new Color(1f, 0f, 0f, 1f);
+		public static Color boneOriginColor = new Color(0f, 1f, 0f, 1f);
+		public static Color attachmentLineColor = new Color(0f, 0f, 1f, 0.5f);
+		public static Color triangleLineColor = new Color(1f, 0.64f, 0f, 0.5f);
+		public static Color pathColor = new Color(1f, 0.5f, 0f, 1f);
+		public static Color clipColor = new Color(0.8f, 0f, 0f, 1f);
+		public static Color clipDecomposedColor = new Color(0.8f, 0.8f, 0f, 1f);
+		public static Color aabbColor = new Color(0f, 1f, 0f, 0.5f);
+
+		public BasicEffect Effect { get { return renderer.Effect; } set { renderer.Effect = value; } }
+		public bool DrawBones { get; set; }
+		public bool DrawRegionAttachments { get; set; }
+		public bool DrawBoundingBoxes { get; set; }
+		public bool DrawMeshHull { get; set; }
+		public bool DrawMeshTriangles { get; set; }
+		public bool DrawPaths { get; set; }
+		public bool DrawClipping { get; set; }
+		public bool DrawClippingDecomposed { get; set; }
+		public bool DrawSkeletonXY { get; set; }
+		public void DisableAll () {
+			DrawBones = false;
+			DrawRegionAttachments = false;
+			DrawBoundingBoxes = false;
+			DrawMeshHull = false;
+			DrawMeshTriangles = false;
+			DrawPaths = false;
+			DrawClipping = false;
+			DrawSkeletonXY = false;
+		}
+
+		public void EnableAll () {
+			DrawBones = true;
+			DrawRegionAttachments = true;
+			DrawBoundingBoxes = true;
+			DrawMeshHull = true;
+			DrawMeshTriangles = true;
+			DrawPaths = true;
+			DrawClipping = true;
+			DrawSkeletonXY = true;
+		}
+
+		private float[] vertices = new float[1024 * 2];
+		private SkeletonBounds bounds = new SkeletonBounds();
+		private Triangulator triangulator = new Triangulator();
+
+		public SkeletonDebugRenderer (GraphicsDevice device) {
+			renderer = new ShapeRenderer(device);
+			EnableAll();
+		}
+
+		public void Begin () {
+			renderer.Begin();
+		}
+
+		public void Draw (Skeleton skeleton) {
+			var skeletonX = skeleton.X;
+			var skeletonY = skeleton.Y;
+
+			var bones = skeleton.Bones;
+			if (DrawBones) {
+				renderer.SetColor(boneLineColor);
+				for (int i = 0, n = bones.Count; i < n; i++) {
+					var bone = bones.Items[i];
+					if (bone.Parent == null) continue;
+					var x = bone.Data.Length * bone.A + bone.WorldX;
+					var y = bone.Data.Length * bone.C + bone.WorldY;
+					renderer.Line(bone.WorldX, bone.WorldY, x, y);
+				}
+				if (DrawSkeletonXY) renderer.X(skeletonX, skeletonY, 4);
+			}
+
+			if (DrawRegionAttachments) {
+				renderer.SetColor(attachmentLineColor);
+				var slots = skeleton.Slots;
+				for (int i = 0, n = slots.Count; i < n; i++) {
+					var slot = slots.Items[i];
+					var attachment = slot.Attachment;
+					if (attachment is RegionAttachment) {
+						var regionAttachment = (RegionAttachment)attachment;
+						var vertices = this.vertices;
+						regionAttachment.ComputeWorldVertices(slot, vertices, 0, 2);
+						renderer.Line(vertices[0], vertices[1], vertices[2], vertices[3]);
+						renderer.Line(vertices[2], vertices[3], vertices[4], vertices[5]);
+						renderer.Line(vertices[4], vertices[5], vertices[6], vertices[7]);
+						renderer.Line(vertices[6], vertices[7], vertices[0], vertices[1]);
+					}
+				}
+			}
+
+			if (DrawMeshHull || DrawMeshTriangles) {
+				var slots = skeleton.Slots;
+				for (int i = 0, n = slots.Count; i < n; i++) {
+					var slot = slots.Items[i];
+					var attachment = slot.Attachment;
+					if (!(attachment is MeshAttachment)) continue;
+					var mesh = (MeshAttachment)attachment;
+					var world = vertices = vertices.Length < mesh.WorldVerticesLength ? new float[mesh.WorldVerticesLength] : vertices;
+					mesh.ComputeWorldVertices(slot, 0, mesh.WorldVerticesLength, world, 0, 2);
+					int[] triangles = mesh.Triangles;
+					var hullLength = mesh.HullLength;
+					if (DrawMeshTriangles) {
+						renderer.SetColor(triangleLineColor);
+						for (int ii = 0, nn = triangles.Count(); ii < nn; ii += 3) {
+							int v1 = triangles[ii] * 2, v2 = triangles[ii + 1] * 2, v3 = triangles[ii + 2] * 2;
+							renderer.Triangle(world[v1], world[v1 + 1], //
+								world[v2], world[v2 + 1], //
+								world[v3], world[v3 + 1] //
+							);
+						}
+					}
+					if (DrawMeshHull && hullLength > 0) {
+						renderer.SetColor(attachmentLineColor);
+						hullLength = (hullLength >> 1) * 2;
+						float lastX = vertices[hullLength - 2], lastY = vertices[hullLength - 1];
+						for (int ii = 0, nn = hullLength; ii < nn; ii += 2) {
+							float x = vertices[ii], y = vertices[ii + 1];
+							renderer.Line(x, y, lastX, lastY);
+							lastX = x;
+							lastY = y;
+						}
+					}
+				}
+			}
+
+			if (DrawBoundingBoxes) {
+				var bounds = this.bounds;
+				bounds.Update(skeleton, true);
+				renderer.SetColor(aabbColor);
+				renderer.Rect(bounds.MinX, bounds.MinY, bounds.Width, bounds.Height);
+				var polygons = bounds.Polygons;
+				var boxes = bounds.BoundingBoxes;
+				for (int i = 0, n = polygons.Count; i < n; i++) {
+					var polygon = polygons.Items[i];
+					renderer.Polygon(polygon.Vertices, 0, polygon.Count);
+				}
+			}
+
+			if (DrawBones) {
+				renderer.SetColor(boneOriginColor);
+				for (int i = 0, n = bones.Count; i < n; i++) {
+					var bone = bones.Items[i];
+					renderer.Circle(bone.WorldX, bone.WorldY, 3);
+				}
+			}
+
+			if (DrawClipping) {
+				var slots = skeleton.Slots;
+				renderer.SetColor(clipColor);
+				for (int i = 0, n = slots.Count; i < n; i++) {
+					var slot = slots.Items[i];
+					var attachment = slot.Attachment;
+					if (!(attachment is ClippingAttachment)) continue;
+					var clip = (ClippingAttachment)attachment;
+					var nn = clip.WorldVerticesLength;
+					var world = vertices = vertices.Length < nn ? new float[nn] : vertices;
+					clip.ComputeWorldVertices(slot, 0, nn, world, 0, 2);
+					ExposedList<float> clippingPolygon = new ExposedList<float>();
+					for (int ii = 0; ii < nn; ii += 2) {
+						var x = world[ii];
+						var y = world[ii + 1];
+						var x2 = world[(ii + 2) % nn];
+						var y2 = world[(ii + 3) % nn];
+						renderer.Line(x, y, x2, y2);
+						clippingPolygon.Add(x);
+						clippingPolygon.Add(y);
+					}
+
+					if (DrawClippingDecomposed) {
+						SkeletonClipping.MakeClockwise(clippingPolygon);
+						var triangles = triangulator.Triangulate(clippingPolygon);
+						var clippingPolygons = triangulator.Decompose(clippingPolygon, triangles);
+						renderer.SetColor(clipDecomposedColor);
+						foreach (var polygon in clippingPolygons) {
+							SkeletonClipping.MakeClockwise(polygon);
+							polygon.Add(polygon.Items[0]);
+							polygon.Add(polygon.Items[1]);
+							renderer.Polygon(polygon.Items, 0, polygon.Count >> 1);
+						}
+					}
+				}
+			}
+		}
+
+		public void End () {
+			renderer.End();
+		}
+	}
+}

+ 226 - 0
spine-monogame/spine-monogame/src/SkeletonRenderer.cs

@@ -0,0 +1,226 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.Collections.Generic;
+
+namespace Spine {
+	/// <summary>Draws region and mesh attachments.</summary>
+	public class SkeletonRenderer {
+		private const int TL = 0;
+		private const int TR = 1;
+		private const int BL = 2;
+		private const int BR = 3;
+
+		SkeletonClipping clipper = new SkeletonClipping();
+		GraphicsDevice device;
+		MeshBatcher batcher;
+		public MeshBatcher Batcher { get { return batcher; } }
+		RasterizerState rasterizerState;
+		float[] vertices = new float[8];
+		int[] quadTriangles = { 0, 1, 2, 2, 3, 0 };
+		BlendState defaultBlendState;
+
+		Effect effect;
+		public Effect Effect { get { return effect; } set { effect = value; } }
+		public IVertexEffect VertexEffect { get; set; }
+
+		private bool premultipliedAlpha;
+		public bool PremultipliedAlpha { get { return premultipliedAlpha; } set { premultipliedAlpha = value; } }
+
+		/// <summary>Attachments are rendered back to front in the x/y plane by the SkeletonRenderer.
+		/// Each attachment is offset by a customizable z-spacing value on the z-axis to avoid z-fighting
+		/// in shaders with ZWrite enabled. Typical values lie in the range [-0.1, 0].</summary>
+		private float zSpacing = 0.0f;
+		public float ZSpacing { get { return zSpacing; } set { zSpacing = value; } }
+
+		/// <summary>A Z position offset added at each vertex.</summary>
+		private float z = 0.0f;
+		public float Z { get { return z; } set { z = value; } }
+
+		public SkeletonRenderer (GraphicsDevice device) {
+			this.device = device;
+
+			batcher = new MeshBatcher();
+
+			var basicEffect = new BasicEffect(device);
+			basicEffect.World = Matrix.Identity;
+			basicEffect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up);
+			basicEffect.TextureEnabled = true;
+			basicEffect.VertexColorEnabled = true;
+			effect = basicEffect;
+
+			rasterizerState = new RasterizerState();
+			rasterizerState.CullMode = CullMode.None;
+
+			Bone.yDown = true;
+		}
+
+		public void Begin () {
+			defaultBlendState = premultipliedAlpha ? BlendState.AlphaBlend : BlendState.NonPremultiplied;
+
+			device.RasterizerState = rasterizerState;
+			device.BlendState = defaultBlendState;
+		}
+
+		public void End () {
+			foreach (EffectPass pass in effect.CurrentTechnique.Passes) {
+				pass.Apply();
+				batcher.Draw(device);
+			}
+			batcher.AfterLastDrawPass();
+		}
+
+		public void Draw (Skeleton skeleton) {
+			var drawOrder = skeleton.DrawOrder;
+			var drawOrderItems = skeleton.DrawOrder.Items;
+			float skeletonR = skeleton.R, skeletonG = skeleton.G, skeletonB = skeleton.B, skeletonA = skeleton.A;
+			Color color = new Color();
+
+			if (VertexEffect != null) VertexEffect.Begin(skeleton);
+
+			for (int i = 0, n = drawOrder.Count; i < n; i++) {
+				Slot slot = drawOrderItems[i];
+				Attachment attachment = slot.Attachment;
+				float attachmentZOffset = z + zSpacing * i;
+
+				float attachmentColorR, attachmentColorG, attachmentColorB, attachmentColorA;
+				object textureObject = null;
+				int verticesCount = 0;
+				float[] vertices = this.vertices;
+				int indicesCount = 0;
+				int[] indices = null;
+				float[] uvs = null;
+
+				if (attachment is RegionAttachment) {
+					RegionAttachment regionAttachment = (RegionAttachment)attachment;
+					attachmentColorR = regionAttachment.R; attachmentColorG = regionAttachment.G; attachmentColorB = regionAttachment.B; attachmentColorA = regionAttachment.A;
+					AtlasRegion region = (AtlasRegion)regionAttachment.Region;
+					textureObject = region.page.rendererObject;
+					verticesCount = 4;
+					regionAttachment.ComputeWorldVertices(slot, vertices, 0, 2);
+					indicesCount = 6;
+					indices = quadTriangles;
+					uvs = regionAttachment.UVs;
+				} else if (attachment is MeshAttachment) {
+					MeshAttachment mesh = (MeshAttachment)attachment;
+					attachmentColorR = mesh.R; attachmentColorG = mesh.G; attachmentColorB = mesh.B; attachmentColorA = mesh.A;
+					AtlasRegion region = (AtlasRegion)mesh.Region;
+					textureObject = region.page.rendererObject;
+					int vertexCount = mesh.WorldVerticesLength;
+					if (vertices.Length < vertexCount) vertices = new float[vertexCount];
+					verticesCount = vertexCount >> 1;
+					mesh.ComputeWorldVertices(slot, vertices);
+					indicesCount = mesh.Triangles.Length;
+					indices = mesh.Triangles;
+					uvs = mesh.UVs;
+				} else if (attachment is ClippingAttachment) {
+					ClippingAttachment clip = (ClippingAttachment)attachment;
+					clipper.ClipStart(slot, clip);
+					continue;
+				} else {
+					continue;
+				}
+
+				// set blend state
+				BlendState blend = slot.Data.BlendMode == BlendMode.Additive ? BlendState.Additive : defaultBlendState;
+				if (device.BlendState != blend) {
+					//End();
+					//device.BlendState = blend;
+				}
+
+				// calculate color
+				float a = skeletonA * slot.A * attachmentColorA;
+				if (premultipliedAlpha) {
+					color = new Color(
+							skeletonR * slot.R * attachmentColorR * a,
+							skeletonG * slot.G * attachmentColorG * a,
+							skeletonB * slot.B * attachmentColorB * a, a);
+				} else {
+					color = new Color(
+							skeletonR * slot.R * attachmentColorR,
+							skeletonG * slot.G * attachmentColorG,
+							skeletonB * slot.B * attachmentColorB, a);
+				}
+
+				Color darkColor = new Color();
+				if (slot.HasSecondColor) {
+					if (premultipliedAlpha) {
+						darkColor = new Color(slot.R2 * a, slot.G2 * a, slot.B2 * a);
+					} else {
+						darkColor = new Color(slot.R2 * a, slot.G2 * a, slot.B2 * a);
+					}
+				}
+				darkColor.A = premultipliedAlpha ? (byte)255 : (byte)0;
+
+				// clip
+				if (clipper.IsClipping) {
+					clipper.ClipTriangles(vertices, verticesCount << 1, indices, indicesCount, uvs);
+					vertices = clipper.ClippedVertices.Items;
+					verticesCount = clipper.ClippedVertices.Count >> 1;
+					indices = clipper.ClippedTriangles.Items;
+					indicesCount = clipper.ClippedTriangles.Count;
+					uvs = clipper.ClippedUVs.Items;
+				}
+
+				if (verticesCount == 0 || indicesCount == 0)
+					continue;
+
+				// submit to batch
+				MeshItem item = batcher.NextItem(verticesCount, indicesCount);
+				if (textureObject is Texture2D)
+					item.texture = (Texture2D)textureObject;
+				else {
+					item.textureLayers = (Texture2D[])textureObject;
+					item.texture = item.textureLayers[0];
+				}
+				for (int ii = 0, nn = indicesCount; ii < nn; ii++) {
+					item.triangles[ii] = indices[ii];
+				}
+				VertexPositionColorTextureColor[] itemVertices = item.vertices;
+				for (int ii = 0, v = 0, nn = verticesCount << 1; v < nn; ii++, v += 2) {
+					itemVertices[ii].Color = color;
+					itemVertices[ii].Color2 = darkColor;
+					itemVertices[ii].Position.X = vertices[v];
+					itemVertices[ii].Position.Y = vertices[v + 1];
+					itemVertices[ii].Position.Z = attachmentZOffset;
+					itemVertices[ii].TextureCoordinate.X = uvs[v];
+					itemVertices[ii].TextureCoordinate.Y = uvs[v + 1];
+					if (VertexEffect != null) VertexEffect.Transform(ref itemVertices[ii]);
+				}
+
+				clipper.ClipEnd(slot);
+			}
+			clipper.ClipEnd();
+			if (VertexEffect != null) VertexEffect.End();
+		}
+	}
+}

+ 46 - 32
spine-monogame/example/Properties/AssemblyInfo.cs → spine-monogame/spine-monogame/src/Util.cs

@@ -27,39 +27,53 @@
  * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.IO;
 
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("spine-monogame-example")]
-[assembly: AssemblyProduct("spine-monogame-example")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyCopyright("Copyright ©  2017")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
+#if WINDOWS_STOREAPP
+using System.Threading.Tasks;
+using Windows.Storage;
+#endif
 
-// Setting ComVisible to false makes the types in this assembly not visible 
-// to COM components.  If you need to access a type in this assembly from 
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
+namespace Spine {
 
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("f47bbbe2-ac55-4263-b224-1c8fcef4714b")]
+	static public class Util {
+#if WINDOWS_STOREAPP
+		private static async Task<Texture2D> LoadFile(GraphicsDevice device, String path) {
+			var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
+			var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false);
+			try {
+				return Util.LoadTexture(device, await file.OpenStreamForReadAsync().ConfigureAwait(false));
+			} catch (Exception ex) {
+				throw new Exception("Error reading texture file: " + path, ex);
+			}
+		}
 
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers 
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+		static public Texture2D LoadTexture (GraphicsDevice device, String path) {
+			return LoadFile(device, path).Result;
+		}
+#else
+		static public Texture2D LoadTexture (GraphicsDevice device, String path) {
+
+#if WINDOWS_PHONE
+			Stream stream = Microsoft.Xna.Framework.TitleContainer.OpenStream(path);
+			using (Stream input = stream) {
+#else
+			using (Stream input = new FileStream(path, FileMode.Open, FileAccess.Read)) {
+#endif
+				try {
+					return Util.LoadTexture(device, input);
+				} catch (Exception ex) {
+					throw new Exception("Error reading texture file: " + path, ex);
+				}
+			}
+		}
+#endif
+
+		static public Texture2D LoadTexture (GraphicsDevice device, Stream input) {
+			return Texture2D.FromStream(device, input);
+		}
+	}
+}

+ 97 - 0
spine-monogame/spine-monogame/src/VertexEffect.cs

@@ -0,0 +1,97 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Spine {
+	public interface IVertexEffect {
+		void Begin (Skeleton skeleton);
+		void Transform (ref VertexPositionColorTextureColor vertex);
+		void End ();
+	}
+
+	public class JitterEffect : IVertexEffect {
+		public float JitterX { get; set; }
+		public float JitterY { get; set; }
+
+		public JitterEffect (float jitterX, float jitterY) {
+			JitterX = jitterX;
+			JitterY = jitterY;
+		}
+
+		public void Begin (Skeleton skeleton) {
+		}
+
+		public void End () {
+		}
+
+		public void Transform (ref VertexPositionColorTextureColor vertex) {
+			vertex.Position.X += MathUtils.RandomTriangle(-JitterX, JitterY);
+			vertex.Position.Y += MathUtils.RandomTriangle(-JitterX, JitterY);
+		}
+	}
+
+	public class SwirlEffect : IVertexEffect {
+		private float worldX, worldY, angle;
+
+		public float Radius { get; set; }
+		public float Angle { get { return angle; } set { angle = value * MathUtils.DegRad; } }
+		public float CenterX { get; set; }
+		public float CenterY { get; set; }
+		public IInterpolation Interpolation { get; set; }
+
+		public SwirlEffect (float radius) {
+			Radius = radius;
+			Interpolation = IInterpolation.Pow2;
+		}
+
+		public void Begin (Skeleton skeleton) {
+			worldX = skeleton.X + CenterX;
+			worldY = skeleton.Y + CenterY;
+		}
+
+		public void End () {
+		}
+
+		public void Transform (ref VertexPositionColorTextureColor vertex) {
+			float x = vertex.Position.X - worldX;
+			float y = vertex.Position.Y - worldY;
+			float dist = (float)Math.Sqrt(x * x + y * y);
+			if (dist < Radius) {
+				float theta = Interpolation.Apply(0, angle, (Radius - dist) / Radius);
+				float cos = MathUtils.Cos(theta), sin = MathUtils.Sin(theta);
+				vertex.Position.X = cos * x - sin * y + worldX;
+				vertex.Position.Y = sin * x + cos * y + worldY;
+			}
+		}
+	}
+}

+ 93 - 0
spine-monogame/spine-monogame/src/XnaTextureLoader.cs

@@ -0,0 +1,93 @@
+/******************************************************************************
+ * Spine Runtimes License Agreement
+ * Last updated September 24, 2021. Replaces all prior versions.
+ *
+ * Copyright (c) 2013-2021, Esoteric Software LLC
+ *
+ * Integration of the Spine Runtimes into software or otherwise creating
+ * derivative works of the Spine Runtimes is permitted under the terms and
+ * conditions of Section 2 of the Spine Editor License Agreement:
+ * http://esotericsoftware.com/spine-editor-license
+ *
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
+ * "Products"), provided that each user of the Products must obtain their own
+ * Spine Editor license and redistribution of the Products in any form must
+ * include this license and copyright notice.
+ *
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "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 LLC BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) 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
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using System;
+using System.IO;
+
+namespace Spine {
+	public class XnaTextureLoader : TextureLoader {
+		GraphicsDevice device;
+		string[] textureLayerSuffixes = null;
+
+		/// <summary>
+		/// Constructor.
+		/// </summary>
+		/// <param name="device">The graphics device to be used.</param>
+		/// <param name="loadMultipleTextureLayers">If <c>true</c> multiple textures layers
+		/// (e.g. a diffuse/albedo texture and a normal map) are loaded instead of a single texture.
+		/// Names are constructed based on suffixes added according to the <c>textureSuffixes</c> parameter.</param>
+		/// <param name="textureSuffixes">If <c>loadMultipleTextureLayers</c> is <c>true</c>, the strings of this array
+		/// define the path name suffix of each layer to be loaded. Array size must be equal to the number of layers to be loaded.
+		/// The first array entry is the suffix to be <c>replaced</c> (e.g. "_albedo", or "" for a first layer without a suffix),
+		/// subsequent array entries contain the suffix to replace the first entry with (e.g. "_normals").
+		///
+		/// An example would be:
+		/// <code>new string[] { "", "_normals" }</code> for loading a base diffuse texture named "skeletonname.png" and
+		/// a normalmap named "skeletonname_normals.png".</param>
+		public XnaTextureLoader (GraphicsDevice device, bool loadMultipleTextureLayers = false, string[] textureSuffixes = null) {
+			this.device = device;
+			if (loadMultipleTextureLayers)
+				this.textureLayerSuffixes = textureSuffixes;
+		}
+
+		public void Load (AtlasPage page, String path) {
+			Texture2D texture = Util.LoadTexture(device, path);
+			page.width = texture.Width;
+			page.height = texture.Height;
+
+			if (textureLayerSuffixes == null) {
+				page.rendererObject = texture;
+			} else {
+				Texture2D[] textureLayersArray = new Texture2D[textureLayerSuffixes.Length];
+				textureLayersArray[0] = texture;
+				for (int layer = 1; layer < textureLayersArray.Length; ++layer) {
+					string layerPath = GetLayerName(path, textureLayerSuffixes[0], textureLayerSuffixes[layer]);
+					textureLayersArray[layer] = Util.LoadTexture(device, layerPath);
+				}
+				page.rendererObject = textureLayersArray;
+			}
+		}
+
+		public void Unload (Object texture) {
+			((Texture2D)texture).Dispose();
+		}
+
+		private string GetLayerName (string firstLayerPath, string firstLayerSuffix, string replacementSuffix) {
+
+			int suffixLocation = firstLayerPath.LastIndexOf(firstLayerSuffix + ".");
+			if (suffixLocation == -1) {
+				throw new Exception(string.Concat("Error composing texture layer name: first texture layer name '", firstLayerPath,
+								"' does not contain suffix to be replaced: '", firstLayerSuffix, "'"));
+			}
+			return firstLayerPath.Remove(suffixLocation, firstLayerSuffix.Length).Insert(suffixLocation, replacementSuffix);
+		}
+	}
+}

Some files were not shown because too many files changed in this diff