From e20428b02699226164fa73ba4b12f7d029ae6f4d Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 14 Mar 2018 11:59:58 +0100 Subject: [PATCH 1/7] [as3][starling] Extended SpineboyExample to show how to use bounding box world vertices. --- .../src/spine/examples/Shape.as | 76 +++++++++++++++++++ .../src/spine/examples/SpineboyExample.as | 29 ++++++- 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 spine-starling/spine-starling-example/src/spine/examples/Shape.as diff --git a/spine-starling/spine-starling-example/src/spine/examples/Shape.as b/spine-starling/spine-starling-example/src/spine/examples/Shape.as new file mode 100644 index 000000000..1bdef3c0d --- /dev/null +++ b/spine-starling/spine-starling-example/src/spine/examples/Shape.as @@ -0,0 +1,76 @@ +package spine.examples { + import starling.animation.IAnimatable; + import starling.textures.Texture; + import flash.display.BitmapData; + import flash.geom.Point; + import spine.starling.SkeletonMesh; + + import starling.display.DisplayObject; + import starling.rendering.IndexData; + import starling.rendering.Painter; + import starling.utils.Color; + + + public class Shape extends DisplayObject implements IAnimatable { + private var r: Number = 1, g: Number = 1, b: Number = 1, a: Number = 1; + private var mesh: SkeletonMesh; + private var vertices: Vector.; + + public function Shape() { + var bitmapData: BitmapData = new BitmapData(16, 16, false, 0xffffffff); + mesh = new SkeletonMesh(Texture.fromBitmapData(bitmapData)); + setVertices(new [0, 0, 100, 0, 100, 100, 0, 100]); + setColor(1, 0, 0, 1); + } + + public function setVertices(vertices: Vector.): void { + this.vertices = vertices; + } + + public function setColor(r: Number, g: Number, b: Number, a: Number): void { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + override public function render(painter : Painter) : void { + var indices: IndexData = mesh.getIndexData(); + var idx: int = 0; + var x:Number = vertices[0], y:Number = vertices[1]; + for (var i:int = 2; i < vertices.length - 2; i+=2) { + var x2:Number = vertices[i], y2:Number = vertices[i+1]; + var x3:Number = vertices[i+2], y3:Number = vertices[i+3]; + indices.setIndex(idx, idx); + indices.setIndex(idx+1, idx+1); + indices.setIndex(idx+2, idx+2); + mesh.setVertexPosition(idx, x, y); + mesh.setTexCoords(idx++, 0, 0); + mesh.setVertexPosition(idx, x2, y2); + mesh.setTexCoords(idx++, 0, 0); + mesh.setVertexPosition(idx, x3, y3); + mesh.setTexCoords(idx++, 0, 0); + } + indices.numIndices = idx; + indices.trim(); + mesh.getVertexData().numVertices = idx; + + var rgb: uint = Color.rgb(r * 255, g * 255, b * 255); + var alpha: uint = a * 255; + mesh.getVertexData().colorize("color", 0xffffffff, 0xff); + + mesh.setVertexDataChanged(); + mesh.setIndexDataChanged(); + + painter.batchMesh(mesh); + } + + public function advanceTime(time : Number) : void { + this.setRequiresRedraw(); + } + + override public function hitTest(localPoint : Point) : DisplayObject { + return null; + } + } +} \ No newline at end of file diff --git a/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as b/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as index dc2cbe8a4..189715f47 100644 --- a/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as +++ b/spine-starling/spine-starling-example/src/spine/examples/SpineboyExample.as @@ -29,6 +29,10 @@ *****************************************************************************/ package spine.examples { + import starling.display.Image; + import starling.textures.Texture; + import flash.display.BitmapData; + import spine.attachments.BoundingBoxAttachment; import spine.*; import spine.animation.AnimationStateData; import spine.animation.TrackEntry; @@ -54,7 +58,8 @@ package spine.examples { [Embed(source = "/spineboy.png")] static public const SpineboyAtlasTexture : Class; - private var skeleton : SkeletonAnimation; + private var skeleton : SkeletonAnimation; + private var shape: Shape; public function SpineboyExample() { var spineAtlas : Atlas = new Atlas(new SpineboyAtlas(), new StarlingTextureLoader(new SpineboyAtlasTexture())); @@ -71,6 +76,7 @@ package spine.examples { skeleton = new SkeletonAnimation(skeletonData, stateData); skeleton.x = 400; skeleton.y = 560; + skeleton.scale = 0.5; skeleton.state.onStart.add(function(entry : TrackEntry) : void { trace(entry.trackIndex + " start: " + entry.animation.name); @@ -97,10 +103,29 @@ package spine.examples { skeleton.state.addAnimationByName(0, "run", true, 0); addChild(skeleton); - Starling.juggler.add(skeleton); + Starling.juggler.add(skeleton); + + shape = new Shape(); + shape.setVertices(new [0, 0, 400, 600, 800, 0]); + shape.setColor(1, 0, 0, 1); + addChild(shape); + Starling.juggler.add(shape); + addEventListener(starling.events.Event.ENTER_FRAME, onUpdate); addEventListener(TouchEvent.TOUCH, onClick); } + + private function onUpdate() : void { + var slot:Slot = skeleton.skeleton.findSlot("head-bb"); + var bb:BoundingBoxAttachment = skeleton.skeleton.getAttachmentForSlotIndex(slot.data.index, "head") as BoundingBoxAttachment; + var worldVertices:Vector. = new Vector.(bb.worldVerticesLength); + bb.computeWorldVertices(slot, 0, bb.worldVerticesLength, worldVertices, 0, 2); + for (var i:int = 0; i < worldVertices.length; i+=2) { + worldVertices[i] = worldVertices[i] * skeleton.scale + skeleton.x; + worldVertices[i + 1] = worldVertices[i + 1] * skeleton.scale + skeleton.y; + } + shape.setVertices(worldVertices); + } private function onClick(event : TouchEvent) : void { var touch : Touch = event.getTouch(this); From 37e8f92867eaa4c584a17f8c779a9158f54cf2a0 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 14 Mar 2018 23:08:22 +0800 Subject: [PATCH 2/7] [unity] Fix DrawBoundingBox count checks. --- .../Assets/spine-unity/Editor/SpineEditorUtilities.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index e38546d0c..11b08bc9d 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -1839,7 +1839,7 @@ namespace Spine.Unity.Editor { } public static void DrawBoundingBox (Slot slot, BoundingBoxAttachment box, Transform t) { - if (box.Vertices.Length <= 0) return; // Handle cases where user creates a BoundingBoxAttachment but doesn't actually define it. + if (box.Vertices.Length <= 2) return; // Handle cases where user creates a BoundingBoxAttachment but doesn't actually define it. var worldVerts = new float[box.Vertices.Length]; box.ComputeWorldVertices(slot, worldVerts); @@ -1848,7 +1848,8 @@ namespace Spine.Unity.Editor { Vector3 lastVert = Vector3.zero; Vector3 vert = Vector3.zero; Vector3 firstVert = t.TransformPoint(new Vector3(worldVerts[0], worldVerts[1], 0)); - for (int i = 0; i < worldVerts.Length; i += 2) { + int n = worldVerts.Length - 1; + for (int i = 0; i < n; i += 2) { vert.x = worldVerts[i]; vert.y = worldVerts[i + 1]; vert.z = 0; From 294ab507b5c629418585b16a9149cdccc26c95b3 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 14 Mar 2018 23:15:16 +0800 Subject: [PATCH 3/7] [unity] Fix DrawBoundingBoxes. --- .../Assets/spine-unity/Editor/SpineEditorUtilities.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index 11b08bc9d..c87e493a4 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -1824,11 +1824,7 @@ namespace Spine.Unity.Editor { } public static void DrawDot (Vector3 position, float size) { - #if UNITY_5_6_OR_NEWER - Handles.DotHandleCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position), EventType.Ignore); - #else - Handles.DotCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position)); - #endif + Handles.DotHandleCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position), EventType.Ignore); //Handles.DotCap(0, position, Quaternion.identity, size * HandleUtility.GetHandleSize(position)); } public static void DrawBoundingBoxes (Transform transform, Skeleton skeleton) { @@ -1841,15 +1837,14 @@ namespace Spine.Unity.Editor { public static void DrawBoundingBox (Slot slot, BoundingBoxAttachment box, Transform t) { if (box.Vertices.Length <= 2) return; // Handle cases where user creates a BoundingBoxAttachment but doesn't actually define it. - var worldVerts = new float[box.Vertices.Length]; + var worldVerts = new float[box.WorldVerticesLength]; box.ComputeWorldVertices(slot, worldVerts); Handles.color = Color.green; Vector3 lastVert = Vector3.zero; Vector3 vert = Vector3.zero; Vector3 firstVert = t.TransformPoint(new Vector3(worldVerts[0], worldVerts[1], 0)); - int n = worldVerts.Length - 1; - for (int i = 0; i < n; i += 2) { + for (int i = 0; i < worldVerts.Length; i += 2) { vert.x = worldVerts[i]; vert.y = worldVerts[i + 1]; vert.z = 0; From 05d9372c0eed6f4eda53817569e011adf4611f8f Mon Sep 17 00:00:00 2001 From: pharan Date: Mon, 19 Mar 2018 01:11:24 +0800 Subject: [PATCH 4/7] [unity] Add straight alpha Fill and Tint shaders. --- .../Modules/Shaders/Straight Alpha.meta | 9 ++ .../Spine-Straight-Skeleton-Fill.shader | 56 +++++++++++ .../Spine-Straight-Skeleton-Fill.shader.meta | 9 ++ .../Spine-Straight-Skeleton-Tint.shader | 99 +++++++++++++++++++ .../Spine-Straight-Skeleton-Tint.shader.meta | 7 ++ 5 files changed, 180 insertions(+) create mode 100644 spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta create mode 100644 spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader create mode 100644 spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta create mode 100644 spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader create mode 100644 spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta diff --git a/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta new file mode 100644 index 000000000..e423168d0 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d6f7e10049c6d6348ae5c92ccb3825e0 +folderAsset: yes +timeCreated: 1521392482 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader new file mode 100644 index 000000000..a4c0eba5a --- /dev/null +++ b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader @@ -0,0 +1,56 @@ +// - Unlit + no shadow +// - Double-sided, no depth + +Shader "Spine/Straight Alpha/Skeleton Fill" { + Properties { + _FillColor ("FillColor", Color) = (1,1,1,1) + _FillPhase ("FillPhase", Range(0, 1)) = 0 + [NoScaleOffset]_MainTex ("MainTex", 2D) = "white" {} + } + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + Blend One OneMinusSrcAlpha + Cull Off + ZWrite Off + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _FillColor; + float _FillPhase; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o = (VertexOutput)0; + o.uv = v.uv; + o.vertexColor = v.vertexColor; + o.pos = UnityObjectToClipPos(v.vertex); + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 rawColor = tex2D(_MainTex,i.uv); + float finalAlpha = (rawColor.a * i.vertexColor.a); + float3 finalColor = lerp((rawColor.rgb * i.vertexColor.rgb * rawColor.a), (_FillColor.rgb * finalAlpha), _FillPhase); + return fixed4(finalColor, finalAlpha); + } + ENDCG + } + } + FallBack "Diffuse" +} \ No newline at end of file diff --git a/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta new file mode 100644 index 000000000..38c4a7cd7 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Fill.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ec3c686f972ccf5459c2b55555e6635f +timeCreated: 1492385797 +licenseType: Free +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader new file mode 100644 index 000000000..85d89cf89 --- /dev/null +++ b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader @@ -0,0 +1,99 @@ +// - Two color tint +// - unlit +// - No depth, no backface culling, no fog. + +Shader "Spine/Straight Alpha/Skeleton Tint" { + Properties { + _Color ("Tint Color", Color) = (1,1,1,1) + _Black ("Black Point", Color) = (0,0,0,0) + [NoScaleOffset] _MainTex ("MainTex", 2D) = "black" {} + _Cutoff ("Shadow alpha cutoff", Range(0,1)) = 0.1 + } + + SubShader { + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } + + Fog { Mode Off } + Cull Off + ZWrite Off + Blend One OneMinusSrcAlpha + Lighting Off + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + sampler2D _MainTex; + float4 _Color; + float4 _Black; + + struct VertexInput { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + struct VertexOutput { + float4 pos : SV_POSITION; + float2 uv : TEXCOORD0; + float4 vertexColor : COLOR; + }; + + VertexOutput vert (VertexInput v) { + VertexOutput o; + o.pos = UnityObjectToClipPos(v.vertex); // replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + o.uv = v.uv; + o.vertexColor = v.vertexColor * float4(_Color.rgb * _Color.a, _Color.a); // Combine a PMA version of _Color with vertexColor. + return o; + } + + float4 frag (VertexOutput i) : COLOR { + float4 texColor = tex2D(_MainTex, i.uv); + texColor = float4(texColor.rgb * texColor.a, texColor.a); + return (texColor * i.vertexColor) + float4(((1-texColor.rgb) * _Black.rgb * texColor.a*_Color.a*i.vertexColor.a), 0); + } + ENDCG + } + + Pass { + Name "Caster" + Tags { "LightMode"="ShadowCaster" } + Offset 1, 1 + ZWrite On + ZTest LEqual + + Fog { Mode Off } + Cull Off + Lighting Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #pragma fragmentoption ARB_precision_hint_fastest + #include "UnityCG.cginc" + sampler2D _MainTex; + fixed _Cutoff; + + struct VertexOutput { + V2F_SHADOW_CASTER; + float2 uv : TEXCOORD1; + }; + + VertexOutput vert (appdata_base v) { + VertexOutput o; + o.uv = v.texcoord; + TRANSFER_SHADOW_CASTER(o) + return o; + } + + float4 frag (VertexOutput i) : COLOR { + fixed4 texcol = tex2D(_MainTex, i.uv); + clip(texcol.a - _Cutoff); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + } +} diff --git a/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta new file mode 100644 index 000000000..e2b0cbebd --- /dev/null +++ b/spine-unity/Assets/spine-unity/Modules/Shaders/Straight Alpha/Spine-Straight-Skeleton-Tint.shader.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c9a84b3418d033a4f9749511a6ac36d6 +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: From f89f3fad21bcb369fc0f0bec13686b48ee0355f4 Mon Sep 17 00:00:00 2001 From: Pieter Vantorre Date: Tue, 20 Mar 2018 09:21:47 +0100 Subject: [PATCH 5/7] Use UE4's memory management functions. This fixes unexpected behavior on certain platforms for which UE4 specifically limits the maximum allocation size of malloc in favor of using optimized allocation schemes. --- .../SpinePlugin/Private/SpinePlugin.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp index c0dc79974..2de39adff 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp @@ -37,8 +37,26 @@ class FSpinePlugin : public SpinePlugin { IMPLEMENT_MODULE( FSpinePlugin, SpinePlugin ) -void FSpinePlugin::StartupModule() { } +// These should be filled with UE4's specific allocator functions. +extern "C" { + void _spSetMalloc( void* ( *_malloc ) ( size_t size ) ); + void _spSetFree( void( *_free ) ( void* ptr ) ); + void _spSetRealloc( void* ( *_realloc ) ( void* ptr, size_t size ) ); +} +static void * SpineMalloc( size_t size ) { + return FMemory::Malloc( size ); +} + +static void * SpineRealloc( void* ptr, size_t size ) { + return FMemory::Realloc( ptr, size ); +} + +void FSpinePlugin::StartupModule() { + _spSetMalloc( &SpineMalloc ); + _spSetRealloc( &SpineRealloc ); + _spSetFree( FMemory::Free ); +} void FSpinePlugin::ShutdownModule() { } From a94d2f3c34b1fda11c7ecac31f2ec781736aa8d2 Mon Sep 17 00:00:00 2001 From: Pieter Vantorre Date: Tue, 20 Mar 2018 12:33:22 +0100 Subject: [PATCH 6/7] Don't use UE4 allocators in editor mode --- .../SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp index 2de39adff..9dd2b22bf 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpinePlugin/Private/SpinePlugin.cpp @@ -53,9 +53,11 @@ static void * SpineRealloc( void* ptr, size_t size ) { } void FSpinePlugin::StartupModule() { +#if !UE_EDITOR _spSetMalloc( &SpineMalloc ); _spSetRealloc( &SpineRealloc ); _spSetFree( FMemory::Free ); +#endif } void FSpinePlugin::ShutdownModule() { } From 0c02bace47153c1aa15cf497b2430eed3a6209fd Mon Sep 17 00:00:00 2001 From: badlogic Date: Tue, 20 Mar 2018 14:57:55 +0100 Subject: [PATCH 7/7] [c][ue4] Don't redefine DLLIMPORT/EXPORT on Android. See #1088 --- spine-c/spine-c/include/spine/dll.h | 72 +++++++++--------- spine-c/spine-c/include/spine/extension.h | 12 +-- spine-ue4/Config/DefaultEngine.ini | 41 ++++++++++ spine-ue4/Content/Test/Test.umap | Bin 54752 -> 54705 bytes .../Private/SpineAtlasImportFactory.cpp | 1 - .../Private/SpineEditorPlugin.cpp | 8 +- .../Private/SpineSkeletonImportFactory.cpp | 1 - .../SpineEditorPlugin.Build.cs | 2 +- 8 files changed, 91 insertions(+), 46 deletions(-) diff --git a/spine-c/spine-c/include/spine/dll.h b/spine-c/spine-c/include/spine/dll.h index 02714ca45..caae94198 100644 --- a/spine-c/spine-c/include/spine/dll.h +++ b/spine-c/spine-c/include/spine/dll.h @@ -1,48 +1,52 @@ /****************************************************************************** - * Spine Runtimes Software License v2.5 - * - * Copyright (c) 2013-2016, Esoteric Software - * All rights reserved. - * - * You are granted a perpetual, non-exclusive, non-sublicensable, and - * non-transferable license to use, install, execute, and perform the Spine - * Runtimes software and derivative works solely for personal or internal - * use. Without the written permission of Esoteric Software (see Section 2 of - * the Spine Software License Agreement), you may not (a) modify, translate, - * adapt, or develop new applications using the Spine Runtimes or otherwise - * create derivative works or improvements of the Spine Runtimes or (b) remove, - * delete, alter, or obscure any trademarks or any copyright, trademark, patent, - * or other intellectual property or proprietary rights notices on or in the - * Software, including any copy thereof. Redistributions in binary or source - * form must include this license and terms. - * - * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, 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 THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ +* Spine Runtimes Software License v2.5 +* +* Copyright (c) 2013-2016, Esoteric Software +* All rights reserved. +* +* You are granted a perpetual, non-exclusive, non-sublicensable, and +* non-transferable license to use, install, execute, and perform the Spine +* Runtimes software and derivative works solely for personal or internal +* use. Without the written permission of Esoteric Software (see Section 2 of +* the Spine Software License Agreement), you may not (a) modify, translate, +* adapt, or develop new applications using the Spine Runtimes or otherwise +* create derivative works or improvements of the Spine Runtimes or (b) remove, +* delete, alter, or obscure any trademarks or any copyright, trademark, patent, +* or other intellectual property or proprietary rights notices on or in the +* Software, including any copy thereof. Redistributions in binary or source +* form must include this license and terms. +* +* THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +* EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, 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 THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ #ifndef SPINE_SHAREDLIB_H #define SPINE_SHAREDLIB_H #ifdef _WIN32 - #define DLLIMPORT __declspec(dllimport) - #define DLLEXPORT __declspec(dllexport) +#define DLLIMPORT __declspec(dllimport) +#define DLLEXPORT __declspec(dllexport) #else - #define DLLIMPORT - #define DLLEXPORT +#ifndef DLLIMPORT +#define DLLIMPORT +#endif +#ifndef DLLEXPORT +#define DLLEXPORT +#endif #endif #ifdef SPINEPLUGIN_API - #define SP_API SPINEPLUGIN_API +#define SP_API SPINEPLUGIN_API #else - #define SP_API +#define SP_API #endif #endif /* SPINE_SHAREDLIB_H */ diff --git a/spine-c/spine-c/include/spine/extension.h b/spine-c/spine-c/include/spine/extension.h index 0823b5667..2d1adaee4 100644 --- a/spine-c/spine-c/include/spine/extension.h +++ b/spine-c/spine-c/include/spine/extension.h @@ -61,6 +61,8 @@ #ifndef SPINE_EXTENSION_H_ #define SPINE_EXTENSION_H_ +#include + /* All allocation uses these. */ #define MALLOC(TYPE,COUNT) ((TYPE*)_spMalloc(sizeof(TYPE) * (COUNT), __FILE__, __LINE__)) #define CALLOC(TYPE,COUNT) ((TYPE*)_spCalloc(COUNT, sizeof(TYPE), __FILE__, __LINE__)) @@ -170,11 +172,11 @@ void* _spRealloc(void* ptr, size_t size); void _spFree (void* ptr); float _spRandom (); -void _spSetMalloc (void* (*_malloc) (size_t size)); -void _spSetDebugMalloc (void* (*_malloc) (size_t size, const char* file, int line)); -void _spSetRealloc(void* (*_realloc) (void* ptr, size_t size)); -void _spSetFree (void (*_free) (void* ptr)); -void _spSetRandom(float (*_random) ()); +SP_API void _spSetMalloc (void* (*_malloc) (size_t size)); +SP_API void _spSetDebugMalloc (void* (*_malloc) (size_t size, const char* file, int line)); +SP_API void _spSetRealloc(void* (*_realloc) (void* ptr, size_t size)); +SP_API void _spSetFree (void (*_free) (void* ptr)); +SP_API void _spSetRandom(float (*_random) ()); char* _spReadFile (const char* path, int* length); diff --git a/spine-ue4/Config/DefaultEngine.ini b/spine-ue4/Config/DefaultEngine.ini index 244a1d163..e01a3674a 100644 --- a/spine-ue4/Config/DefaultEngine.ini +++ b/spine-ue4/Config/DefaultEngine.ini @@ -6,4 +6,45 @@ AppliedTargetedHardwareClass=Desktop DefaultGraphicsPerformance=Maximum AppliedDefaultGraphicsPerformance=Maximum +[/Script/Engine.PhysicsSettings] +DefaultGravityZ=-980.000000 +DefaultTerminalVelocity=4000.000000 +DefaultFluidFriction=0.300000 +SimulateScratchMemorySize=262144 +RagdollAggregateThreshold=4 +TriangleMeshTriangleMinAreaThreshold=5.000000 +bEnableAsyncScene=False +bEnableShapeSharing=False +bEnablePCM=True +bEnableStabilization=False +bWarnMissingLocks=True +bEnable2DPhysics=False +LockedAxis=Invalid +DefaultDegreesOfFreedom=Full3D +BounceThresholdVelocity=200.000000 +FrictionCombineMode=Average +RestitutionCombineMode=Average +MaxAngularVelocity=3600.000000 +MaxDepenetrationVelocity=0.000000 +ContactOffsetMultiplier=0.020000 +MinContactOffset=2.000000 +MaxContactOffset=8.000000 +bSimulateSkeletalMeshOnDedicatedServer=True +DefaultShapeComplexity=CTF_UseSimpleAndComplex +bDefaultHasComplexCollision=True +bSuppressFaceRemapTable=False +bSupportUVFromHitResults=False +bDisableActiveActors=False +bDisableCCD=False +bEnableEnhancedDeterminism=False +MaxPhysicsDeltaTime=0.033333 +bSubstepping=False +bSubsteppingAsync=False +MaxSubstepDeltaTime=0.016667 +MaxSubsteps=6 +SyncSceneSmoothingFactor=0.000000 +AsyncSceneSmoothingFactor=0.990000 +InitialAverageFrameRate=0.016667 +PhysXTreeRebuildRate=10 + diff --git a/spine-ue4/Content/Test/Test.umap b/spine-ue4/Content/Test/Test.umap index ff900fe8f97fe74c26cdb88331187641462c97f8..6e2bd33327524d3f051ffe73377b6ce67496026a 100644 GIT binary patch literal 54705 zcmeIb2YggT_dh&K5l|6DiU>jiQl+F50wHBLfj}sd0E#7SlAB~DWWyF9h!6`1_JWF? zqJoNuf)xwZ3i8-{K@q$1*hMh!`Ockl_wL>;0eODU^Zq|hGCOnUoSAdx%$YN1=HA`A z`Qm;{p%0<_c)fyy1!X`+cV>Ot#or#IZ9;Ogz!@2kWQKA1B57{ba{6nw%c{c)A>Rm?xeV*)h`#l zb>HiSm)37XEJ(CG>B^ZPHKjQp2G@qstFR8L9D4d_a5x*U{OQ|YSF2IV@vuCk&kXRYQn<;OUE zn#bj=7TKSizqV5Zbi2P)6X$LGDr)T&FdSK`mTyC*v1BO({O{bg15YFF7bv2x8rpZAT7sF*diTz<{SgU1I~kX_k0 zx_zw_Vn9SFFUj@0s(lWp&naGvU;j);)GR9VxN3ca3~onwoV8WrtM}(Rpr{PCyFJ>( zai!;JWj^tH!GPgyOfY@m#lq|b1?DP6wWJQ?tNo-E;^AMA;E(ZF`&_lvbq4Z6K&Qh&ftm^0~fv)FF zFLh}(zHwz`)qbzbU1N9GczwJXsK*g0|CF?ewyo zbE~zQa_*p4tgi3!p@GA)4Z)e-p|^ml$#!&khG4X7c3QoGq02A?@HyVXBsn&}uXfb(UM5I7v)>EAD1VkYQt7 zq);BMoV2W(7^fi^({1lQte&L>-tlB^^Zhkt;+<{d7Qi5u7HXBwvO2C@ZYS;X7I<^~ zzACrJ<#S>-3*T*ir=+1HkJYsDVmCEasTEDrswZd_UUBsUXAcG6xrKRS9VO#xoiqHJ zm|gMC8Z5oK`p~e5{l7I?ftC#OWhcWzk~H++D+W3)XnB$uC73tS_tx40m|#W|BmAy% zv8%<&6JZ~X(xN&V?&+jBQUn+JTAdbDskp9I6UUx#-N#Z##%RHe zslLbmdd*o9GTt@Q?Hf;Ps4vGiMf14DgY&<>R8H0L#b=JsD=E}wYSsE$BREnmx>rO;>OR1(Z@3~|n09yXt(ud;|C}5aqG|5sC zoYhDy{p|E&IZSmv%^0S=V+U-4%RqLk8d5JAq4~&7s?$8Q%J@7qXEjgB1R7>f%_Jvz zGvbWBmtTi*wUhJYaq4SVdhxyACj^(3B$wpPrjGlxiKV2>a0*JK3qiBfAb#bDeqA9^ zy{&+xE9)-V4o<0joQEd<6t{c2nCZ!UToE4c_R_LWmgF&ehXtx^f*Zzx%DR8@oLt(d z^2FM5OlDF3Q?KVSywaEm->li!!g-cXp6`@Dp2XkIQSq8&3ofKsbFEeh zt&7=+<)VPT{mI;-WnA=TYa_;l|~ zlQfhuo{4R&wa#eSG8Rja6s*2f8Mw=YpVG;rT<-NHdiM&ykxnUpi3AcvMJ(W%qa zmC$^0SA5PQt;|hkKx`>KzbRD6p?OJk<+*NuP5A_8xy$br%eN*ytM^-i@?FwejMqFw z+2^d(gu`}6e_7X6QQ`>|*G6+)#D;?NZz!fWQQOeq!JGn0F4B7vm%q zea;PgbFsSQ1ysz2^?hWV2Uh3CHWmVdAXUXU!@%ZMYtuZ8dv^UYp z9quyHoEl$2O@&)*EIIy948IOi`=#7Rou5G1D0F)!xwKhcam$(A;^4RBg)S81X>RFW z))SlJULG11B_ktp^^!3;XNc=AnS8b6l-CgHf5s4qL-+snhSXYG?CPX{As#&Am>w{xc{Tp&V$#+H zZk+@FbYtB*{q5Vcu_4c!;IHwy$YPKT0xIiv%VihF;;uG7mkw?OB8h~(W171a*j3h$ ztF`*G){jfYEvj|Ss*#4wz#B;(0z3n?Omz5U$J+^@6caTgBd2Hb^4sUZRf}djUrmfHQH$rpQ~2vzF*EjC}**gd{>_|0)`v+ z)>(CTN^J?}5{UEmJmrwB&aQ>8N-M*Ni3JWZ_TzgNVzJGyb~}BB?EhT#(ZN+UHB+QYVoE+@-&R+WNYh$FwSVe$&Pe-%5!QetF_`P>Rpw)x?HS&<;`ATU?jP^ zc2em|+S+Jd(P8wLo3ONubdhJ}DXVgk_bR6rob1H(pPFOFn}N#VBs}T)cn5yi6BOB+ z8TQaC7T?`#6r@&AqdU=Jp1ICKS8O`>GcJhL9aNrYmF zDt#gweUUDSAvw`M!Cwd+3NB6%r@kLI910=Jr4H;^d~zxzBui)x$-?>fuE@iX$U@oy zn0DqTe>u@BI}mC-AN%ayA!vxujSdTc>9-#A%3L@>t8{s>NxyvE?&~qSY^KF`>wZkc zo|Ow&BY2^Grt`nLLJSNK*!8NpXU)ObSs*3Krx9bO-%Q1SXW6t_$BY1QHJ@> zIHY2;v03zyT)g7qA3Oemo-@<{^ceN&osiZT=WLoW*fdSjs@>Q(TPLsnzdvm#4-&4Qgdf9Qc zS(jb}4)PLy8~?K2zP^hO7-LQRe(ejd!nlrc)r|F{^W!R{qI-+oQa!|wE*F1+38SAg zy_T`GLdwux?yuJ9%w8UujCcB~L~ZxWo#+}wWlZ{uer!1kh5%EZ)E=&gn0ji-PhcEn zQq-@mX?8ys(B|t5vHh$?O-u!63Qzubaxa4_Uh%|Vw^qYA%KH;PH{ISE0@AnO=B{0F z`zfbjC0CA)Hu^gorl5XlaG3M{`mZt7^kN!6@oDARBQWxMiCnC%y1dH@46-^|FeLjz ze(7zHtm(wTfZf((;bl0ZF~Q8-jqLiG1Cmr=Gw6@?H_tHs>Y`q*$bL<-vJHM z?~mMc)xfi$rJ=_FBIS*4onTd@o1}S)-Pqd86)_+DiQ*N*ZjsHntLwbtRj>UcXq$OX zhzWDs&OzIBGNaK+UM^X%8qg6JUQqfH*j0dH+|C$%`hiz;WL=3NJh>Px8sEOZ8DQ-F zH$L@YUv!YwzKEo)B|F4(d8un4NbJP|w!PhB&RZ~6vO4X+FLOQd4o1~D8ZtDcO$+BD zSYHETR)(w#uFe9{BIiu49BazBiVCmh6LVkqR-X9EavWjgOsAcjPn2}H@j&O)!**%uCr?A7`f69?!~R2zZhy%lC^6ZifcG`o<*Sk& znE18R8y~?E>)V!46L|G+@BaYpl)hjj*Ybrw{B1EbILLBUxXR$P$L;;J1S7zQTZW`O z$4%8R-xy#P)Nwsq&y}p=UJ6cXHJ`gCr^Yp1AJykypVS@dC2!wYz=@*D|9;z^k>SA` z>8(kxw8su4d}G15!!s6XaS?F?BlMk^FigtQ%>M+s<3Vn)N3@xF#WQf$gD5gInBWCN zZx%QV2#Xq^*MIG}|!|+j3V77o7?o9m!wh{ z<$+Gt{5!8ZrdHs<#(*V=1NTl|FIh7xI*4bQW-yPVwK}1_F>RC783Un!&Hy|y& ztDi85)#*}`v-?lM(xqlWl0*D;F#A>LkSYnW;UD*F{sd-7Sg2PlbG$qTy)jR!SHA0a z9*kC?jQ4Nn{rKp(-r*oPM=T;N+LGuuyrp&7vhk`d80F$B@-k|iu4;KA@o-`Cdf3Qf zx4XL7RVyC(y2UfFL4mu@bdLC3O0)hLLpqbG(NAVgR;#;q(brf;`CfV81X5(bbp27X zp5@LoH9CFJg!z(^`5ybF^*?>rAq}5? z&dpZhta?1H-Cl8Wj}^%ntcms_a<0hsY2~UhY}cmEnwx^Lo(%|9vZeY?h zw21&W9bp$eMFAUtz_3*PQanwtb5%YR_7uS?BfvHiYychzp%7Z{NrEMWz_KN#5UUA> zJmkXl3KZ;7g1JMw z!qsCP2nS;w2nUNa?&#l~D7>5>1-2jx?5-%VN29);LQ8uji7f${wRhG4%%fPF%+dlZcAAnO*|oE`#W{Q;~d1hz$8KS8h_s_)$9 zRt4JvSV%pFttVK!2=yK&So;XDhX~do0&E?@Iw}~;>}y5eoP>j^YKC1h*K49GhpX2# z3anWa82mYeaBZ>7^B3uhUk6!We@1~}?dLX_UUQ{Dm@7Z4HdzL2 zQ$X)Hg%=6~y*42*wl}EPHUbRw7{>kUq;NMAObh8B!!{A@#}F9XTJ*sk0%KeIFM@SZ z?K3@w-5mzjQ{g^Ku(LzjWY{wVOH_E@QeL46%)2C2j^tDYz>~X&5~xX|O|JJ9m3?F? zKUL9zBfVB36&?XPY&)1PH49nX!{^QjG>q=5 zE(Z!#j?2T*`O-vZAmL|IL?2;$E})3;o{5fL68^KXbOurNY>Kdbpc6+CVX{Y0V|_-W z^M$ED@IT=%0v~ieJI$ zpV9hrFoaHpYRoLR{YQY#XCZXp3-bKAR?%F@i&BgZMeEO}COWVO>`P*No>%R5oEd|F z0!O2>+e8O8=QdRba(i0kKQhrlTil)kTM}y07;^@GXDWldCMp2h;&tKHS&ZGdG!`BB z4MnOcGo5FT0G)lN{(#OB6P-Af|Lh3R`L~G<j>0B4|M0l9a=}%|r(<#AqR0f5Oq>d726XPT|+NdWz4(rSnrr ze;!tCp+8T7AcfN|(NlaLNjlu0EhUxNnHqbP#~+#Tp-`qs)NOpGR*DYA)i%q0-^A4DQdtn<6$H z1UOVW%G?xMiOm&%>98q2uElA@)!gZI2xVT zO>#qjS~D``$Eo^VR;o;lgsXIdu|A{G;WZj_%$oPF# z!+STWOpJupiQYa# zK?gBhf8H?BL4Ww(9Qt#TI$&P>0$nsBMC;G1COX(J;C>zOK?iz{u>4IujrAFg4(dWY zz`?%09Yw5fI2*xyMU?9jr7sdsxIT^|WP^Ktl$AL9DUW9wFy7Fuo)p0=@R9$W%JJ+1 zV7Rvf9Rm#MuT+kE6!5cfM%$laKZ-a@1AZb!oOdA)9MDJp6)FP{*mrcKcoN0-6gyDF z14`zAdTlA5K=CE2!)rKrKpm8!9`KN&J(Qyz(84v!At%s5J;()clw(YKQH0!5D84}L z4W<-(2-pj#26Pd1QYiu-?cz)TDdIM&vw|Y>&zbVuP5G^+Jn)xOWPHv8pYy;+o|=@r z_fctY6sUmu4-k&LPel0#DbKQBOL-pC`%UHdsd9{Q7mBA)>`Jj4MT`f=?_PxuoH&Z{ z6uVRGK@mE48b#I_$Tf)~c)5$};l2&V;vPz$r?`?L?$t5g~4qaNyj<{*j#D55-> zBJ-V2dCXPd9-z9ESOQ?+Nq^i3t;wg?Hs|ZrjDi3TMh@CE-b2r2dg|maqsS+$!8X3b z914`rBt!2^zo#OJKo`tUA7gCfbI85qB3{rwLF{ZBa!{3l)a9`zQ9jhM6$In#g4`v^NXfS(?4$wD3<}S=*C}D(kT25rdf=1 zr2N#&@Y%|^K1t<9i1UP-*7Q;INe}LcnW93>5MEj87h^>!m6wVtD)my0V^yuw>8h6S zQ0gb#3i7IBL7S+$f0u`&R6CPInc~V?!g4rLw8oJPYKWSRWUoszP}0oOuj5onAxXw3 z>-p&}QaO2<6?9cf&{Gt~NRnSE$6vfl@Jt{CJ(-RFN-cQ7tz~Ie;6Gba-fU z3rB}H+O1VPdBlN__=i@^kmFrT9NB0E(Pa?{&aw)O!ZE6bRnu&=#VbZM0tNEd|CiUd$CEXg0b@?&v%E%33jxuz5DIu0_JN(K^Ij+Q@&<^OMAQnmyB~ zhiE;#?qNo=6munBEos0|x}Squ6~q%X(@wF9@@{du(p?*wE1gO>7|V&%0F6VlL`=gW zsrpDiSvmpw;b2EA-cC?yKsKCXiJHgHJP!ly|J^K$*7^hM$kxGWppPl}OP+30RSxOTQb)7+Q)B=1kwZilJ@Ai{< zHrv3!XhnzeXhiOBTh-rul3c(>nrTfH7)zU46aW4y$W~$`>E0Y^y#rRlT*ekHGVdJ~ z?*YEii}PqsVy+D`S^ufziw+ibgwL)0-BHm!1o#Nti(;ZXhpsAUwW^?eKw{BwSpLix z&!a%fdSvcffR>G1Fdg^r_J}npz^#MiI9A4$wK;R#^E!b>{o@<)++Lr{FJxR-uK985?dWmsHE0s5*@#oOgY^{ zw$V06rxY3EH}-h zC|aj;iEntl;5||~`^OAFTB{{J-h4 z)k?~neSfqCzhDlvWur5zSUuv^UAK{bq8u+*^>U&FzF~=b#B7E44vBKLv(a;6vFNgI zR7w2S5>>1^Jyk8eE_6@e%6uQoV?*Mck|4odYa3D2MLQZ1mg7v82i4oJx8OKR#9Z^Qn~P z(RC7Wnn8cbbe%|_m<#!Ykxzf{?~{opW=ks3=@XL{&q(vB#UN@8ya#qtI0+bJ>B}gR zKjdtq)ALw;3ihL*S>T@kbUzBELx}T0Df}purUaEn@}uBO;qULRAM8p8fj88FKY;kzK)xh84s{cUg44 z^xYyxP_GvsR8wCe{j{>i2h~ndwIk~ZTR#V_{3%p7pHkSoRLa}Q+NDZ62P=_GkUUB= z$X?}2h=Zj-lsZ9)vSvMSQUc+r7GiH50{h3T02l$^V#t{EFx5nJE zk^aQ$1N+Wp&c<-5S%t`ae2e{$>U~SXa@9dau^T}(Vm3W$Gb>x%TL{7}w zZ4|~BqKCafJe@>iH;?@+wt8eZOR*`muV={&8Tupa6^C=^iHYvSgMI}_ zlFWA}9=c0din>l!*J<+lEMdkStYGO1cZj-9RCGWAG;~@_0X^q3rjkg#=Q5oV>T>%y z6$hs%V;V^YjU4@H*c}xL~J%^HwxsfO}S)VU~_LxSBp-187P>R$b z)J=&o&M9GJ1WU&9U>U)-aak-G1&;#kCfAHMuTl)D;Vep@&F}%aZY-+Sxt40kh}#P{ zGT0aEG@{S8#*R#?N#eSthSgyjfsw&V!F>xq1G!Eti`RG=1&>UCtN#=QteV`%|K!*Q z_Y14=;Zns(4%dyPaiLUsmIkDmDm7VOcX%cpinR%)5EyBeW}2bnNwU|N^VqBDeF)4X zoa`Q6zpyvsnoRY`_A4!nmcZ9ysw_F2NOM`Nv9Vf%G{e5IHApi?Ct#Ci$e(qS4+tkE zB&H8cNFJD!Fd#8$U_#o!)I|9}D?Rl{FIJ$R%%j(7;X%pNl)2!@ z`5Jm8Gg$(J_*6pl$8cp9!Ghbp2!i9a`E1kQk z@-@JR$ct#%q&+;R1=b5N{ zz#nabU2tXY8~=b1BlGN|^;Z8D03{avjKVvrh4K#jBmMxK+f}Zx>>#eZMLXt$Z*D-*oY1!>TR&8j|gQP&9X=X{34e3t7^S zR0FI%obn*ZuOr|qBLF~jc>EqVJDws!j-Hr4SE)QR9#d>9U-)^(Ti16UeRsdfl{sI1 z^|6_GbKWd9F2}F#a2|BS;k*|HXNh8x>vF1!b z;2u@LUHCvmI)@H`%GB7{$#~YT+A6Q;^RYLWFzucoQ4_5~BE58dw zKiKZ0AAi>0pdee*X~8KoaSzu~Liyuk&NL!5YBq-ZnkP5RePqdV1(z;ux&Ps>ru+u( zL(5gCec+mfPPu{e}-Zj#@Hv>f+g* zl0CqQGz@?pIlF*9M6?TR{kUHd?Lr(4%pp(xE?*3N{*kdyjJ~hc1x+>_w`mDeK?m71 z!GNCs_S3f0ZoIhQqUM9AKfZgWe6Me48SpjzbycXYrXmaiN@bDd!%WWt3@I>13+w5Z zuY5oBrz z@J7dKvjXqzK;ufwLaYLQOjtts^rzG^{##0AJO`PsP(92SKajq=dc_;&d zjn1TEDVdT&dhv;qUKL_3lI_yRA$4f@>+_vwf1Nkt+Mkym+;y;Y209d42C+%vd9!OJ z5uL*S&ZvB}xB8@+Nzdf1el<6K+5Vdx=tO84CQB*3{%6`azps+s$y;gai5wYvJB2K= ze0*#v2^2^f$gjW#atv+MINYwVY8OXoxq5AE9KC!sZWg_4nIOKn zQZ0_&Ge+;H9eA|Eu4Lo$mc5TPc2Y34M z^t_Ai%xe9~PtUqpnqai4;udEzXWjP8T?;-e9#j9|!dF+9|y_GKT1EBnt*DegY@&*C<>J|BV?>O~-@1x}lZiP)QLWk!l!OoMTB+oaHa%l7be5PtxPI+KsBW}{B zlB6O|+htVqkk^jepR6r$PAj%A?ze7tr`(htW<_Uf7S53kR|fH$&ij+;QiXU*?e@Hc zl>8(|N@`+WZen8Uket-CeEX1u#N-@Deqv67yhUiK9=c)2i6gfvQ!~RsfG`)v77#8^ z=>7os(G>A*)u3g>dJ*7>NWjhncsvp?g#eE!V4RZn@#=cDN-ar~ClWIruYPRwRXZn* zJbOt=)nfaR_xxrHB)i&;a&<@2~M_^jbRv z9Cr=Ue`RJ6-Np4%9`DQL;G~0B^b;aOfOOEx5fA%Ri(-Y&^Q@US|s6r;kNIc?_93yez`Kr>TDzzkwR0%U}c%EQf zHc1J$#*C+{o~yd%q&Bx=Z@aBFg|J+Kj8=uH&tiSKTLCSkn-Bo^pb&EO#PkWZLI{P} z=rIgEFuTXA>(wf?B(0a0&&o^99QE+a&QacuOQ$ktKtvCIP&F(Z;-{{91A_vO$5Z;H zAuQPfBQZ-n4!u-mRVR>qr?T&=ltnI1QZ>F;01Hp}sjg)T$mC*5K;at+OW>J9ZD`(W zb56K6W7?QI9=R(g`O61_Zs$Z4BYstkCG?LNA@Y~6IBL?Onsf8kyt=S*y|dc}9uL4G ziV;7s_Kz4LA`TgUT(@p+FHiOZd%pN}QOc#qHA;;5ZMuKN$Rb4A;_5eVdGhPrarb|_ zYDd@Q2a_5l#{Wgzh@Tu>rh4{&ZyP^P%Spep@}b;k7xaC8%-uT|HA;;Ci?;EF*k+!|}L@KD=(2 z-cdYPzLB}Y?NP5-@2DD(w}UA!&r>{pO*)@w*#e+4dBQXo84B|Lh*s&U!F_n~j$SAq zV3EH&sd?p(Xy$w9IlEbI&$L1E2R#Q?iT=v%>`gWDX3`H|#?7L8l5w@v3Z0)(d)_!= zGtP(8HYeVvJWw_bho4D<*bzB#A|K19LQ-;y#K zz^NQF{(mep@V*2*P=Lnh8=e0mL;sCIY)2jcFLfD*4%RV1$u|@c;wcWvP0US8p&w?o z+wHk&3Ass*yqvt8A!+uUoW#M2d4Xr5WsRsGd>F!Mwh5cJLl}cT6p8(b8;A5EZZvTZ+D1IdmO_QnVb-EHu|j!J%rv1xri|@QJFN=dzSiBs+^@F z2cD6*kWUs`n8$)!M!Hj7SPl;Gj*J}&XgPLZS-h+enA~BXEc{JD@225iOoIOEA3>`T z2~AkQoC1CXl=45=oP3OyxMY3jGcVRusqb9~0TCf8;wglHh!7PKWV=bU7>Gd1R*1|K zTR!QEeHGFQn=M9`%Q=__UvUbVfksRH2+(L7VIB_5c*G_ub$rtxZpv#Vk5EtEyLC1d zi+FNoV7Up)E|dBM`}~Ia4fJ16^S?oeONI+ECriRiAG0zq%f{u=lM{pRGbS88{NjFf z7W~J${hQ@7Y&M{N&`E zApAc^Uy%93*)9wI?)_^d{)F_xApGxI56?^~Ki7hvvi^CUpMz%x;lFol%gj*^jJM$1 z#BPcI_R48N_*WjaW>~?=Sr+`ty+7*spUn-z|LpmZ!(RM)fCc~BEe#UC-S?LU;rH6J zb?D8_J6rJSCkMAeo-;1EE(o6v-iKEG)jT5p*$>`s!FQB>Oga%9nu^~gKi#(98-%~? z_in>(&3w>;zh}QLpS~YF5`;hRl-0xD={L`U-&8y&+uzy$*&uv>lVda2eVc5-Zzfjj z^0Yq}gumdxh|C?I{+b!gJ-rmN>jH_tw#AMh{GUEvn0eySw_5Pee0-S1pK;E=g76<* z@j&Jq-=1c{Z{GJlssCs1dMyaQn{RjKw%0eZAvV}r@XI^d@?z8LLHJj`aP08j?dmP~ ze>K?j`5S_-&tEJ4xW{`bev*RPPdn|m%vaXWvgku?<^hS{_qM@7_?PY5k$LY|9t(cg z1tX<=+6~MK!teg{s?15wX%_su_FXLTkG`oO82`9MnR!i|7W{Ws-XZaS?K3e5|LqM^ zGVA6}wBVm}^`jD>o;wS|@Ag^0%;6hGTJSxYFG~ErAJhin`!8yqdB)x$7W`KV-tYYePmeI8=kP>kKVmg;wPW@ zP!N97tlx+2JoP#Y{=6j*OZ7VLHNm+tjxT2-g3))9Jt`$QlBgGgXeGOJ9cG`-!jmGzqK}A$6pvce{XyB zx6GW=Ua`za+{DCf=(ZHGf$T{UUnRmd@<;*4t_VIeV8|l{yaz?xY6T2=q=0v)h^Hq3 zLmnyM$j4K}jdkRa0uL?+@_@xr#5MA``Hp-X#cmXF&3T+};JPbC%4`To?k#UgXx*0{(L7wpd!y_L!jbj|7xNb@j zbr^=n(1D9`lpzm206x>SQ66|rC<2Z=@R3Iu;Hbj~6R3-8z<>)lU^p{D;A{N~*Saqt z$k#LcK3X?yK;+2CNKqEfdAydmf&!NP)oaVn9Xm2T=aTa^pWMg!^Wi*Re?@tltWE0+ zv(Sb)Ja~D9#2@_x8G94{w_hEd<^A_)3;wqcUL)}*_L>xge@($rS=}dEjrY~VmrDFA z#!d;sr=iQb?Uj5>``64W%mM#LCzCNS@dNyxsaE5({M6Sa{^J+!3c^pyYMJ%)yc~;h z`lH(`o6-I`j}HyP-*NkiS>JB9_Ba1chs5uEA3484{B+DZ`pW_f{|gUpl=zNsGJ^1X z4Q`ip$DP*p4@Tf;C-L)D7=Bhn=x=g_{%&e}K+30GRnDy95 z>v+X0Wrf~jQXwG4Bt$@pNsYh;0eLniY_wqLkY@vlJR4W!*$5-gh8lS`-jo%r%g_bx z2lO=JWJM)}u6iOZ3$n1H2%qYSKC9#C0;UlGW&|NDB18h)j1U#EJ0WzFXfY6b5K@Uk zyiui0`X+TPma0s)N|||C^R;nr}8zL;Y;Lw%5zyg0&ZXsFvt z355<@O%ta96G4wU)cCA#wN1~5;@1z2fp4B@)IRVLgM&@XVSYmJ!H*UHU_<6s7z(jT zY-FY$#dL_Xp9Z)jMo^CK<^!4J%LZ;|-* z_k_qZJpVSaCRfM5D+E70|DwK?gT}Yf@+bWy`Gmud#D5**hsZNL|0aGy@WbBsGsh*<>pSrf8+FD)OU}7 zAD({`euz9H@E_nO1U~}*n=W*uBqwKy`V$(Z|04S&9bbGHBA>|o%l1W87<|+T37a&< z&!r*w;rUNc)v;bQQF)|IDVm)Z5a>4}uF%%YrTh79bX^i|hf zt}X+~RF#eBp?s_m{!l5mjG;n^cnh_@=co2tU%k%Jd+J*bZUhx{_H!>xZP|CtT?IGX z=kNaeylvwF5uH@mECR&qal1zA_bCd<(jBL+#c0YD73UNe*vI4*jVu|Qn4g%Oo}ZtW zmzbN9nr2T=8=RKtNXl^}<t($p2#G_Vp=W?_v;+oUr-fQ>s)rB|vPCoE* z&*#R-)*~w7D(YIJWx$h;r%X@9IhU);K=P8xE>|hcrwk1ZQ}dYhI8|nuB#qhuT&!wy zYwFTso($4JFe69&!Lvbxc&wUs7TyLB(1)fdSb$(WqU{7Q)ON!3%Yb#Ec$S-+FFVTT!FV?Mg{aMnW9+|r$y>)Iw5)~B5(^q@?5OL z3~~ptUQ%F1k!vO+ap4OJ=}8^e`gw*b;tDY>w7H2hBUC|4&tk!nn;a82^hp{tx5O z$gts%b==&_Vd;24RoE<|No-~~%upH2l5&8Yk~Io=l1i5=bHa;(z+%NnTv)A;9#EAm z$w0NlSq%Hy5zB`cDs-!1|5ZVl&W&p6dd)&W6*NVKeRifQ%;8!p#k+;{5DF3E4Fw6) zprF@8MXL5!lxkVJD{K8iD{aATdcAPevie7)mKzcBd1OB7vv4AWVD0r@9U#K+QJ>Xa z0j#z{;Z|%o+=|E8^qP%U@EfSYyHw}u!=?D;;a2?O za4WKp-{?N_B;KwlhEC!uRJnLwW#G>vgd$#`7t`;bs|*|Dp6WVOBW+@rf`rq^?E4}E zm*qaIfELRqXvq3SASmcLWsO> z@NzIqHM3l$CZ~75V|HZV$lSLS&|>|Y5P+KxJ>gww1p4piV z7j?h=kGi_L$qj{YH4ri#PX9j&f6=XL{+*xBc=M>+zW%UhXOwl?R(R_(ld!^HlwmTF8}?Qy(7by9{K+4d%8V6u>Y}Cwlnp;)y>B(?D+Vc*H$hYxvwwqvO;@b zo99`b`$?;7uM4_QY#adgoU;i+?`igOp|2 zYx8@zqOy*DAsW+ptiM{L(_tdrB}9-8PW>tKP7fi@rt^JCLfnv}Ll)%;fnymRjVFBg zz&9%zj(s*b^TQtpJ$XB-qaJ8A5=RS{=<;M=0r7kED9TIkF+r=+yg{v3dhe8e5bzBVe+;E8|rmX#C8yGs#8(-xmeKotR`4?_r4D(LY`V?xxP@n8zPzwbq zKPwat5aUw6uUfP%*Iqs)K3?HWf3CmE9{>?id&=0=Cq?7uRE4#gfUlZp=MqWdQuMqx zC3JFZTxv*h1ljxkv0my!v%m(Bg!YF^D|4%SrBlV7D)AL|cH^Hv$y!y31FEDkoQO4F(h zY|kszvkxQM*`*tRweFj8z_b)XHP5fY1N@|rKMHjpwC~O>#q)m zywxG`SF3jx!zox1l$93v&eg=Ii6whm04EUe){YPOYqUV9R*YEvxleKn1pG6lfr{N( zM^>R*2oXioYRGdCkD|izAuxdG;$*SB$wd|5?G06VgRJMADy_PV8yFPJ=biA8fy27B z;7n`NRbVtqI=VhB7_A!hm}g+8RIXb&Kx+Y%mY0VMsJ=@xJP6txQbsee!6@GzvJ;7xWR1IQ68#gJo5ZKTOvJzA~+B znC73Rg#xwWwhp;lp_7ulX}(}kj)596V*IL9jIokoTD2A+DM$M%Dnr!rqKRViJMNp> zn_**oWC;PSjLf5oIFjzhblkQ3NT7@ejwdgeAFeJH?>#qeKKxY4XsyCqTFZpXa>*=$ zBZArCP^CZM3wbdNMd;SBSMt!2$7)(xp`S=qXa!TXstH10}=nKV$7s|Rwwa)Kxn+y_ z#}Kg+Sw6n9mS(OX%trinUCT#h_l(g(Uea$V%)-kxKNJ)sB$PqEr(@cP@WbDv=5c zv{1N4G+lRft&ZleGF-z^jaFYKJDGG}>I;!CtP#Ilzod~A%qR;^MS13L@Bb{@H;%Xl z$o^mwa+n?U>osRe$avoje`q{SZK3SYBrV_<56=Di5;?}k7oIUbuXwaJL#xs!5i#$z z`{zsZoS>ERIMSOO6eCMr>!J9P3I1?JWi_b=0=)TP)<^K6Ie{>Z!rs5MDZ`MLSB52s zC(fuSg7neF$)aWTkUf%Qfp1z(m9M;34&}Q>-}<)fnSvS(LpcCGoyXj{Sq`I%`YX7#aXZVA;?emRE*H$eaTZpp)L1&VkS z>P>Pn1ZOi6OFlofP5AHmH$ze?9~Yp3KgsW(CT0XOpHPg)`-3zelP7sRx6OQ2Ho*_)KxLgi zeO}HwTsS&_*U{QY=Jv zV&%131*}ebAZiGW=t_T?xMXHPI+EPN{9@{RD5*-Dl^vAErinqhEppHp8InGJ!q{R- zB08*FbIRJr2z!7NiOHxr_x|=xBdjiRX$~O`pEV~f71fnx78mQo;pShfSD|@EvAOGA zIe-6x87l&`GReI0@{gi0JU+~5)Ix8SoHs zm`1y9fn73M_J|^(SH(!w5#|o@}b5nqkt0a>f(=RblGvuC9y1a965UK`G6T6a4;Aig>8^?%z5(L5hdvjV+#-Jz+#P zO;zH!<0jt;Yw>77(o$KDKU`fl!CU4F2gScOr9P`SQG)V)(lLzJ0>mWbtO1HoSz4-in9c_o!@*RrS|bo_d?qtOXDmi!T&)n~Ndl@deQ((x%V7epe1AlDx=7 z`tFYx*THtENUcQVjOK5C(q=Hu%grr5%^#>L^VC**r};|7<)1`g2g1@~ z)dbUWY1to5P_;~7rZn=eIa{_;zb+`P)TVihN2Q7AxfTgP8d(aNDru_czQ<6c9IkcZJkfoK86z)~9$x_s{T_E?NMLI(~s z0$HjkHn;BhhU{7uOPUuLkItXpUFxG6u}T@nuO>E}JoY0vD7ChG+~wINjRqqz&y2WW z==PtmM98y31`Z^{l@!H8_y7I2v|5_iYGo)P9z6Ys&hVaj)!}Jk;->k2U4rm5V~RTU z-P?v@Nt`z!TpjX}b08f=OxEw0Gc5eVT`hku=~oX#QV9pbGA?m<^*;O;WwLys})^Gc)kL==z+KH&_#L{Iy z|0z{7gUnO6>9g;4oh=76ifGc-Xf;G~-n(qa{c;4tI19ZLriP>wFe0{h&aAydT8q={ zFQ)8V=aE!r)gUaTNnlvf2#*;1$vq1&ujW_zy&*&Qf8G1>zNRSUXfUwn$%W{DE{KSA z_oTh8;l`~q$I@3TOTf<(voC0JdLazaA=nX97OmQb_*SYx#`4Q9d}Ri#L|){M|FaT9 zbXYh<>n_qPDdnP>fyvP9aBrY2ySk!EE3Bl}Rr;&S#PY4%x8Be2-39BD`nn?j9%#`N4j9vq7<=^MbubnQgtgZA1G?)iD0y-y+9IP5 zLvx~Ma(FasD7rXVoV49N1O_3?r44LZczgylBui)v$-=oSmgS*KWFZCn6SN=&1yZBO ze_0fi4X`@T$3I^&0DZ+ySA4g6PYM>BT)_Ry)8;enU+;iMF+Ad>D`%g1E_%WSDOSOV z7&GnWTKGsihBU6)3JRVt{^0adj9$hegPDa@UWi&56c_Dj`v=;=Py^6;r7rzU>C_Qf~g56Aeb$A;1PaplrBgN1%+!eYP)7yTPHu5aJG zIdDlijD)VjRT^z{%MFe3-cY5e>2$dlO@pe8aeCpNCL=L+F-pl&5j}{>Cl&t$!BHkv z{l>~h_j3U)jZPPv&%CsOso)F|$p22RG*Bfdp8WfkD)=+GssD4s&CQ`8eSvIl+7-8* zcp@fW6`N?IzH?#J=$D3s+1nra8lyumrv4M3Rh%^pJ+GI@`Q@t1PgsUdR_lI4voGeC z+zQQ__5%#qt(_NKh8+|W%q-pT4sUv(Nd-28{&?i3IcO5^Ca}2%#g50eZ$jWU-dj2q zA#-rprL9klT#xpbdaHcrN*9Z62ukmMOsMu!2(Kz(r$yS!Z9VVOV4-BlgiHQV8u{px z9&HXa8KwHNxoyDk9O%eyOiZ+kJHRnUW9oh-kB@I;8u>^BZ*90t?b_ zD%^Ng?=xYg)Gx^GWrHHfLyFM#M5AfELp{YQN z$r{ER1I&tQadPw7QdHccz&@%L@>ge9`=;r=`odciJHfor7q3#PoNtK6uAaO%NbWZgZMg%BSWJZoG*G#Pf|*eqbH>m@ITDN_J&Ky$@a&hRQ5fZs zMpplr*9k)_vYleUlEvN?r#&J?Gb(yWW*TO2kE66&p}jqIy|ftvVFWGP10mi8Z}a7V zdD3=60b@QHv>|Yk9Di~E8O6!s*1h1RFF71ytfF6ctj44!Z!30R(I$-1sy2BVoYiv@ z<|t+EsUGq7zM*fxSX7C{S%1>K@sk(|j?kc3>Um`h#5Rwft>1N@0`C+lIA`dUIAgzazVcxEZxY)wO4IKcNSJsI8p8ORmt6ghexM90%ut0_g5AAYQ&>oAN~xS zP2`>|ZRb6o-l!)!i}p*Z^$k*!d+MZJ_%-HBzLOl;2oytKzV0wt&vxIIh)(M>VXow4 zz5{*9yq~^9Ct0SL4!-OAcd!+!3CZZn^TPconQ~dfvt)IdoTvqj#DOi11A90Q zY)u^4qj6x*#DTpY2lj0o*!OW@f5m|v8^@Mf#et>7fu+WPJx=}CG!E>@7_i5vUYdfz z#UinPgRiU9iwwWSHUfL`Szv4<@U2fM7~9~r>KgTKw!nD&e?zd{F<_q(Y?*?wA6%-g zL34@)#`Xi)R155Bb-jsTonpWqC0KK%7v{(H))1^k4A>(CYZ(LfFu{&eFxJcGiof~f z1XIwtX&_#Li{$qEC%CKed`4b(d#1`PEW#_c;s;cg^YiKTrE+d!~yEHL(&XhW3+ z#y<0Pg0)uknIFUMb%33yaMu&;3=2($Jxj1|3hz70D>NCCO;8sApQ7@36m@?Rku+#> zJu@GS#qkPY<}>UN@Y!wR4L;YH_?)Ej{zJg$M-w0Tfm=*`E>ijH4iTR%iWm6soB_QJ zQGD9es7yUiM9$Vf-_`0zO|6pN~zvPEdTX2I4ty_95WIzL`}rO=VK( ze4)yBn9k7pok?t)-o7@K!SC@ps|h^`evTr$)WiqPRZX@r<#H!JUz+&zrkaSQ&!z+O z%=vU6{cYl-mpK2gFP}bC9ekim@Nv_DbRIi#{W9kNczphCY7caV_#gP-^Aa6Mx0v_< z#`Gl6^pDG(^tQ{y2mW)os)zpRrt)RM2(bg@^M#2I+H)!$@IPqJ6?7n7Y2u@oIRB5= zo}DH>nAdrYV{XrJA!oYQ(s+C@2Qog|Gl>rPIJD0iS&qKBYS8D7|$EtHK1Q zcz(iOAyGyWfF zdw#OCXO*Ib_N)U#N>|U<&-i~R`EYw$D7}rk^x*mIv9#wwBFTPdwd(LQ*a00xdpWNn4}%csAEkMDXL zNymcv^2wmu=pRjuPwt=9H#m~D749#eatoi|ZnTkfEZAQ@6&5~2ZgM1RE8Jf`l@>np zZ?=(iEQrVF2h;dLFP0DLo_eoGz6+6v?GdEe5W@2NKPfgeKJycGWvr~T!FzCnAK&$gwBc>p6G zpZ84dX+gMuDUyhH7O4CeOI0SpslI$5zj>+SQx&KFD**!qt}h?>9Vb3-FFSZXZ<+Ll z_8i7SQGT2vpLy4z<%9M#cHncxA>i|-r9I6|eB|$5iTCzH%m?i;^J%T(#N*Z+yx!h5 zwFiC&dv|ba7(YHbka}~VtzX9c&#EAjws_|qQ`yl(f%p0_el{qIHy&a>$re6EYJNB! zlWaXwecOZnDN*#Gw_8>If%Phr;1rLKd4C7}gMB2`3}anCf)#iWe6Zik)xoDL@xgS1 z_OR^*4gsHSCO+WDaWD3}YYsz+5VJSx=S2TWMCr4Mq#--kdD~Qm_V7J6v}dQb6-7RDqpF}(f4@L{6soB(9w|&+@nLk+^_I~(s4H(xMu^MuTW*Ek9yD_`nC@pz34!B8XYWmf68OL0(URfrIRfI z2D{cD9RfA^blDAgdNrdUf`cB!F+M=gO$KV^>ptWY&=4EH0JZ|0tDYd``G4zYIhFQB-f!k00dod|jnE8NY*&++p-N_8&^aKIw_PDhIk*C6Wxcsk|;eS)(x}C}m6H|m= zXksM&r|0d&3{g%|a!{6r#aNp0{d81PX^?6hscM}{S2cu((lFtci%>#n16B86WjIXH znJ7w?RQ3|q!=d6ej&x8>++3u4U7L}TMz(gfP$i>DGa*?oEDGt_6dzHjCQ2^yO*)m~ zq`wlWhzj!-r1mgb_lh&5YdYHJbMSq*6gRyLh5nkcMpq$5aCPJZ1* z{#LIW;dEdvW;&p)$yP^bo6A@VovVxHhzMtfjV6!Jb)0%^veC;fnyYn6k^W2)v&AqP zjegQQ+K#reRm>r59!+d(v2a~953!UkiXHU)M7m>NDyC8kLEYK*FrrzDITEjiEMO4b zqe886k_ncXOGhQ;{dA8^w_O*xE1ioIjP=Cl2#@{qM9jk@xrWF-SvwK_POxT5HoW-D z`HwYf?mzQ5jL<*WHn1#gCBvz|r;y#bC|=QJvqRVe$Ckg7symQgbJkzvhygSk^rb$| zpj---44}VU`WrxH`C=f!JnDKN!BGqFenf@G_rbQ4Wj6c3NN>f5a&N?L?=h;q`J}ms zk2Ld|EYO!OH76eYEXZDBIN9F0(tAg|gt?48T5Q?dD%m4)qZLzVOk%9{F?s*V6pQu~ zwS>>q4z^eH2mvtyx1x~vo=aEdG+UKZKBBRBIIMq`%RZ{uj?8U~@N!WIrq?;x7O^Eo zr1g*NCa=M&A|8zXh(1p^L~URz8cFkX4#|zE7qZ7H=lGc62Wow+8}LQk zQb9+M4n$S3mqhRm33bQTTu#0jagmGm8=^J*|7vW=UORSdSVUvKOjMCRSWA%-cS6l_ z9FtBFNj^m>sWO_$r#Pmsyc$MxdMd>$DdY#zDOMgx#{eqpN9SBRhEZugL0#l2^d5;l z0*Vwy5v|0qW=kRq(N_RT>Ke0hh^)3$ju4G7urkJZ7D1-bpI!%k3G31%YB{_G#*;>K z#StVWtiF;UHDresbe>K%{gNBzd(=bxH%(Hlpu9Qu2Q9<}=MpU!?O7#i5zp?rj|>y% zBsr^>5hutEPuw{n6<#}}$l1;%PD)sVW1|X^w}!Z4);U?#ii``M=jyu-VG6^EBG%!& zPDT^~9nX7&^eE;Q%TZ+^p{50DfAy>A)hev=@0RJ8u7$v$sj(b zB;>^-(!6WYhp0jJ$Vv)30ex(38Am^0i)MrT4O^T|Wu4>1&6ZU={n)%bI zZa$si^D-!(OWrO+`Z;)sG=k*Oc_8_#90~Ez6}(}t^nUPw_>0YptyW*%!PDrmMPH)b zm&OcMcPQ;kekq-ffpqjD>P~CESYD}bLMeD9q-&J*nW!JIR};T=JX*|@T%@x^^;loy zq&>vyVHfEl5hacbBGICYbeO0X``?Jw!M3Kz7{EpIeWLojvO&-BT!OPp3{F_ri8s&T zF8U=!BHq0Fa~eq;k$WDu`3R_QN}z{4IZfmk5tu)Xem<-eyOBqosPKX7 z^^z_Fc5+cxF1$1Xf;5++1z6vrG?{(@)-y^EW@_;{M5Ir|;cOe1G}&TE!rEYJ5q+l_ zx=1m4^ib;?R?2$P`}F?>eMk3bnuE%0MsGFXkpVJ+51W(5LU>(7?aakfAMfU>yCfAHNuF?&y zVJ}J_&4>ZHZX&Msv6f-zi0L`?4A#XukNBglzCDv+(zx!a;dPitq-QWwaNC?mAlFIc z@#?Rm=$?s4^`GK^S(DrNpX~eSc3~DiP_Ed?;kt<|&dQZXX+)bD(vtOghey)>cpEE+ zNKdmi`x-W$DqD>)kF}cKhR8_5&hCM=3u`m3$y^U@yZSm<31Thg%9_KDG?yjn8@o5? zYxo!T27Qg*iTG)(Jar!Ny+J=i@A3WgfyFx9e-TSEk5$%(lgEs-GI9I^9qBP-B%(yg z`ShS1p3S8P-teUa`8GEBz-nr8O26JI$-Prjd!?lHPEGBd(N8|;N>4q~w+iS@ck~r0 zJSdrwmN8&}%;5>apnSM9Sw0?$Yx&w$!V=;=`9Jax4`Xs-7=9$qd4@URePF@EbBDm= z-|sOEK7$t1!NaBJ(Qz6bW98$$=S(V=QXl8W!@+oX6ZB4ag)Z9Skyp{?oa1ECNw}cY zo}VstfheAcrEPq9I;G8|Mn@E&fRkASJT%Jhs=%|FcwV^uEei8QJW<;QwVO1-!?ZG) zYvb`$*$B5g3bu;m?4eq>T|)Gyn`IU~)H4g%e%G#?lPG-7j4!Jq;{LWM-D$4{Ws8U*Ww11`9+;=Dg+g42VxM&1RK=9S7UB`Tyf2a zJO*t{@f7l3ItzQF@dJdI;sR(D7tTT^Jl>s4uVv;>D4Au6X+xlBM&#ei*o5v)i2MUM z8xX&cm`(?h4TwkdW3~uDYm4BMWWw-@{)$qHg5W0-NZfd4DxE24LR?5?ZX3UoiII8q zQTU?&D1=Tn`-~$ys##^nn3M^f9Q}2qC|U4Z4kVi__(93z6662`^_Z#z&?-)AMM?fh z!1k3SvvQtPnCzNZvv)BC>v>0;g(Y3@sL5Ttr*2aAb)A>&u@HbcBK1*zQNN1%f5Rr> zp0`ka?` zfa)+qqNm(+AX%N45O?YT!Gb4L+nq1|JpG;P+K;-s`)L)~Uw!q7S$G&Ml9i21{+taE zX2VYC1r$1^=T)Ii51*1ANaZrUsm|;-jki0oP}>y3N_93y%37rk`Bm{l#h4K4in!f#jv&|$Xdl14Y5*1BNsVfl+1eAb}zQ=V;3We5y{T2;CH zC58Oij{c1inblwSY|g?5>ZQ&2V=r#~?bJcH{>1@zlm0Y#=Z~v&voyyYFsnb#)M5poFz%|zxp(lagCbwX=?RTYi2*X`1ui+ENSxR!(UDM4NbL{!A0m_ zEEqvAWS=GZ)B#a1bj#9a_yJM{y{ui@kdI!*@0j8>ME^mN{+}x+Yz!kp9^aA+dbWSy zguHw5p7|@#{k3$bGBn2gNkr7IOEwDK@{146RLjtP`ezjF=IKH(W-?DKQ$Wl}@tSHN zsSLl&Mf$;ww|#Kx^&hq!xp>Cpg|m)JBbDkV%O+~Ae1|Gv4{+cv3vGz$vbc5Ju5F5~ z&1Jc%3-{YAo$&8LFFZQ-$x-(;J-@-47V8%?7cgP3iAmzTcb|6kxZ$D^7dGxU?TH;T zz|LP;N z)jlD!wQN5p1_Y97VyMT^v(5~MX6QM23#g?&Dp}rk^ACTXQkJvo`^h=??%4DIRAMbd zj6GJH8Tph5hzt21cPe(H+^uvVe+z1JInA0?6N(pa%6EtSZu$_4+Z%MxK)sOsn4A8? zS(8t~dzB>@{&zt3jkxTnb~pXr{FlSVK6}sR-G}$zaV`kfM=?)~xG^)_`{5C5uPHfw z)wfrzhhnT{&8SR%Ql*f-(Fek!4&z4_xlz_kep;?sGkn93nmSdhM*Bh2;zUBDz zoUCd47q7)w0VMZMmWiHqGhHwlLwogUYlDx&7w;SUspsy8UOJ*<>YRmWtF_E%D?WoK zxyTpt>up6@v%H9b$Ws1Zo*UmeY}SlcI=<4L?$Pv}7jM9=g-YG!>I)1(H+_&$*9v`@ zLicnf^toWk<<D4>pko1ykXb=yky^N`%0!m zN7gd*gk+vKt41=ZJBLf$RK(UmS^0VTo^JYJYMHyF)?G@UWcT{2bsd=WLdH_6&*X0M zqwZiOeVf_sFP9gkVftD&tzi!%7XKY)^zp8$b~93+$y@$LPSVmpZ}dP#)-w2#68dP< z)N$cZ1%2n3x|>p6E&W5On~R&}&^JdkZ*{X~BdEE7u-4OE1-M^Tliovj9vD*ez4nm1 z9ABL38g!S+9S(Pm`d+iNE~qa+-$(V~%RH>Y5)4FAA$)!b@q;M#6mK9(<;!1WM{-P| zUgmX^!an#A2rhH8qGnsQ?N$J8OSZbUFC$|IN90M~QPpgb(|TeK*N0@Mx!*C>*$d9S zaqXpt4_|xMS64nZtLZ`(8{`pYBO!QMws)<6;d2k>K3sEo=fLInYffeG31n3@;gE;E zE>%G{5Kvnm{4R{xGIOzn@js}PHOFP~&h_eX5O4~-oXTLBkpK!c4`t|tsR0S&)EbGR zJkiwgf5~=#ge;WU2x8lAO!It^s$U_A*mr`jQsv@mm5FV~T@{Ai!rxL5-r+x;i560( zu+kTFSJOuj-E=Nf9|m^Q=XKpP>2uly3Asx&@>=xO`?B86JOOV7IjC|seNikZ!v%bl z)R+|LQ-Pt{-uu5yS=IK7e#h-OHSfYZvYLPT)3bioCIoG$q-{s%GjILnuK6Doj+yu1 zf;X1e7JHq_4su9whbpddPxT&BkaPFFyE1R|uNi$?n~~>>%}YOaD*Mk4DQ-)mp##Y- z-|)r{Lwt9Pc;@&N*U%%s{nM!oHy_Atg}enC1p?{~*LAJ9)UAs3$U?Z}By?aQB{t9~ zq?DT=ICH9Z2Yje%*tQcf<;R>=CX=RO4%?+vbHC?~+n%Z^_D(I#UD$o~j^lFDJHMyo z!U^4i0Wz~RDJ$istMS8c$LXNIpUg0}vG|9dnRuss3R!~&)h;1LDn zfaWN5eV01hP7R(+8Tdrii@|78h6YtITY2^`ok0?Vxi|hBNH-7&@36WuxA2 zg=x(K%-9_B4IDIkN!rZKJ>&ukn;4Eb_v2iZwFn4JR_j-pmNC5SBj#o&A89q zOIa-f1SH;6Vr1FNtq71I!I2kFGNN4b0+y=~xD6}SHE*8F*y$?E5LR|Flk)BvwHoCi1x$V?^N!iT2jLeY_zv3MkY`bJKO9n(V@k>?1 zCLvy{*3r`a>l89`mlPO@3olVf9b##4mqM_u6pmIk{vAsuycX_Oiwp@hpzw_oYv8H< zCFD7A!5!cJJSz8@uB8`!x2;7lCImV$)rdFPv4+^J|36pbzM=;2FHg$5YeIs6P`9J3yU#`5mWc68pj$QH6f>Xcj(m3j&hyPW+@qbp0>$gl@ zH*jU^+((k0I_A;Lm+Pm-|3=^VKdZ)PQqT0i@Xm8%9&Yf*VSfy{@Vt5r>iI(Su=h<{?(U+H zk9LvhGuE@^N4x3n%QSkuDZP&r5%ED0Ky(EHekFn2ZK2(J`M8uL03ka7*Qgr$QxvF& zU8z~BRNj5kDty(r$tvDZrL;WL-%hIq<$GZBaRXqcKQOhAybsyCQk(?Rl)BQ9H-p~Y z>YhpWqun(`h4$Qto__BsgdIA0e^Or$m{~)VLSO0B1K^4+1)ZzDx#!kqXn|V&J_UjP zYnu3vb`P}y*)19+J7uTqyGH|ZQgZsH(@TDHb8~b0Cg-Gj^0M=?2lUO&&Q9rjK!qQawc7HV3b^Exx|Go2!6IQ*y7BH(c*6Te$qQuK# zmL<-Erkirbyze|>Xv4gp^t!gnzp8TEY5mOGHeCA5?HlKXD%P7NIRGh^ZW8lu^N963 zJp&XQ`}V_R1zDudP1JdgI*WNK(_5)C?vj_0SXGxW6?0#38P3nE3)^M|z9F+&0d3m~ ztc&Lq0<$~dor8l^^bYFog{0`O{!z5*5$lN+%xAz4fl>Yk$;n?qk(6xjJTTZ&rK3B6 z5Za?Hl;R?S8jz9VA|eXGffN_9BOzo;G>7N*F$aI9fJ}wmmeBwNN014!ff^D6*@w#S z9ZZ%W`^`?9k1%%!Mm!F1!P)aoowzZtX$ob<@w+z7!a0fLgy$wKeK&bta_-zZ`kOm< z9*uvxmvQkBA-D_?5k9YWK1Mt7SHX8rtey?So z`ok<6{+%`BHv+%r>HbmlH$H!7X2(~i+wi-cb*02lOUsVJ|7+CwnLnK6v*GXfbEU+e z(0_Ck{&&rXWTuy$W5Z8>m+`w?=OkM@3M2#pqm=Ex8c)^#y3Hq)6ZWN zg-;vngDU@S925Vn2XC|CdrChcn}|*g#qUy{j+<9R;V=EYVKY#DA%q^e&%EQ)Z z#JUdiCH|_zw?yIp^vQzEW1HP#!$0GR!4iM^*{?_8Kep_F%(uVoVZ(3S?LKM$XTA1j z6n@9hj?CxYT07VfL}ljx^4?IHUH?`T{*^BtIizc=c{cpN>s z)F}FWd;FHU^^uu2d#K6WEAhMC+Aj+KvfW!US9}$);dhunTcg>{C+Sx@m{IjoqOybjnVNv)U zKkuG7WX*6JejxKDiQnzRnkfA6g^e>$-!;I7zjgGx62H~hc~SVwpMP`kx{U5N{P*wF z?Z4yvg;Dso%v>?}sqJlT_~*CUCF$>YDti20x8laZe_m)Gzgd@kA@MUu-Wo;!@U1ru zcJ1D28!v5FeJt@`?Rjq${&P8x4(@RMlQ#TOJ6@IeX~#Ykg`Ya}_rb58w8(}(XYs=l zzx=RuQTS=wQZt7&9b>~E?bZExdHLoj{04*1&m3}E0~`L!zv%OYSo%s7e%i%%W?nnz zU$*hsd;X8op3C#2$8Y=FU&|c7v9}F>Q%#bNzaV=2-ulLGnb|$I+Q#GEG3XW${^ zKprqR9k@mwKUqfJO-DyMaLsvyF1YSM2l9a9Ks}V5sLr@X9uM6C4|$w{@YfzM}5$P&VYvldEf&F zaO4}SYvh3sT>=k%(2fqq!5P<$=s+Fh84oZ#v4Jp;ad5_ULpo50VXY|-T$G~>dDsE) znWu~Lz-vGU;K&0Xd6WT;Ir{;N|5Kf7Fxg>~;Ka zziO5h{Be{G|Jw(zk@!VjCaS@$<6kr4u&ho+cISQdkR=lTim{WT@Tu#vZrz%1qkqlJ z(bjuz2`-wqO_*-r} zHtX9B_V(s)^GN*m_i^yc^0dur_T>nh{0sK2mH3`-21e2E(yvw4?RVJe?~5VNt0d1? z4)QFE(cZKe?OlJ&Ua6l}S<(7gJhN%mj<%UL{WLyeQV#U9YXv)Ry}f0DmRW!1X4vo> zt+`R+-x}h{LC1gR`qo*i#tgRMpLoeqiC-7q6r~>;f?1CbxA#|)GFXfQ3@Rj?F$j@x z#-K)Ghk!gg6Lwl~bjY)VM4p{1^6Z3>XGe`ZJ8#Mgwq@7?w*z(>bFiWk5pqrUBGQ3#YKcl;6st(B6cE#4iYT^VrN1+OCc^&XO{6gb#1&_B~ul!@T`5Q z!p{^iu3TlrPM{oMm(?{w&&Vn#oUCVdAApf2!=%~)N zhV&r7WCgUUV~#2p^HheZ;Sz>mKAar&KAQ5}gjZKryNOPe+H9IDu*#PMr;fUcoQgf_ z6!V%s=ZrsZPy+niX!^j%5uIG(T$aaz4_WN^`|2_`!BL3y;<;%0&hppIZTg(VAKKW0 zA6tHjFMJmLILlvGw@{ZyTx`L2mY+Tlmiy|K(d3}&r~kUT)Sjf;<9| zMs#4#;{XPE4q!M)!2$qzoDszEYW5hF#~G^;Uin~_MjmIZP_TNz3JNPS>$l`2;#-;(3YsL2#dtZ$i6_$xz3P{vY#wK&gcHi^AQm&ST8FM^}M@g9dX=8g3(oJC=co4$Tz#c`3!yEJlQp~%g^G^OO_m(#ndAd%1$HPSQ zDzrf%br}g44Q1f7$!!&IrNTCVC~u>Htf_J8T8yGhL1A{`h}P4ttKvy;p3>dahnMYP6!rI=~I80Gb;T^L=T32(hs;cAIRy2sj<2DA|AzJf`;n&?+1+b);u4 zoav{h!u)|^~ac*#3lA19Fs@ zWt2YW>o9}eKFm0j*vjOr!$@5CqC$F1$F=`2Qbk-Lp#wCNm>8q-uV$oJ`9cM_O`T1R zJva9>RY+l{C9yL95gdx)?)op)_$K3tqWw0Nb@W8he0rh?t&D9dLr=*6-)Smw1a}z@ z6rH0#?4d?$i^e4!fp{Hu^ix3tunSLWiLeq%N3AkuxZMj@MIvvAx7fD z{t9UYv#_4Ks433o*jEkv*N_nk+wRzZP!Q%bTTNZBSn2ciK9yOi&c+0S*C?w!GGlf; zT|uQkVG8E6TS?9Ac{ab_j1-jzMLLpH#c>MA6>ntZP72{}RbbN#ZQBhUsDM_z;7e6{ zvO547U%2U@X_>c4uo@p`I&_FaCU9CsXO#ZM2kVw(f4_^hgE9mJQa za9N8@M!QtpeIS9~`zPCd1J&AVREG z5NoRzsB&?M%5bY*QrB!u&naj9GFPykyQ>1b8jdHKksKRC%VL?V)%4dM0Az>s)vMSb zu74(ley;Vp_oUESRkS;=u`wVn`gW$C z>~+>D$Rc&-PF$$2#bqkfAf~G&gxIqKJN=*{<1k_U=?TRK4$pZ_0c}3M0RfnND}}_H h;CwA_kI2_`7iggn{dhBI`c??)FahK@T-5#c{{s@G#p3_~ diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp index 0caaccce9..a7b4cae8b 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineAtlasImportFactory.cpp @@ -37,7 +37,6 @@ #include "Developer/AssetTools/Public/IAssetTools.h" #include "Developer/DesktopPlatform/Public/IDesktopPlatform.h" #include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h" -#include "spine/spine.h" #include #include #include diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineEditorPlugin.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineEditorPlugin.cpp index af2bfcd45..3b0fbcf5d 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineEditorPlugin.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineEditorPlugin.cpp @@ -39,11 +39,11 @@ class FSpineEditorPlugin: public ISpineEditorPlugin { IMPLEMENT_MODULE(FSpineEditorPlugin, ISpineEditorPlugin) +void FSpineEditorPlugin::StartupModule () { +} - -void FSpineEditorPlugin::StartupModule () { } - -void FSpineEditorPlugin::ShutdownModule () { } +void FSpineEditorPlugin::ShutdownModule () { +} diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp index e9ff88eb3..8ebeff1e8 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/Private/SpineSkeletonImportFactory.cpp @@ -37,7 +37,6 @@ #include "Developer/AssetTools/Public/IAssetTools.h" #include "Developer/DesktopPlatform/Public/IDesktopPlatform.h" #include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h" -#include "spine/spine.h" #include #include #include diff --git a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/SpineEditorPlugin.Build.cs b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/SpineEditorPlugin.Build.cs index 258106bb0..c0c78d618 100644 --- a/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/SpineEditorPlugin.Build.cs +++ b/spine-ue4/Plugins/SpinePlugin/Source/SpineEditorPlugin/SpineEditorPlugin.Build.cs @@ -9,7 +9,7 @@ namespace UnrealBuildTool.Rules PublicIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Public", "SpinePlugin/Public/spine-c/include" }); PrivateIncludePaths.AddRange(new string[] { "SpineEditorPlugin/Private", "SpinePlugin/Public/spine-c/include" }); - + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject",