diff --git a/.gitignore b/.gitignore index 48c4c8354..1d65a51c3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ target *.user .DS_Store + .idea/ build/ @@ -39,7 +40,9 @@ spine-cocos2d-iphone/spine-cocos2d-iphone-ios.xcodeproj/project.xcworkspace/xcsh spine-csharp/bin spine-csharp/obj +spine-csharp/src/*.meta spine-csharp/src/*.cs.meta +spine-csharp/src/Attachments/*.cs.meta spine-monogame/xamarinstudio-ios/src/bin spine-monogame/xamarinstudio-ios/src/obj diff --git a/spine-csharp/README.md b/spine-csharp/README.md index 5176e7000..f5f25a977 100644 --- a/spine-csharp/README.md +++ b/spine-csharp/README.md @@ -10,14 +10,14 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-csharp works with data exported from Spine 3.2.01. Updating spine-csharp to [v3.3](https://github.com/EsotericSoftware/spine-runtimes/issues/613) is in progress. +spine-csharp works with data exported from Spine 3.3.07. spine-csharp supports all Spine features. ## Setup 1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip). -1. Open the `spine-csharp.sln` Visual C# 2010 Express project file. +1. Open the `spine-csharp.sln` Visual Studio 2015 Community project file. Alternatively, the contents of the `spine-csharp/src` directory can be copied into your project. diff --git a/spine-csharp/spine-csharp.csproj b/spine-csharp/spine-csharp.csproj index 8491dd148..b4916ee9b 100644 --- a/spine-csharp/spine-csharp.csproj +++ b/spine-csharp/spine-csharp.csproj @@ -70,10 +70,10 @@ - + - + Code @@ -105,6 +105,8 @@ Code + + Code diff --git a/spine-csharp/src/Animation.cs b/spine-csharp/src/Animation.cs index 09a1f72ad..e56e4ae33 100644 --- a/spine-csharp/src/Animation.cs +++ b/spine-csharp/src/Animation.cs @@ -43,8 +43,8 @@ namespace Spine { public float Duration { get { return duration; } set { duration = value; } } public Animation (String name, ExposedList timelines, float duration) { - if (name == null) throw new ArgumentNullException("name cannot be null."); - if (timelines == null) throw new ArgumentNullException("timelines cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + if (timelines == null) throw new ArgumentNullException("timelines", "timelines cannot be null."); this.name = name; this.timelines = timelines; this.duration = duration; @@ -52,9 +52,9 @@ namespace Spine { /// Poses the skeleton at the specified time for this animation. /// The last time the animation was applied. - /// Any triggered events are added. + /// Any triggered events are added. May be null. public void Apply (Skeleton skeleton, float lastTime, float time, bool loop, ExposedList events) { - if (skeleton == null) throw new ArgumentNullException("skeleton cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); if (loop && duration != 0) { time %= duration; @@ -68,10 +68,10 @@ namespace Spine { /// Poses the skeleton at the specified time for this animation mixed with the current pose. /// The last time the animation was applied. - /// Any triggered events are added. + /// Any triggered events are added. May be null. /// The amount of this animation that affects the current pose. public void Mix (Skeleton skeleton, float lastTime, float time, bool loop, ExposedList events, float alpha) { - if (skeleton == null) throw new ArgumentNullException("skeleton cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); if (loop && duration != 0) { time %= duration; @@ -131,12 +131,13 @@ namespace Spine { /// Base class for frames that use an interpolation bezier curve. abstract public class CurveTimeline : Timeline { protected const float LINEAR = 0, STEPPED = 1, BEZIER = 2; - protected const int BEZIER_SEGMENTS = 10, BEZIER_SIZE = BEZIER_SEGMENTS * 2 - 1; + protected const int BEZIER_SIZE = 10 * 2 - 1; private float[] curves; // type, x, y, ... public int FrameCount { get { return curves.Length / BEZIER_SIZE + 1; } } public CurveTimeline (int frameCount) { + if (frameCount <= 0) throw new ArgumentException("frameCount must be > 0: " + frameCount, "frameCount"); curves = new float[(frameCount - 1) * BEZIER_SIZE]; } @@ -154,12 +155,10 @@ namespace Spine { /// cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of /// the difference between the keyframe's values. public void SetCurve (int frameIndex, float cx1, float cy1, float cx2, float cy2) { - float subdiv1 = 1f / BEZIER_SEGMENTS, subdiv2 = subdiv1 * subdiv1, subdiv3 = subdiv2 * subdiv1; - float pre1 = 3 * subdiv1, pre2 = 3 * subdiv2, pre4 = 6 * subdiv2, pre5 = 6 * subdiv3; - float tmp1x = -cx1 * 2 + cx2, tmp1y = -cy1 * 2 + cy2, tmp2x = (cx1 - cx2) * 3 + 1, tmp2y = (cy1 - cy2) * 3 + 1; - float dfx = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv3, dfy = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv3; - float ddfx = tmp1x * pre4 + tmp2x * pre5, ddfy = tmp1y * pre4 + tmp2y * pre5; - float dddfx = tmp2x * pre5, dddfy = tmp2y * pre5; + float tmpx = (-cx1 * 2 + cx2) * 0.03f, tmpy = (-cy1 * 2 + cy2) * 0.03f; + float dddfx = ((cx1 - cx2) * 3 + 1) * 0.006f, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006f; + float ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy; + float dfx = cx1 * 0.3f + tmpx + dddfx * 0.16666667f, dfy = cy1 * 0.3f + tmpy + dddfy * 0.16666667f; int i = frameIndex * BEZIER_SIZE; float[] curves = this.curves; @@ -179,6 +178,7 @@ namespace Spine { } public float GetCurvePercent (int frameIndex, float percent) { + percent = MathUtils.Clamp (percent, 0, 1); float[] curves = this.curves; int i = frameIndex * BEZIER_SIZE; float type = curves[i]; @@ -209,8 +209,9 @@ namespace Spine { } public class RotateTimeline : CurveTimeline { - internal const int PREV_TIME = -2; - internal const int VALUE = 1; + public const int ENTRIES = 2; + internal const int PREV_TIME = -2, PREV_ROTATION = -1; + internal const int ROTATION = 1; internal int boneIndex; internal float[] frames; @@ -224,10 +225,10 @@ namespace Spine { } /// Sets the time and value of the specified keyframe. - public void SetFrame (int frameIndex, float time, float angle) { - frameIndex *= 2; + public void SetFrame (int frameIndex, float time, float degrees) { + frameIndex <<= 1; frames[frameIndex] = time; - frames[frameIndex + 1] = angle; + frames[frameIndex + ROTATION] = degrees; } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -238,8 +239,8 @@ namespace Spine { float amount; - if (time >= frames[frames.Length - 2]) { // Time is after last frame. - amount = bone.data.rotation + frames[frames.Length - 1] - bone.rotation; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + amount = bone.data.rotation + frames[frames.Length + PREV_ROTATION] - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) @@ -249,18 +250,17 @@ namespace Spine { } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 2); - float prevFrameValue = frames[frame - 1]; + int frame = Animation.binarySearch(frames, time, ENTRIES); + float prevRotation = frames[frame + PREV_ROTATION]; float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent((frame >> 1) - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - amount = frames[frame + VALUE] - prevFrameValue; + amount = frames[frame + ROTATION] - prevRotation; while (amount > 180) amount -= 360; while (amount < -180) amount += 360; - amount = bone.data.rotation + (prevFrameValue + amount * percent) - bone.rotation; + amount = bone.data.rotation + (prevRotation + amount * percent) - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) @@ -270,9 +270,9 @@ namespace Spine { } public class TranslateTimeline : CurveTimeline { - protected const int PREV_TIME = -3; - protected const int X = 1; - protected const int Y = 2; + public const int ENTRIES = 3; + protected const int PREV_TIME = -3, PREV_X = -2, PREV_Y = -1; + protected const int X = 1, Y = 2; internal int boneIndex; internal float[] frames; @@ -282,15 +282,15 @@ namespace Spine { public TranslateTimeline (int frameCount) : base(frameCount) { - frames = new float[frameCount * 3]; + frames = new float[frameCount * ENTRIES]; } /// Sets the time and value of the specified keyframe. public void SetFrame (int frameIndex, float time, float x, float y) { - frameIndex *= 3; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[frameIndex + 1] = x; - frames[frameIndex + 2] = y; + frames[frameIndex + X] = x; + frames[frameIndex + Y] = y; } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -299,22 +299,21 @@ namespace Spine { Bone bone = skeleton.bones.Items[boneIndex]; - if (time >= frames[frames.Length - 3]) { // Time is after last frame. - bone.x += (bone.data.x + frames[frames.Length - 2] - bone.x) * alpha; - bone.y += (bone.data.y + frames[frames.Length - 1] - bone.y) * alpha; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + bone.x += (bone.data.x + frames[frames.Length + PREV_X] - bone.x) * alpha; + bone.y += (bone.data.y + frames[frames.Length + PREV_Y] - bone.y) * alpha; return; } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 3); - float prevFrameX = frames[frame - 2]; - float prevFrameY = frames[frame - 1]; + int frame = Animation.binarySearch(frames, time, ENTRIES); + float prevX = frames[frame + PREV_X]; + float prevY = frames[frame + PREV_Y]; float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - bone.x += (bone.data.x + prevFrameX + (frames[frame + X] - prevFrameX) * percent - bone.x) * alpha; - bone.y += (bone.data.y + prevFrameY + (frames[frame + Y] - prevFrameY) * percent - bone.y) * alpha; + bone.x += (bone.data.x + prevX + (frames[frame + X] - prevX) * percent - bone.x) * alpha; + bone.y += (bone.data.y + prevY + (frames[frame + Y] - prevY) * percent - bone.y) * alpha; } } @@ -328,28 +327,27 @@ namespace Spine { if (time < frames[0]) return; // Time is before first frame. Bone bone = skeleton.bones.Items[boneIndex]; - if (time >= frames[frames.Length - 3]) { // Time is after last frame. - bone.scaleX += (bone.data.scaleX * frames[frames.Length - 2] - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * frames[frames.Length - 1] - bone.scaleY) * alpha; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + bone.scaleX += (bone.data.scaleX * frames[frames.Length + PREV_X] - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY * frames[frames.Length + PREV_Y] - bone.scaleY) * alpha; return; } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 3); - float prevFrameX = frames[frame - 2]; - float prevFrameY = frames[frame - 1]; + int frame = Animation.binarySearch(frames, time, ENTRIES); + float prevX = frames[frame + PREV_X]; + float prevY = frames[frame + PREV_Y]; float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - bone.scaleX += (bone.data.scaleX * (prevFrameX + (frames[frame + X] - prevFrameX) * percent) - bone.scaleX) * alpha; - bone.scaleY += (bone.data.scaleY * (prevFrameY + (frames[frame + Y] - prevFrameY) * percent) - bone.scaleY) * alpha; + bone.scaleX += (bone.data.scaleX * (prevX + (frames[frame + X] - prevX) * percent) - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY * (prevY + (frames[frame + Y] - prevY) * percent) - bone.scaleY) * alpha; } } public class ShearTimeline : TranslateTimeline { public ShearTimeline (int frameCount) - : base (frameCount) { + : base(frameCount) { } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -357,31 +355,28 @@ namespace Spine { if (time < frames[0]) return; // Time is before first frame. Bone bone = skeleton.bones.Items[boneIndex]; - if (time >= frames[frames.Length - 3]) { // Time is after last frame. - bone.shearX += (bone.data.shearX + frames[frames.Length - 2] - bone.shearX) * alpha; - bone.shearY += (bone.data.shearY + frames[frames.Length - 1] - bone.shearY) * alpha; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + bone.shearX += (bone.data.shearX + frames[frames.Length + PREV_X] - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + frames[frames.Length + PREV_Y] - bone.shearY) * alpha; return; } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 3); - float prevFrameX = frames[frame - 2]; - float prevFrameY = frames[frame - 1]; + int frame = Animation.binarySearch(frames, time, ENTRIES); + float prevX = frames[frame + PREV_X]; + float prevY = frames[frame + PREV_Y]; float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - bone.shearX += (bone.data.shearX + (prevFrameX + (frames[frame + X] - prevFrameX) * percent) - bone.shearX) * alpha; - bone.shearY += (bone.data.shearY + (prevFrameY + (frames[frame + Y] - prevFrameY) * percent) - bone.shearY) * alpha; + bone.shearX += (bone.data.shearX + (prevX + (frames[frame + X] - prevX) * percent) - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + (prevY + (frames[frame + Y] - prevY) * percent) - bone.shearY) * alpha; } } public class ColorTimeline : CurveTimeline { - protected const int PREV_TIME = -5; - protected const int R = 1; - protected const int G = 2; - protected const int B = 3; - protected const int A = 4; + public const int ENTRIES = 5; + protected const int PREV_TIME = -5, PREV_R = -4, PREV_G = -3, PREV_B = -2, PREV_A = -1; + protected const int R = 1, G = 2, B = 3, A = 4; internal int slotIndex; internal float[] frames; @@ -391,17 +386,17 @@ namespace Spine { public ColorTimeline (int frameCount) : base(frameCount) { - frames = new float[frameCount * 5]; + frames = new float[frameCount * ENTRIES]; } /// Sets the time and value of the specified keyframe. public void SetFrame (int frameIndex, float time, float r, float g, float b, float a) { - frameIndex *= 5; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[frameIndex + 1] = r; - frames[frameIndex + 2] = g; - frames[frameIndex + 3] = b; - frames[frameIndex + 4] = a; + frames[frameIndex + R] = r; + frames[frameIndex + G] = g; + frames[frameIndex + B] = b; + frames[frameIndex + A] = a; } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -409,23 +404,23 @@ namespace Spine { if (time < frames[0]) return; // Time is before first frame. float r, g, b, a; - if (time >= frames[frames.Length - 5]) { // Time is after last frame. - int i = frames.Length - 1; - r = frames[i - 3]; - g = frames[i - 2]; - b = frames[i - 1]; - a = frames[i]; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + r = frames[i + PREV_R]; + g = frames[i + PREV_G]; + b = frames[i + PREV_B]; + a = frames[i + PREV_A]; } else { // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 5); + int frame = Animation.binarySearch(frames, time, ENTRIES); + r = frames[frame + PREV_R]; + g = frames[frame + PREV_G]; + b = frames[frame + PREV_B]; + a = frames[frame + PREV_A]; float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent(frame / ENTRIES - 1, + 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - r = frames[frame - 4]; - g = frames[frame - 3]; - b = frames[frame - 2]; - a = frames[frame - 1]; r += (frames[frame + R] - r) * percent; g += (frames[frame + G] - g) * percent; b += (frames[frame + B] - b) * percent; @@ -469,18 +464,17 @@ namespace Spine { public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { float[] frames = this.frames; - if (time < frames[0]) { - if (lastTime > time) Apply(skeleton, lastTime, int.MaxValue, null, 0); - return; - } else if (lastTime > time) // - lastTime = -1; + if (time < frames[0]) return; // Time is before first frame. - int frameIndex = (time >= frames[frames.Length - 1] ? frames.Length : Animation.binarySearch(frames, time)) - 1; - if (frames[frameIndex] < lastTime) return; + int frameIndex; + if (time >= frames[frames.Length - 1]) // Time is after last frame. + frameIndex = frames.Length - 1; + else + frameIndex = Animation.binarySearch(frames, time, 1) - 1; String attachmentName = attachmentNames[frameIndex]; - skeleton.slots.Items[slotIndex].Attachment = - attachmentName == null ? null : skeleton.GetAttachment(slotIndex, attachmentName); + skeleton.slots.Items[slotIndex] + .Attachment = attachmentName == null ? null : skeleton.GetAttachment(slotIndex, attachmentName); } } @@ -503,7 +497,7 @@ namespace Spine { events[frameIndex] = e; } - /// Fires events for frames > lastTime and <= time. + /// Fires events for frames > lastTime and <= time. public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { if (firedEvents == null) return; float[] frames = this.frames; @@ -570,24 +564,26 @@ namespace Spine { for (int i = 0, n = slots.Count; i < n; i++) drawOrder.Add(slots.Items[i]); } else { + var drawOrderItems = drawOrder.Items; + var slotsItems = slots.Items; for (int i = 0, n = drawOrderToSetupIndex.Length; i < n; i++) - drawOrder.Items[i] = slots.Items[drawOrderToSetupIndex[i]]; + drawOrderItems[i] = slotsItems[drawOrderToSetupIndex[i]]; } } } - public class FfdTimeline : CurveTimeline { + public class DeformTimeline : CurveTimeline { internal int slotIndex; internal float[] frames; private float[][] frameVertices; - internal Attachment attachment; + internal VertexAttachment attachment; public int SlotIndex { get { return slotIndex; } set { slotIndex = value; } } public float[] Frames { get { return frames; } set { frames = value; } } // time, ... public float[][] Vertices { get { return frameVertices; } set { frameVertices = value; } } - public Attachment Attachment { get { return attachment; } set { attachment = value; } } + public VertexAttachment Attachment { get { return attachment; } set { attachment = value; } } - public FfdTimeline (int frameCount) + public DeformTimeline (int frameCount) : base(frameCount) { frames = new float[frameCount]; frameVertices = new float[frameCount][]; @@ -601,8 +597,8 @@ namespace Spine { override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { Slot slot = skeleton.slots.Items[slotIndex]; - IFfdAttachment ffdAttachment = slot.attachment as IFfdAttachment; - if (ffdAttachment == null || !ffdAttachment.ApplyFFD(attachment)) return; + VertexAttachment slotAttachment = slot.attachment as VertexAttachment; + if (slotAttachment == null || !slotAttachment.ApplyDeform(attachment)) return; float[] frames = this.frames; if (time < frames[0]) return; // Time is before first frame. @@ -610,15 +606,12 @@ namespace Spine { float[][] frameVertices = this.frameVertices; int vertexCount = frameVertices[0].Length; - float[] vertices = slot.attachmentVertices; - if (slot.attachmentVerticesCount != vertexCount) alpha = 1; // Don't mix from uninitialized slot vertices. - - // Ensure capacity - if (vertices.Length < vertexCount) { - vertices = new float[vertexCount]; - slot.attachmentVertices = vertices; - } - slot.attachmentVerticesCount = vertexCount; + var verticesArray = slot.attachmentVertices; + if (verticesArray.Count != vertexCount) alpha = 1; // Don't mix from uninitialized slot vertices. + // verticesArray.SetSize(vertexCount) // Ensure size and preemptively set count. + if (verticesArray.Capacity < vertexCount) verticesArray.Capacity = vertexCount; + verticesArray.Count = vertexCount; + float[] vertices = verticesArray.Items; if (time >= frames[frames.Length - 1]) { // Time is after last frame. float[] lastVertices = frameVertices[frames.Length - 1]; @@ -634,12 +627,10 @@ namespace Spine { // Interpolate between the previous frame and the current frame. int frame = Animation.binarySearch(frames, time); - float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame - 1] - frameTime); - percent = GetCurvePercent(frame - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); - float[] prevVertices = frameVertices[frame - 1]; float[] nextVertices = frameVertices[frame]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); if (alpha < 1) { for (int i = 0; i < vertexCount; i++) { @@ -657,10 +648,9 @@ namespace Spine { } public class IkConstraintTimeline : CurveTimeline { - private const int PREV_TIME = -3; - private const int PREV_MIX = -2; - private const int PREV_BEND_DIRECTION = -1; - private const int MIX = 1; + public const int ENTRIES = 3; + private const int PREV_TIME = -3, PREV_MIX = -2, PREV_BEND_DIRECTION = -1; + private const int MIX = 1, BEND_DIRECTION = 2; internal int ikConstraintIndex; internal float[] frames; @@ -670,15 +660,15 @@ namespace Spine { public IkConstraintTimeline (int frameCount) : base(frameCount) { - frames = new float[frameCount * 3]; + frames = new float[frameCount * ENTRIES]; } /// Sets the time, mix and bend direction of the specified keyframe. public void SetFrame (int frameIndex, float time, float mix, int bendDirection) { - frameIndex *= 3; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[frameIndex + 1] = mix; - frames[frameIndex + 2] = bendDirection; + frames[frameIndex + MIX] = mix; + frames[frameIndex + BEND_DIRECTION] = bendDirection; } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -687,34 +677,27 @@ namespace Spine { IkConstraint constraint = skeleton.ikConstraints.Items[ikConstraintIndex]; - if (time >= frames[frames.Length - 3]) { // Time is after last frame. + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. constraint.mix += (frames[frames.Length + PREV_MIX] - constraint.mix) * alpha; constraint.bendDirection = (int)frames[frames.Length + PREV_BEND_DIRECTION]; return; } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 3); - float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); - + int frame = Animation.binarySearch(frames, time, ENTRIES); float mix = frames[frame + PREV_MIX]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + constraint.mix += (mix + (frames[frame + MIX] - mix) * percent - constraint.mix) * alpha; constraint.bendDirection = (int)frames[frame + PREV_BEND_DIRECTION]; } } public class TransformConstraintTimeline : CurveTimeline { - private const int PREV_TIME = -5; - private const int PREV_ROTATE_MIX = -4; - private const int PREV_TRANSLATE_MIX = -3; - private const int PREV_SCALE_MIX = -2; - private const int PREV_SHEAR_MIX = -1; - private const int ROTATE_MIX = 1; - private const int TRANSLATE_MIX = 2; - private const int SCALE_MIX = 3; - private const int SHEAR_MIX = 4; + public const int ENTRIES = 5; + private const int PREV_TIME = -5, PREV_ROTATE = -4, PREV_TRANSLATE = -3, PREV_SCALE = -2, PREV_SHEAR = -1; + private const int ROTATE = 1, TRANSLATE = 2, SCALE = 3, SHEAR = 4; internal int transformConstraintIndex; internal float[] frames; @@ -724,16 +707,16 @@ namespace Spine { public TransformConstraintTimeline (int frameCount) : base(frameCount) { - frames = new float[frameCount * 5]; + frames = new float[frameCount * ENTRIES]; } - + public void SetFrame (int frameIndex, float time, float rotateMix, float translateMix, float scaleMix, float shearMix) { - frameIndex *= 5; + frameIndex *= ENTRIES; frames[frameIndex] = time; - frames[frameIndex + 1] = rotateMix; - frames[frameIndex + 2] = translateMix; - frames[frameIndex + 3] = scaleMix; - frames[frameIndex + 4] = shearMix; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + frames[frameIndex + SCALE] = scaleMix; + frames[frameIndex + SHEAR] = shearMix; } override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList firedEvents, float alpha) { @@ -742,29 +725,151 @@ namespace Spine { TransformConstraint constraint = skeleton.transformConstraints.Items[transformConstraintIndex]; - if (time >= frames[frames.Length - 5]) { // Time is after last frame. - int i = frames.Length - 1; - constraint.rotateMix += (frames[i - 3] - constraint.rotateMix) * alpha; - constraint.translateMix += (frames[i - 2] - constraint.translateMix) * alpha; - constraint.scaleMix += (frames[i - 1] - constraint.scaleMix) * alpha; - constraint.shearMix += (frames[i] - constraint.shearMix) * alpha; + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + constraint.rotateMix += (frames[i + PREV_ROTATE] - constraint.rotateMix) * alpha; + constraint.translateMix += (frames[i + PREV_TRANSLATE] - constraint.translateMix) * alpha; + constraint.scaleMix += (frames[i + PREV_SCALE] - constraint.scaleMix) * alpha; + constraint.shearMix += (frames[i + PREV_SHEAR] - constraint.shearMix) * alpha; return; } // Interpolate between the previous frame and the current frame. - int frame = Animation.binarySearch(frames, time, 5); + int frame = Animation.binarySearch(frames, time, ENTRIES); float frameTime = frames[frame]; - float percent = 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime); - percent = GetCurvePercent(frame / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); - float rotate = frames[frame + PREV_ROTATE_MIX]; - float translate = frames[frame + PREV_TRANSLATE_MIX]; - float scale = frames[frame + PREV_SCALE_MIX]; - float shear = frames[frame + PREV_SHEAR_MIX]; - constraint.rotateMix += (rotate + (frames[frame + ROTATE_MIX] - rotate) * percent - constraint.rotateMix) * alpha; - constraint.translateMix += (translate + (frames[frame + TRANSLATE_MIX] - translate) * percent - constraint.translateMix) * alpha; - constraint.scaleMix += (scale + (frames[frame + SCALE_MIX] - scale) * percent - constraint.scaleMix) * alpha; - constraint.shearMix += (shear + (frames[frame + SHEAR_MIX] - shear) * percent - constraint.shearMix) * alpha; + float rotate = frames[frame + PREV_ROTATE]; + float translate = frames[frame + PREV_TRANSLATE]; + float scale = frames[frame + PREV_SCALE]; + float shear = frames[frame + PREV_SHEAR]; + constraint.rotateMix += (rotate + (frames[frame + ROTATE] - rotate) * percent - constraint.rotateMix) * alpha; + constraint.translateMix += (translate + (frames[frame + TRANSLATE] - translate) * percent - constraint.translateMix) + * alpha; + constraint.scaleMix += (scale + (frames[frame + SCALE] - scale) * percent - constraint.scaleMix) * alpha; + constraint.shearMix += (shear + (frames[frame + SHEAR] - shear) * percent - constraint.shearMix) * alpha; + } + } + + public class PathConstraintPositionTimeline : CurveTimeline { + public const int ENTRIES = 2; + protected const int PREV_TIME = -2, PREV_VALUE = -1; + protected const int VALUE = 1; + + internal int pathConstraintIndex; + internal float[] frames; + + public PathConstraintPositionTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + public int PathConstraintIndex { get { return pathConstraintIndex; } set { pathConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, position, ... + + /// Sets the time and value of the specified keyframe. + public void SetFrame (int frameIndex, float time, float value) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + VALUE] = value; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList events, float alpha) { + float[] frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + constraint.position += (frames[i + PREV_VALUE] - constraint.position) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.binarySearch(frames, time, ENTRIES); + float position = frames[frame + PREV_VALUE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.position += (position + (frames[frame + VALUE] - position) * percent - constraint.position) * alpha; + } + } + + public class PathConstraintSpacingTimeline : PathConstraintPositionTimeline { + public PathConstraintSpacingTimeline (int frameCount) + : base(frameCount) { + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList events, float alpha) { + float[] frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + constraint.spacing += (frames[i + PREV_VALUE] - constraint.spacing) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.binarySearch(frames, time, ENTRIES); + float spacing = frames[frame + PREV_VALUE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.spacing += (spacing + (frames[frame + VALUE] - spacing) * percent - constraint.spacing) * alpha; + } + } + + public class PathConstraintMixTimeline : CurveTimeline { + public const int ENTRIES = 3; + private const int PREV_TIME = -3, PREV_ROTATE = -2, PREV_TRANSLATE = -1; + private const int ROTATE = 1, TRANSLATE = 2; + + internal int pathConstraintIndex; + internal float[] frames; + + public int PathConstraintIndex { get { return pathConstraintIndex; } set { pathConstraintIndex = value; } } + public float[] Frames { get { return frames; } set { frames = value; } } // time, rotate mix, translate mix, ... + + public PathConstraintMixTimeline (int frameCount) + : base(frameCount) { + frames = new float[frameCount * ENTRIES]; + } + + /** Sets the time and mixes of the specified keyframe. */ + public void SetFrame (int frameIndex, float time, float rotateMix, float translateMix) { + frameIndex *= ENTRIES; + frames[frameIndex] = time; + frames[frameIndex + ROTATE] = rotateMix; + frames[frameIndex + TRANSLATE] = translateMix; + } + + override public void Apply (Skeleton skeleton, float lastTime, float time, ExposedList events, float alpha) { + float[] frames = this.frames; + if (time < frames[0]) return; // Time is before first frame. + + PathConstraint constraint = skeleton.pathConstraints.Items[pathConstraintIndex]; + + if (time >= frames[frames.Length - ENTRIES]) { // Time is after last frame. + int i = frames.Length; + constraint.rotateMix += (frames[i + PREV_ROTATE] - constraint.rotateMix) * alpha; + constraint.translateMix += (frames[i + PREV_TRANSLATE] - constraint.translateMix) * alpha; + return; + } + + // Interpolate between the previous frame and the current frame. + int frame = Animation.binarySearch(frames, time, ENTRIES); + float rotate = frames[frame + PREV_ROTATE]; + float translate = frames[frame + PREV_TRANSLATE]; + float frameTime = frames[frame]; + float percent = GetCurvePercent(frame / ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PREV_TIME] - frameTime)); + + constraint.rotateMix += (rotate + (frames[frame + ROTATE] - rotate) * percent - constraint.rotateMix) * alpha; + constraint.translateMix += (translate + (frames[frame + TRANSLATE] - translate) * percent - constraint.translateMix) + * alpha; } } } diff --git a/spine-csharp/src/AnimationState.cs b/spine-csharp/src/AnimationState.cs index 00e2c36e6..1d438efde 100644 --- a/spine-csharp/src/AnimationState.cs +++ b/spine-csharp/src/AnimationState.cs @@ -41,6 +41,8 @@ namespace Spine { private float timeScale = 1; public AnimationStateData Data { get { return data; } } + /// A list of tracks that have animations, which may contain nulls. + public ExposedList Tracks { get { return tracks; } } public float TimeScale { get { return timeScale; } set { timeScale = value; } } public delegate void StartEndDelegate (AnimationState state, int trackIndex); @@ -54,7 +56,7 @@ namespace Spine { public event CompleteDelegate Complete; public AnimationState (AnimationStateData data) { - if (data == null) throw new ArgumentNullException("data cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); this.data = data; } @@ -187,15 +189,16 @@ namespace Spine { if (Start != null) Start(this, index); } + /// public TrackEntry SetAnimation (int trackIndex, String animationName, bool loop) { Animation animation = data.skeletonData.FindAnimation(animationName); - if (animation == null) throw new ArgumentException("Animation not found: " + animationName); + if (animation == null) throw new ArgumentException("Animation not found: " + animationName, "animationName"); return SetAnimation(trackIndex, animation, loop); } /// Set the current animation. Any queued animations are cleared. public TrackEntry SetAnimation (int trackIndex, Animation animation, bool loop) { - if (animation == null) throw new ArgumentException("animation cannot be null."); + if (animation == null) throw new ArgumentNullException("animation", "animation cannot be null."); TrackEntry entry = new TrackEntry(); entry.animation = animation; entry.loop = loop; @@ -205,16 +208,17 @@ namespace Spine { return entry; } + /// public TrackEntry AddAnimation (int trackIndex, String animationName, bool loop, float delay) { Animation animation = data.skeletonData.FindAnimation(animationName); - if (animation == null) throw new ArgumentException("Animation not found: " + animationName); + if (animation == null) throw new ArgumentException("Animation not found: " + animationName, "animationName"); return AddAnimation(trackIndex, animation, loop, delay); } /// Adds an animation to be played delay seconds after the current or last queued animation. - /// May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay. + /// May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay. public TrackEntry AddAnimation (int trackIndex, Animation animation, bool loop, float delay) { - if (animation == null) throw new ArgumentException("animation cannot be null."); + if (animation == null) throw new ArgumentNullException("animation", "animation cannot be null."); TrackEntry entry = new TrackEntry(); entry.animation = animation; entry.loop = loop; diff --git a/spine-csharp/src/AnimationStateData.cs b/spine-csharp/src/AnimationStateData.cs index bf36b2c55..408cdfabf 100644 --- a/spine-csharp/src/AnimationStateData.cs +++ b/spine-csharp/src/AnimationStateData.cs @@ -42,6 +42,7 @@ namespace Spine { public float DefaultMix { get { return defaultMix; } set { defaultMix = value; } } public AnimationStateData (SkeletonData skeletonData) { + if (skeletonData == null) throw new ArgumentException ("skeletonData cannot be null."); this.skeletonData = skeletonData; } @@ -54,8 +55,8 @@ namespace Spine { } public void SetMix (Animation from, Animation to, float duration) { - if (from == null) throw new ArgumentNullException("from cannot be null."); - if (to == null) throw new ArgumentNullException("to cannot be null."); + if (from == null) throw new ArgumentNullException("from", "from cannot be null."); + if (to == null) throw new ArgumentNullException("to", "to cannot be null."); AnimationPair key = new AnimationPair(from, to); animationToMixTime.Remove(key); animationToMixTime.Add(key, duration); diff --git a/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs b/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs index f05de4b67..b3d133c2f 100644 --- a/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs +++ b/spine-csharp/src/Attachments/AtlasAttachmentLoader.cs @@ -72,31 +72,16 @@ namespace Spine { attachment.regionOriginalWidth = region.originalWidth; attachment.regionOriginalHeight = region.originalHeight; return attachment; - } - - public WeightedMeshAttachment NewWeightedMeshAttachment (Skin skin, String name, String path) { - AtlasRegion region = FindRegion(path); - if (region == null) throw new Exception("Region not found in atlas: " + path + " (weighted mesh attachment: " + name + ")"); - WeightedMeshAttachment attachment = new WeightedMeshAttachment(name); - attachment.RendererObject = region; - attachment.RegionU = region.u; - attachment.RegionV = region.v; - attachment.RegionU2 = region.u2; - attachment.RegionV2 = region.v2; - attachment.RegionRotate = region.rotate; - attachment.regionOffsetX = region.offsetX; - attachment.regionOffsetY = region.offsetY; - attachment.regionWidth = region.width; - attachment.regionHeight = region.height; - attachment.regionOriginalWidth = region.originalWidth; - attachment.regionOriginalHeight = region.originalHeight; - return attachment; - } + } public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, String name) { return new BoundingBoxAttachment(name); } + public PathAttachment NewPathAttachment (Skin skin, String name) { + return new PathAttachment (name); + } + public AtlasRegion FindRegion (string name) { AtlasRegion region; diff --git a/spine-csharp/src/Attachments/Attachment.cs b/spine-csharp/src/Attachments/Attachment.cs index 551785b69..44d8bc2a3 100644 --- a/spine-csharp/src/Attachments/Attachment.cs +++ b/spine-csharp/src/Attachments/Attachment.cs @@ -36,7 +36,7 @@ namespace Spine { public String Name { get; private set; } public Attachment (String name) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null"); Name = name; } diff --git a/spine-csharp/src/Attachments/AttachmentLoader.cs b/spine-csharp/src/Attachments/AttachmentLoader.cs index 5574e3210..801b8a778 100644 --- a/spine-csharp/src/Attachments/AttachmentLoader.cs +++ b/spine-csharp/src/Attachments/AttachmentLoader.cs @@ -39,10 +39,10 @@ namespace Spine { /// May be null to not load any attachment. MeshAttachment NewMeshAttachment (Skin skin, String name, String path); - /// May be null to not load any attachment. - WeightedMeshAttachment NewWeightedMeshAttachment (Skin skin, String name, String path); - /// May be null to not load any attachment. BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, String name); + + /// May be null to not load any attachment + PathAttachment NewPathAttachment (Skin skin, String name); } } diff --git a/spine-csharp/src/Attachments/AttachmentType.cs b/spine-csharp/src/Attachments/AttachmentType.cs index 80543490f..81b55a99a 100644 --- a/spine-csharp/src/Attachments/AttachmentType.cs +++ b/spine-csharp/src/Attachments/AttachmentType.cs @@ -31,6 +31,6 @@ namespace Spine { public enum AttachmentType { - region, boundingbox, mesh, weightedmesh, linkedmesh, weightedlinkedmesh + Region, Boundingbox, Mesh, Linkedmesh, Path } } diff --git a/spine-csharp/src/Attachments/BoundingBoxAttachment.cs b/spine-csharp/src/Attachments/BoundingBoxAttachment.cs index ccf179edd..41b42c236 100644 --- a/spine-csharp/src/Attachments/BoundingBoxAttachment.cs +++ b/spine-csharp/src/Attachments/BoundingBoxAttachment.cs @@ -33,29 +33,9 @@ using System; namespace Spine { /// Attachment that has a polygon for bounds checking. - public class BoundingBoxAttachment : Attachment { - internal float[] vertices; - - public float[] Vertices { get { return vertices; } set { vertices = value; } } - + public class BoundingBoxAttachment : VertexAttachment { public BoundingBoxAttachment (string name) : base(name) { } - - /// Must have at least the same length as this attachment's vertices. - public void ComputeWorldVertices (Bone bone, float[] worldVertices) { - float x = bone.skeleton.x + bone.worldX, y = bone.skeleton.y + bone.worldY; - float m00 = bone.a; - float m01 = bone.b; - float m10 = bone.c; - float m11 = bone.d; - float[] vertices = this.vertices; - for (int i = 0, n = vertices.Length; i < n; i += 2) { - float px = vertices[i]; - float py = vertices[i + 1]; - worldVertices[i] = px * m00 + py * m01 + x; - worldVertices[i + 1] = px * m10 + py * m11 + y; - } - } } } diff --git a/spine-csharp/src/Attachments/MeshAttachment.cs b/spine-csharp/src/Attachments/MeshAttachment.cs index eae83f0cb..042d7e1ed 100644 --- a/spine-csharp/src/Attachments/MeshAttachment.cs +++ b/spine-csharp/src/Attachments/MeshAttachment.cs @@ -33,16 +33,16 @@ using System; namespace Spine { /// Attachment that displays a texture region using a mesh. - public class MeshAttachment : Attachment, IFfdAttachment { - internal float[] vertices, uvs, regionUVs; - internal int[] triangles; + public class MeshAttachment : VertexAttachment { internal float regionOffsetX, regionOffsetY, regionWidth, regionHeight, regionOriginalWidth, regionOriginalHeight; + internal float[] uvs, regionUVs; + internal int[] triangles; internal float r = 1, g = 1, b = 1, a = 1; + internal int hulllength; internal MeshAttachment parentMesh; - internal bool inheritFFD; + internal bool inheritDeform; - public int HullLength { get; set; } - public float[] Vertices { get { return vertices; } set { vertices = value; } } + public int HullLength { get { return hulllength; } set { hulllength = value; } } public float[] RegionUVs { get { return regionUVs; } set { regionUVs = value; } } public float[] UVs { get { return uvs; } set { uvs = value; } } public int[] Triangles { get { return triangles; } set { triangles = value; } } @@ -66,7 +66,7 @@ namespace Spine { public float RegionOriginalWidth { get { return regionOriginalWidth; } set { regionOriginalWidth = value; } } public float RegionOriginalHeight { get { return regionOriginalHeight; } set { regionOriginalHeight = value; } } // Unrotated, unstripped size. - public bool InheritFFD { get { return inheritFFD; } set { inheritFFD = value; } } + public bool InheritDeform { get { return inheritDeform; } set { inheritDeform = value; } } public MeshAttachment ParentMesh { get { return parentMesh; } @@ -74,6 +74,7 @@ namespace Spine { parentMesh = value; if (value != null) { vertices = value.vertices; + worldVerticesLength = value.worldVerticesLength; regionUVs = value.regionUVs; triangles = value.triangles; HullLength = value.HullLength; @@ -111,23 +112,8 @@ namespace Spine { } } - public void ComputeWorldVertices (Slot slot, float[] worldVertices) { - Bone bone = slot.bone; - float x = bone.skeleton.x + bone.worldX, y = bone.skeleton.y + bone.worldY; - float m00 = bone.a, m01 = bone.b, m10 = bone.c, m11 = bone.d; - float[] vertices = this.vertices; - int verticesCount = vertices.Length; - if (slot.attachmentVerticesCount == verticesCount) vertices = slot.AttachmentVertices; - for (int i = 0; i < verticesCount; i += 2) { - float vx = vertices[i]; - float vy = vertices[i + 1]; - worldVertices[i] = vx * m00 + vy * m01 + x; - worldVertices[i + 1] = vx * m10 + vy * m11 + y; - } - } - - public bool ApplyFFD (Attachment sourceAttachment) { - return this == sourceAttachment || (inheritFFD && parentMesh == sourceAttachment); + override public bool ApplyDeform (VertexAttachment sourceAttachment) { + return this == sourceAttachment || (inheritDeform && parentMesh == sourceAttachment); } } } diff --git a/spine-csharp/src/Attachments/IFfdAttachment.cs b/spine-csharp/src/Attachments/PathAttachment.cs similarity index 76% rename from spine-csharp/src/Attachments/IFfdAttachment.cs rename to spine-csharp/src/Attachments/PathAttachment.cs index bdc87f7de..fb36a1a67 100644 --- a/spine-csharp/src/Attachments/IFfdAttachment.cs +++ b/spine-csharp/src/Attachments/PathAttachment.cs @@ -29,8 +29,21 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ +using System; +using System.Collections.Generic; + namespace Spine { - public interface IFfdAttachment { - bool ApplyFFD (Attachment sourceAttachment); + public class PathAttachment : VertexAttachment { + internal float[] lengths; + internal bool closed, constantSpeed; + + /// The length in the setup pose from the start of the path to the end of each curve. + public float[] Lengths { get { return lengths; } set { lengths = value; } } + public bool Closed { get { return closed; } set { closed = value; } } + public bool ConstantSpeed { get { return constantSpeed; } set { constantSpeed = value; } } + + public PathAttachment (String name) + : base(name) { + } } -} \ No newline at end of file +} diff --git a/spine-csharp/src/Attachments/RegionAttachment.cs b/spine-csharp/src/Attachments/RegionAttachment.cs index dad5e1cc8..99199397a 100644 --- a/spine-csharp/src/Attachments/RegionAttachment.cs +++ b/spine-csharp/src/Attachments/RegionAttachment.cs @@ -111,9 +111,9 @@ namespace Spine { float localY = -height / 2 * scaleY + regionOffsetY * regionScaleY; float localX2 = localX + regionWidth * regionScaleX; float localY2 = localY + regionHeight * regionScaleY; - float radians = rotation * (float)Math.PI / 180; - float cos = (float)Math.Cos(radians); - float sin = (float)Math.Sin(radians); + float rotation = this.rotation; + float cos = MathUtils.CosDeg(rotation); + float sin = MathUtils.SinDeg(rotation); float x = this.x; float y = this.y; float localXCos = localX * cos + x; @@ -136,17 +136,18 @@ namespace Spine { } public void ComputeWorldVertices (Bone bone, float[] worldVertices) { - float x = bone.skeleton.x + bone.worldX, y = bone.skeleton.y + bone.worldY; - float m00 = bone.a, m01 = bone.b, m10 = bone.c, m11 = bone.d; + Skeleton skeleton = bone.skeleton; + float x = skeleton.x + bone.worldX, y = skeleton.y + bone.worldY; + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; float[] offset = this.offset; - worldVertices[X1] = offset[X1] * m00 + offset[Y1] * m01 + x; - worldVertices[Y1] = offset[X1] * m10 + offset[Y1] * m11 + y; - worldVertices[X2] = offset[X2] * m00 + offset[Y2] * m01 + x; - worldVertices[Y2] = offset[X2] * m10 + offset[Y2] * m11 + y; - worldVertices[X3] = offset[X3] * m00 + offset[Y3] * m01 + x; - worldVertices[Y3] = offset[X3] * m10 + offset[Y3] * m11 + y; - worldVertices[X4] = offset[X4] * m00 + offset[Y4] * m01 + x; - worldVertices[Y4] = offset[X4] * m10 + offset[Y4] * m11 + y; + worldVertices[X1] = offset[X1] * a + offset[Y1] * b + x; + worldVertices[Y1] = offset[X1] * c + offset[Y1] * d + y; + worldVertices[X2] = offset[X2] * a + offset[Y2] * b + x; + worldVertices[Y2] = offset[X2] * c + offset[Y2] * d + y; + worldVertices[X3] = offset[X3] * a + offset[Y3] * b + x; + worldVertices[Y3] = offset[X3] * c + offset[Y3] * d + y; + worldVertices[X4] = offset[X4] * a + offset[Y4] * b + x; + worldVertices[Y4] = offset[X4] * c + offset[Y4] * d + y; } } } diff --git a/spine-csharp/src/Attachments/VertexAttachment.cs b/spine-csharp/src/Attachments/VertexAttachment.cs new file mode 100644 index 000000000..9a58da479 --- /dev/null +++ b/spine-csharp/src/Attachments/VertexAttachment.cs @@ -0,0 +1,114 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.3 + * + * Copyright (c) 2013-2015, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to use, install, execute and perform the Spine + * Runtimes Software (the "Software") and derivative works solely for personal + * or internal use. Without the written permission of Esoteric Software (see + * Section 2 of the Spine Software License Agreement), you may not (a) modify, + * translate, adapt or otherwise create derivative works, improvements of the + * Software or develop new applications using the Software or (b) remove, + * delete, alter or obscure any trademarks or any copyright, trademark, patent + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Spine { + /// >An attachment with vertices that are transformed by one or more bones and can be deformed by a slot's vertices. + public class VertexAttachment : Attachment { + internal int[] bones; + internal float[] vertices; + internal int worldVerticesLength; + + public int[] Bones { get { return bones; } set { bones = value; } } + public float[] Vertices { get { return vertices; } set { vertices = value; } } + public int WorldVerticesLength { get { return worldVerticesLength; } set { worldVerticesLength = value; } } + + public VertexAttachment (String name) + : base(name) { + } + + public void ComputeWorldVertices (Slot slot, float[] worldVertices) { + ComputeWorldVertices(slot, 0, worldVerticesLength, worldVertices, 0); + } + + public void ComputeWorldVertices (Slot slot, int start, int count, float[] worldVertices, int offset) { + count += offset; + Skeleton skeleton = slot.Skeleton; + float x = skeleton.x, y = skeleton.y; + var deformArray = slot.attachmentVertices; + float[] vertices = this.vertices; + int[] bones = this.bones; + if (bones == null) { + if (deformArray.Count > 0) vertices = deformArray.Items; + Bone bone = slot.bone; + x += bone.worldX; + y += bone.worldY; + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + for (int vv = start, w = offset; w < count; vv += 2, w += 2) { + float vx = vertices[vv], vy = vertices[vv + 1]; + worldVertices[w] = vx * a + vy * b + x; + worldVertices[w + 1] = vx * c + vy * d + y; + } + return; + } + int v = 0, skip = 0; + for (int i = 0; i < start; i += 2) { + int n = bones[v]; + v += n + 1; + skip += n; + } + Bone[] skeletonBones = skeleton.Bones.Items; + if (deformArray.Count == 0) { + for (int w = offset, b = skip * 3; w < count; w += 2) { + float wx = x, wy = y; + for (int n = bones[v++] + v; v < n; v++, b += 3) { + Bone bone = skeletonBones[bones[v]]; + float vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } else { + float[] deform = deformArray.Items; + for (int w = offset, b = skip * 3, f = skip << 1; w < count; w += 2) { + float wx = x, wy = y; + for (int n = bones[v++] + v; v < n; v++, b += 3, f += 2) { + Bone bone = skeletonBones[bones[v]]; + float vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + } + + /// Returns true if a deform originally applied to the specified attachment should be applied to this attachment. + virtual public bool ApplyDeform (VertexAttachment sourceAttachment) { + return this == sourceAttachment; + } + } +} diff --git a/spine-csharp/src/Attachments/WeightedMeshAttachment.cs b/spine-csharp/src/Attachments/WeightedMeshAttachment.cs deleted file mode 100644 index a4b15b7ca..000000000 --- a/spine-csharp/src/Attachments/WeightedMeshAttachment.cs +++ /dev/null @@ -1,158 +0,0 @@ -/****************************************************************************** - * Spine Runtimes Software License - * Version 2.3 - * - * Copyright (c) 2013-2015, Esoteric Software - * All rights reserved. - * - * You are granted a perpetual, non-exclusive, non-sublicensable and - * non-transferable license to use, install, execute and perform the Spine - * Runtimes Software (the "Software") and derivative works solely for personal - * or internal use. Without the written permission of Esoteric Software (see - * Section 2 of the Spine Software License Agreement), you may not (a) modify, - * translate, adapt or otherwise create derivative works, improvements of the - * Software or develop new applications using the Software or (b) remove, - * delete, alter or obscure any trademarks or any copyright, trademark, patent - * or other intellectual property or proprietary rights notices on or in the - * Software, including any copy thereof. Redistributions in binary or source - * form must include this license and terms. - * - * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -using System; -using System.Collections.Generic; - -namespace Spine { - /// Attachment that displays a texture region using a mesh which can be deformed by bones. - public class WeightedMeshAttachment : Attachment, IFfdAttachment { - internal int[] bones; - internal float[] weights, uvs, regionUVs; - internal int[] triangles; - internal float regionOffsetX, regionOffsetY, regionWidth, regionHeight, regionOriginalWidth, regionOriginalHeight; - internal float r = 1, g = 1, b = 1, a = 1; - internal WeightedMeshAttachment parentMesh; - internal bool inheritFFD; - - public int HullLength { get; set; } - public int[] Bones { get { return bones; } set { bones = value; } } - public float[] Weights { get { return weights; } set { weights = value; } } - public float[] RegionUVs { get { return regionUVs; } set { regionUVs = value; } } - public float[] UVs { get { return uvs; } set { uvs = value; } } - public int[] Triangles { get { return triangles; } set { triangles = value; } } - - public float R { get { return r; } set { r = value; } } - public float G { get { return g; } set { g = value; } } - public float B { get { return b; } set { b = value; } } - public float A { get { return a; } set { a = value; } } - - public String Path { get; set; } - public Object RendererObject { get; set; } - public float RegionU { get; set; } - public float RegionV { get; set; } - public float RegionU2 { get; set; } - public float RegionV2 { get; set; } - public bool RegionRotate { get; set; } - public float RegionOffsetX { get { return regionOffsetX; } set { regionOffsetX = value; } } - public float RegionOffsetY { get { return regionOffsetY; } set { regionOffsetY = value; } } // Pixels stripped from the bottom left, unrotated. - public float RegionWidth { get { return regionWidth; } set { regionWidth = value; } } - public float RegionHeight { get { return regionHeight; } set { regionHeight = value; } } // Unrotated, stripped size. - public float RegionOriginalWidth { get { return regionOriginalWidth; } set { regionOriginalWidth = value; } } - public float RegionOriginalHeight { get { return regionOriginalHeight; } set { regionOriginalHeight = value; } } // Unrotated, unstripped size. - - public bool InheritFFD { get { return inheritFFD; } set { inheritFFD = value; } } - - public WeightedMeshAttachment ParentMesh { - get { return parentMesh; } - set { - parentMesh = value; - if (value != null) { - bones = value.bones; - weights = value.weights; - regionUVs = value.regionUVs; - triangles = value.triangles; - HullLength = value.HullLength; - Edges = value.Edges; - Width = value.Width; - Height = value.Height; - } - } - } - - // Nonessential. - public int[] Edges { get; set; } - public float Width { get; set; } - public float Height { get; set; } - - public WeightedMeshAttachment (string name) - : base(name) { - } - - public void UpdateUVs () { - float u = RegionU, v = RegionV, width = RegionU2 - RegionU, height = RegionV2 - RegionV; - float[] regionUVs = this.regionUVs; - if (this.uvs == null || this.uvs.Length != regionUVs.Length) this.uvs = new float[regionUVs.Length]; - float[] uvs = this.uvs; - if (RegionRotate) { - for (int i = 0, n = uvs.Length; i < n; i += 2) { - uvs[i] = u + regionUVs[i + 1] * width; - uvs[i + 1] = v + height - regionUVs[i] * height; - } - } else { - for (int i = 0, n = uvs.Length; i < n; i += 2) { - uvs[i] = u + regionUVs[i] * width; - uvs[i + 1] = v + regionUVs[i + 1] * height; - } - } - } - - public void ComputeWorldVertices (Slot slot, float[] worldVertices) { - Skeleton skeleton = slot.bone.skeleton; - ExposedList skeletonBones = skeleton.bones; - float x = skeleton.x, y = skeleton.y; - float[] weights = this.weights; - int[] bones = this.bones; - if (slot.attachmentVerticesCount == 0) { - for (int w = 0, v = 0, b = 0, n = bones.Length; v < n; w += 2) { - float wx = 0, wy = 0; - int nn = bones[v++] + v; - for (; v < nn; v++, b += 3) { - Bone bone = skeletonBones.Items[bones[v]]; - float vx = weights[b], vy = weights[b + 1], weight = weights[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx + x; - worldVertices[w + 1] = wy + y; - } - } else { - float[] ffd = slot.attachmentVertices; - for (int w = 0, v = 0, b = 0, f = 0, n = bones.Length; v < n; w += 2) { - float wx = 0, wy = 0; - int nn = bones[v++] + v; - for (; v < nn; v++, b += 3, f += 2) { - Bone bone = skeletonBones.Items[bones[v]]; - float vx = weights[b] + ffd[f], vy = weights[b + 1] + ffd[f + 1], weight = weights[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx + x; - worldVertices[w + 1] = wy + y; - } - } - } - - public bool ApplyFFD (Attachment sourceAttachment) { - return this == sourceAttachment || (inheritFFD && parentMesh == sourceAttachment); - } - } -} diff --git a/spine-csharp/src/Bone.cs b/spine-csharp/src/Bone.cs index 01f1efbcb..1c28e9cfb 100644 --- a/spine-csharp/src/Bone.cs +++ b/spine-csharp/src/Bone.cs @@ -30,7 +30,6 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class Bone : IUpdatable { @@ -41,12 +40,14 @@ namespace Spine { internal Bone parent; internal ExposedList children = new ExposedList(); internal float x, y, rotation, scaleX, scaleY, shearX, shearY; - internal float appliedRotation, appliedScaleX, appliedScaleY; + internal float appliedRotation; internal float a, b, worldX; internal float c, d, worldY; internal float worldSignX, worldSignY; + internal bool sorted; + public BoneData Data { get { return data; } } public Skeleton Skeleton { get { return skeleton; } } public Bone Parent { get { return parent; } } @@ -56,10 +57,6 @@ namespace Spine { public float Rotation { get { return rotation; } set { rotation = value; } } /// The rotation, as calculated by any constraints. public float AppliedRotation { get { return appliedRotation; } set { appliedRotation = value; } } - /// The scale X, as calculated by any constraints. - public float AppliedScaleX { get { return appliedScaleX; } set { appliedScaleX = value; } } - /// The scale Y, as calculated by any constraints. - public float AppliedScaleY { get { return appliedScaleY; } set { appliedScaleY = value; } } public float ScaleX { get { return scaleX; } set { scaleX = value; } } public float ScaleY { get { return scaleY; } set { scaleY = value; } } public float ShearX { get { return shearX; } set { shearX = value; } } @@ -80,29 +77,27 @@ namespace Spine { /// May be null. public Bone (BoneData data, Skeleton skeleton, Bone parent) { - if (data == null) throw new ArgumentNullException("data cannot be null."); - if (skeleton == null) throw new ArgumentNullException("skeleton cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); this.data = data; this.skeleton = skeleton; this.parent = parent; SetToSetupPose(); } - /// Same as {@link #updateWorldTransform()}. This method exists for Bone to implement {@link Updatable}. + /// Same as . This method exists for Bone to implement . public void Update () { UpdateWorldTransform(x, y, rotation, scaleX, scaleY, shearX, shearY); } - /// Computes the world SRT using the parent bone and this bone's local SRT. + /// Computes the world transform using the parent bone and this bone's local transform. public void UpdateWorldTransform () { UpdateWorldTransform(x, y, rotation, scaleX, scaleY, shearX, shearY); } - /// Computes the world SRT using the parent bone and the specified local SRT. + /// Computes the world transform using the parent bone and the specified local transform. public void UpdateWorldTransform (float x, float y, float rotation, float scaleX, float scaleY, float shearX, float shearY) { appliedRotation = rotation; - appliedScaleX = scaleX; - appliedScaleY = scaleY; float rotationY = rotation + 90 + shearY; float la = MathUtils.CosDeg(rotation + shearX) * scaleX, lb = MathUtils.CosDeg(rotationY) * scaleY; @@ -152,10 +147,10 @@ namespace Spine { do { float cos = MathUtils.CosDeg(parent.appliedRotation), sin = MathUtils.SinDeg(parent.appliedRotation); float temp = pa * cos + pb * sin; - pb = pa * -sin + pb * cos; + pb = pb * cos - pa * sin; pa = temp; temp = pc * cos + pd * sin; - pd = pc * -sin + pd * cos; + pd = pd * cos - pc * sin; pc = temp; if (!parent.data.inheritRotation) break; @@ -171,24 +166,22 @@ namespace Spine { pc = 0; pd = 1; do { - float r = parent.appliedRotation, cos = MathUtils.CosDeg(r), sin = MathUtils.SinDeg(r); - float psx = parent.appliedScaleX, psy = parent.appliedScaleY; - float za = cos * psx, zb = -sin * psy, zc = sin * psx, zd = cos * psy; + float cos = MathUtils.CosDeg(parent.appliedRotation), sin = MathUtils.SinDeg(parent.appliedRotation); + float psx = parent.scaleX, psy = parent.scaleY; + float za = cos * psx, zb = sin * psy, zc = sin * psx, zd = cos * psy; float temp = pa * za + pb * zc; - pb = pa * zb + pb * zd; + pb = pb * zd - pa * zb; pa = temp; temp = pc * za + pd * zc; - pd = pc * zb + pd * zd; + pd = pd * zd - pc * zb; pc = temp; - if (psx < 0) r = -r; - cos = MathUtils.CosDeg(-r); - sin = MathUtils.SinDeg(-r); + if (psx >= 0) sin = -sin; temp = pa * cos + pb * sin; - pb = pa * -sin + pb * cos; + pb = pb * cos - pa * sin; pa = temp; temp = pc * cos + pd * sin; - pd = pc * -sin + pd * cos; + pd = pd * cos - pc * sin; pc = temp; if (!parent.data.inheritScale) break; @@ -226,10 +219,86 @@ namespace Spine { shearY = data.shearY; } - public void WorldToLocal (float worldX, float worldY, out float localX, out float localY) { - float x = worldX - this.worldX, y = worldY - this.worldY; + public float WorldToLocalRotationX { + get { + Bone parent = this.parent; + if (parent == null) return rotation; + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d, a = this.a, c = this.c; + return MathUtils.Atan2(pa * c - pc * a, pd * a - pb * c) * MathUtils.radDeg; + } + } + + public float WorldToLocalRotationY { + get { + Bone parent = this.parent; + if (parent == null) return rotation; + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d, b = this.b, d = this.d; + return MathUtils.Atan2(pa * d - pc * b, pd * b - pb * d) * MathUtils.radDeg; + } + } + + public void RotateWorld (float degrees) { + float a = this.a, b = this.b, c = this.c, d = this.d; + float cos = MathUtils.CosDeg(degrees), sin = MathUtils.SinDeg(degrees); + this.a = cos * a - sin * c; + this.b = cos * b - sin * d; + this.c = sin * a + cos * c; + this.d = sin * b + cos * d; + } + + /// + /// Computes the local transform from the world transform. This can be useful to perform processing on the local transform + /// after the world transform has been modified directly (eg, by a constraint). + /// + /// Some redundant information is lost by the world transform, such as -1,-1 scale versus 180 rotation. The computed local + /// transform values may differ from the original values but are functionally the same. + /// + public void UpdateLocalTransform () { + Bone parent = this.parent; + if (parent == null) { + x = worldX; + y = worldY; + rotation = MathUtils.Atan2(c, a) * MathUtils.radDeg; + scaleX = (float)Math.Sqrt(a * a + c * c); + scaleY = (float)Math.Sqrt(b * b + d * d); + float det = a * d - b * c; + shearX = 0; + shearY = MathUtils.Atan2(a * b + c * d, det) * MathUtils.radDeg; + return; + } + float pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + float pid = 1 / (pa * pd - pb * pc); + float dx = worldX - parent.worldX, dy = worldY - parent.worldY; + x = (dx * pd * pid - dy * pb * pid); + y = (dy * pa * pid - dx * pc * pid); + float ia = pid * pd; + float id = pid * pa; + float ib = pid * pb; + float ic = pid * pc; + float ra = ia * a - ib * c; + float rb = ia * b - ib * d; + float rc = id * c - ic * a; + float rd = id * d - ic * b; + shearX = 0; + scaleX = (float)Math.Sqrt(ra * ra + rc * rc); + if (scaleX > 0.0001f) { + float det = ra * rd - rb * rc; + scaleY = det / scaleX; + shearY = MathUtils.Atan2(ra * rb + rc * rd, det) * MathUtils.radDeg; + rotation = MathUtils.Atan2(rc, ra) * MathUtils.radDeg; + } else { + scaleX = 0; + scaleY = (float)Math.Sqrt(rb * rb + rd * rd); + shearY = 0; + rotation = 90 - MathUtils.Atan2(rd, rb) * MathUtils.radDeg; + } + appliedRotation = rotation; + } + + public void WorldToLocal (float worldX, float worldY, out float localX, out float localY) { float a = this.a, b = this.b, c = this.c, d = this.d; float invDet = 1 / (a * d - b * c); + float x = worldX - this.worldX, y = worldY - this.worldY; localX = (x * d * invDet - y * b * invDet); localY = (y * a * invDet - x * c * invDet); } diff --git a/spine-csharp/src/BoneData.cs b/spine-csharp/src/BoneData.cs index 21b1ed555..db51b6738 100644 --- a/spine-csharp/src/BoneData.cs +++ b/spine-csharp/src/BoneData.cs @@ -33,14 +33,17 @@ using System; namespace Spine { public class BoneData { - internal BoneData parent; + internal int index; internal String name; - internal float length, x, y, rotation, scaleX = 1, scaleY = 1, shearX, shearY; - internal bool inheritScale = true, inheritRotation = true; + internal BoneData parent; + internal float length; + internal float x, y, rotation, scaleX = 1, scaleY = 1, shearX, shearY; + internal bool inheritRotation = true, inheritScale = true; /// May be null. - public BoneData Parent { get { return parent; } } + public int Index { get { return index; } } public String Name { get { return name; } } + public BoneData Parent { get { return parent; } } public float Length { get { return length; } set { length = value; } } public float X { get { return x; } set { x = value; } } public float Y { get { return y; } set { y = value; } } @@ -49,12 +52,14 @@ namespace Spine { public float ScaleY { get { return scaleY; } set { scaleY = value; } } public float ShearX { get { return shearX; } set { shearX = value; } } public float ShearY { get { return shearY; } set { shearY = value; } } - public bool InheritScale { get { return inheritScale; } set { inheritScale = value; } } public bool InheritRotation { get { return inheritRotation; } set { inheritRotation = value; } } + public bool InheritScale { get { return inheritScale; } set { inheritScale = value; } } /// May be null. - public BoneData (String name, BoneData parent) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + public BoneData (int index, String name, BoneData parent) { + if (index < 0) throw new ArgumentException("index must be >= 0", "index"); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.index = index; this.name = name; this.parent = parent; } diff --git a/spine-csharp/src/Event.cs b/spine-csharp/src/Event.cs index bbb2ad350..134a98026 100644 --- a/spine-csharp/src/Event.cs +++ b/spine-csharp/src/Event.cs @@ -40,6 +40,7 @@ namespace Spine { public float Time { get; private set; } public Event (float time, EventData data) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); Time = time; Data = data; } diff --git a/spine-csharp/src/EventData.cs b/spine-csharp/src/EventData.cs index 187bb8219..3dc647bf5 100644 --- a/spine-csharp/src/EventData.cs +++ b/spine-csharp/src/EventData.cs @@ -41,7 +41,7 @@ namespace Spine { public String String { get; set; } public EventData (String name) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); this.name = name; } diff --git a/spine-csharp/src/ExposedList.cs b/spine-csharp/src/ExposedList.cs index 45287c0d7..a24db4a93 100644 --- a/spine-csharp/src/ExposedList.cs +++ b/spine-csharp/src/ExposedList.cs @@ -89,6 +89,12 @@ namespace Spine { Capacity = Math.Max(Math.Max(Capacity * 2, DefaultCapacity), minimumSize); } + public ExposedList Resize (int newSize) { + if (newSize > Items.Length) Array.Resize(ref Items, newSize); + Count = newSize; + return this; + } + private void CheckRange (int idx, int count) { if (idx < 0) throw new ArgumentOutOfRangeException("index"); @@ -580,4 +586,4 @@ namespace Spine { } } } -} \ No newline at end of file +} diff --git a/spine-csharp/src/IkConstraint.cs b/spine-csharp/src/IkConstraint.cs index 3b4530135..c15627f72 100644 --- a/spine-csharp/src/IkConstraint.cs +++ b/spine-csharp/src/IkConstraint.cs @@ -30,15 +30,16 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class IkConstraint : IUpdatable { internal IkConstraintData data; internal ExposedList bones = new ExposedList(); internal Bone target; - internal int bendDirection; internal float mix; + internal int bendDirection; + + internal int level; public IkConstraintData Data { get { return data; } } public ExposedList Bones { get { return bones; } } @@ -47,8 +48,8 @@ namespace Spine { public float Mix { get { return mix; } set { mix = value; } } public IkConstraint (IkConstraintData data, Skeleton skeleton) { - if (data == null) throw new ArgumentNullException("data cannot be null."); - if (skeleton == null) throw new ArgumentNullException("skeleton cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); this.data = data; mix = data.mix; bendDirection = data.bendDirection; @@ -87,21 +88,24 @@ namespace Spine { float id = 1 / (pp.a * pp.d - pp.b * pp.c); float x = targetX - pp.worldX, y = targetY - pp.worldY; float tx = (x * pp.d - y * pp.b) * id - bone.x, ty = (y * pp.a - x * pp.c) * id - bone.y; - float rotationIK = MathUtils.Atan2(ty, tx) * MathUtils.radDeg - bone.shearX; + float rotationIK = MathUtils.Atan2(ty, tx) * MathUtils.radDeg - bone.shearX - bone.rotation; if (bone.scaleX < 0) rotationIK += 180; if (rotationIK > 180) rotationIK -= 360; else if (rotationIK < -180) rotationIK += 360; - bone.UpdateWorldTransform(bone.x, bone.y, bone.rotation + (rotationIK - bone.rotation) * alpha, bone.appliedScaleX, - bone.appliedScaleY, bone.shearX, bone.shearY); + bone.UpdateWorldTransform(bone.x, bone.y, bone.rotation + rotationIK * alpha, bone.scaleX, bone.scaleY, + bone.shearX, bone.shearY); } /// Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as /// possible. The target is specified in the world coordinate system. /// A direct descendant of the parent bone. static public void Apply (Bone parent, Bone child, float targetX, float targetY, int bendDir, float alpha) { - if (alpha == 0) return; - float px = parent.x, py = parent.y, psx = parent.appliedScaleX, psy = parent.appliedScaleY; + if (alpha == 0) { + child.UpdateWorldTransform (); + return; + } + float px = parent.x, py = parent.y, psx = parent.scaleX, psy = parent.scaleY, csx = child.scaleX; int os1, os2, s2; if (psx < 0) { psx = -psx; @@ -115,44 +119,55 @@ namespace Spine { psy = -psy; s2 = -s2; } - float cx = child.x, cy = child.y, csx = child.appliedScaleX; - bool u = Math.Abs(psx - psy) <= 0.0001f; - if (!u && cy != 0) { - child.worldX = parent.a * cx + parent.worldX; - child.worldY = parent.c * cx + parent.worldY; - cy = 0; - } if (csx < 0) { csx = -csx; os2 = 180; } else os2 = 0; + float cx = child.x, cy, cwx, cwy, a = parent.a, b = parent.b, c = parent.c, d = parent.d; + bool u = Math.Abs(psx - psy) <= 0.0001f; + if (!u) { + cy = 0; + cwx = a * cx + parent.worldX; + cwy = c * cx + parent.worldY; + } else { + cy = child.y; + cwx = a * cx + b * cy + parent.worldX; + cwy = c * cx + d * cy + parent.worldY; + } Bone pp = parent.parent; - float ppa = pp.a, ppb = pp.b, ppc = pp.c, ppd = pp.d, id = 1 / (ppa * ppd - ppb * ppc); - float x = targetX - pp.worldX, y = targetY - pp.worldY; - float tx = (x * ppd - y * ppb) * id - px, ty = (y * ppa - x * ppc) * id - py; - x = child.worldX - pp.worldX; - y = child.worldY - pp.worldY; - float dx = (x * ppd - y * ppb) * id - px, dy = (y * ppa - x * ppc) * id - py; + a = pp.a; + b = pp.b; + c = pp.c; + d = pp.d; + float id = 1 / (a * d - b * c), x = targetX - pp.worldX, y = targetY - pp.worldY; + float tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; + x = cwx - pp.worldX; + y = cwy - pp.worldY; + float dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; float l1 = (float)Math.Sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2; if (u) { l2 *= psx; float cos = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2); - if (cos < -1) cos = -1; + if (cos < -1) + cos = -1; else if (cos > 1) cos = 1; a2 = (float)Math.Acos(cos) * bendDir; - float a = l1 + l2 * cos, o = l2 * MathUtils.Sin(a2); - a1 = MathUtils.Atan2(ty * a - tx * o, tx * a + ty * o); + a = l1 + l2 * cos; + b = l2 * MathUtils.Sin(a2); + a1 = MathUtils.Atan2(ty * a - tx * b, tx * a + ty * b); } else { - float a = psx * l2, b = psy * l2, ta = MathUtils.Atan2(ty, tx); - float aa = a * a, bb = b * b, ll = l1 * l1, dd = tx * tx + ty * ty; - float c0 = bb * ll + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa; - float d = c1 * c1 - 4 * c2 * c0; + a = psx * l2; + b = psy * l2; + float aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = MathUtils.Atan2(ty, tx); + c = bb * l1 * l1 + aa * dd - aa * bb; + float c1 = -2 * bb * l1, c2 = bb - aa; + d = c1 * c1 - 4 * c2 * c; if (d >= 0) { float q = (float)Math.Sqrt(d); if (c1 < 0) q = -q; q = -(c1 + q) / 2; - float r0 = q / c2, r1 = c0 / q; + float r0 = q / c2, r1 = c / q; float r = Math.Abs(r0) < Math.Abs(r1) ? r0 : r1; if (r * r <= dd) { y = (float)Math.Sqrt(dd - r * r) * bendDir; @@ -201,18 +216,20 @@ namespace Spine { a2 = maxAngle * bendDir; } } - outer: + outer: float os = MathUtils.Atan2(cy, cx) * s2; - a1 = (a1 - os) * MathUtils.radDeg + os1; - a2 = ((a2 + os) * MathUtils.radDeg - child.shearX) * s2 + os2; - if (a1 > 180) a1 -= 360; - else if (a1 < -180) a1 += 360; - if (a2 > 180) a2 -= 360; - else if (a2 < -180) a2 += 360; float rotation = parent.rotation; - parent.UpdateWorldTransform(px, py, rotation + (a1 - rotation) * alpha, parent.appliedScaleX, parent.appliedScaleY, 0, 0); + a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation; + if (a1 > 180) + a1 -= 360; + else if (a1 < -180) a1 += 360; + parent.UpdateWorldTransform(px, py, rotation + a1 * alpha, parent.scaleX, parent.scaleY, 0, 0); rotation = child.rotation; - child.UpdateWorldTransform(cx, cy, rotation + (a2 - rotation) * alpha, child.appliedScaleX, child.appliedScaleY, child.shearX, child.shearY); + a2 = ((a2 + os) * MathUtils.radDeg - child.shearX) * s2 + os2 - rotation; + if (a2 > 180) + a2 -= 360; + else if (a2 < -180) a2 += 360; + child.UpdateWorldTransform(cx, cy, rotation + a2 * alpha, child.scaleX, child.scaleY, child.shearX, child.shearY); } } } diff --git a/spine-csharp/src/IkConstraintData.cs b/spine-csharp/src/IkConstraintData.cs index 6bb9c752d..2b0723b93 100644 --- a/spine-csharp/src/IkConstraintData.cs +++ b/spine-csharp/src/IkConstraintData.cs @@ -47,7 +47,7 @@ namespace Spine { public float Mix { get { return mix; } set { mix = value; } } public IkConstraintData (String name) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); this.name = name; } diff --git a/spine-csharp/src/MathUtils.cs b/spine-csharp/src/MathUtils.cs index 665cf8f06..e8a8f86df 100644 --- a/spine-csharp/src/MathUtils.cs +++ b/spine-csharp/src/MathUtils.cs @@ -54,22 +54,22 @@ namespace Spine { sin[(int)(i * degToIndex) & SIN_MASK] = (float)Math.Sin(i * degRad); } - /** Returns the sine in radians from a lookup table. */ + /// Returns the sine in radians from a lookup table. static public float Sin (float radians) { return sin[(int)(radians * radToIndex) & SIN_MASK]; } - /** Returns the cosine in radians from a lookup table. */ + /// Returns the cosine in radians from a lookup table. static public float Cos (float radians) { return sin[(int)((radians + PI / 2) * radToIndex) & SIN_MASK]; } - - /** Returns the sine in radians from a lookup table. */ + + /// Returns the sine in radians from a lookup table. static public float SinDeg (float degrees) { return sin[(int)(degrees * degToIndex) & SIN_MASK]; } - - /** Returns the cosine in radians from a lookup table. */ + + /// Returns the cosine in radians from a lookup table. static public float CosDeg (float degrees) { return sin[(int)((degrees + 90) * degToIndex) & SIN_MASK]; } @@ -91,5 +91,11 @@ namespace Spine { atan = PI / 2 - z / (z * z + 0.28f); return y < 0f ? atan - PI : atan; } + + static public float Clamp (float value, float min, float max) { + if (value < min) return min; + if (value > max) return max; + return value; + } } } diff --git a/spine-csharp/src/PathConstraint.cs b/spine-csharp/src/PathConstraint.cs new file mode 100644 index 000000000..eddada80d --- /dev/null +++ b/spine-csharp/src/PathConstraint.cs @@ -0,0 +1,400 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.3 + * + * Copyright (c) 2013-2015, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to use, install, execute and perform the Spine + * Runtimes Software (the "Software") and derivative works solely for personal + * or internal use. Without the written permission of Esoteric Software (see + * Section 2 of the Spine Software License Agreement), you may not (a) modify, + * translate, adapt or otherwise create derivative works, improvements of the + * Software or develop new applications using the Software or (b) remove, + * delete, alter or obscure any trademarks or any copyright, trademark, patent + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class PathConstraint : IUpdatable { + private const int NONE = -1, BEFORE = -2, AFTER = -3; + + internal PathConstraintData data; + internal ExposedList bones; + internal Slot target; + internal float position, spacing, rotateMix, translateMix; + + internal ExposedList spaces = new ExposedList(), positions = new ExposedList(); + internal ExposedList world = new ExposedList(), curves = new ExposedList(), lengths = new ExposedList(); + internal float[] segments = new float[10]; + + public float Position { get { return position; } set { position = value; } } + public float Spacing { get { return spacing; } set { spacing = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + public ExposedList Bones { get { return bones; } } + public Slot Target { get { return target; } set { target = value; } } + public PathConstraintData Data { get { return data; } } + + public PathConstraint (PathConstraintData data, Skeleton skeleton) { + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); + this.data = data; + bones = new ExposedList(data.Bones.Count); + foreach (BoneData boneData in data.bones) + bones.Add(skeleton.FindBone(boneData.name)); + target = skeleton.FindSlot(data.target.name); + position = data.position; + spacing = data.spacing; + rotateMix = data.rotateMix; + translateMix = data.translateMix; + } + + public void Apply () { + Update(); + } + + public void Update () { + PathAttachment attachment = target.Attachment as PathAttachment; + if (attachment == null) return; + + float rotateMix = this.rotateMix, translateMix = this.translateMix; + bool translate = translateMix > 0, rotate = rotateMix > 0; + if (!translate && !rotate) return; + + PathConstraintData data = this.data; + SpacingMode spacingMode = data.spacingMode; + bool lengthSpacing = spacingMode == SpacingMode.Length; + RotateMode rotateMode = data.rotateMode; + bool tangents = rotateMode == RotateMode.Tangent, scale = rotateMode == RotateMode.ChainScale; + int boneCount = this.bones.Count, spacesCount = tangents ? boneCount : boneCount + 1; + Bone[] bones = this.bones.Items; + ExposedList spaces = this.spaces.Resize(spacesCount), lengths = null; + float spacing = this.spacing; + if (scale || lengthSpacing) { + if (scale) lengths = this.lengths.Resize(boneCount); + for (int i = 0, n = spacesCount - 1; i < n;) { + Bone bone = bones[i]; + float length = bone.data.length, x = length * bone.a, y = length * bone.c; + length = (float)Math.Sqrt(x * x + y * y); + if (scale) lengths.Items[i] = length; + spaces.Items[++i] = lengthSpacing ? Math.Max(0, length + spacing) : spacing; + } + } else { + for (int i = 1; i < spacesCount; i++) + spaces.Items[i] = spacing; + } + + float[] positions = ComputeWorldPositions(attachment, spacesCount, tangents, + data.positionMode == PositionMode.Percent, spacingMode == SpacingMode.Percent); + Skeleton skeleton = target.Skeleton; + float skeletonX = skeleton.x, skeletonY = skeleton.y; + float boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; + bool tip = rotateMode == RotateMode.Chain && offsetRotation == 0; + for (int i = 0, p = 3; i < boneCount; i++, p += 3) { + Bone bone = (Bone)bones[i]; + bone.worldX += (boneX - skeletonX - bone.worldX) * translateMix; + bone.worldY += (boneY - skeletonY - bone.worldY) * translateMix; + float x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; + if (scale) { + float length = lengths.Items[i]; + if (length != 0) { + float s = ((float)Math.Sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1; + bone.a *= s; + bone.c *= s; + } + } + boneX = x; + boneY = y; + if (rotate) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d, r, cos, sin; + if (tangents) + r = positions[p - 1]; + else if (spaces.Items[i + 1] == 0) + r = positions[p + 2]; + else + r = MathUtils.Atan2(dy, dx); + r -= MathUtils.Atan2(c, a) - offsetRotation * MathUtils.degRad; + if (tip) { + cos = MathUtils.Cos(r); + sin = MathUtils.Sin(r); + float length = bone.data.length; + boneX += (length * (cos * a - sin * c) - dx) * rotateMix; + boneY += (length * (sin * a + cos * c) - dy) * rotateMix; + } + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) // + r += MathUtils.PI2; + r *= rotateMix; + cos = MathUtils.Cos(r); + sin = MathUtils.Sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + } + } + + float[] ComputeWorldPositions (PathAttachment path, int spacesCount, bool tangents, bool percentPosition, + bool percentSpacing) { + + Slot target = this.target; + float position = this.position; + float[] spaces = this.spaces.Items, output = this.positions.Resize(spacesCount * 3 + 2).Items, world; + bool closed = path.Closed; + int verticesLength = path.WorldVerticesLength, curveCount = verticesLength / 6, prevCurve = NONE; + + float pathLength; + if (!path.ConstantSpeed) { + float[] lengths = path.Lengths; + curveCount -= closed ? 1 : 2; + pathLength = lengths[curveCount]; + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (int i = 0; i < spacesCount; i++) + spaces[i] *= pathLength; + } + world = this.world.Resize(8).Items; + for (int i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + float space = spaces[i]; + position += space; + float p = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + if (prevCurve != BEFORE) { + prevCurve = BEFORE; + path.ComputeWorldVertices(target, 2, 4, world, 0); + } + AddBeforePosition(p, world, 0, output, o); + continue; + } else if (p > pathLength) { + if (prevCurve != AFTER) { + prevCurve = AFTER; + path.ComputeWorldVertices(target, verticesLength - 6, 4, world, 0); + } + AddAfterPosition(p - pathLength, world, 0, output, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + float length = lengths[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + float prev = lengths[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + if (closed && curve == curveCount) { + path.ComputeWorldVertices(target, verticesLength - 4, 4, world, 0); + path.ComputeWorldVertices(target, 0, 4, world, 4); + } else + path.ComputeWorldVertices(target, curve * 6 + 2, 8, world, 0); + } + AddCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], output, o, + tangents || (i > 0 && space == 0)); + } + return output; + } + + // World vertices. + if (closed) { + verticesLength += 2; + world = this.world.Resize(verticesLength).Items; + path.ComputeWorldVertices(target, 2, verticesLength - 4, world, 0); + path.ComputeWorldVertices(target, 0, 2, world, verticesLength - 4); + world[verticesLength - 2] = world[0]; + world[verticesLength - 1] = world[1]; + } else { + curveCount--; + verticesLength -= 4; + world = this.world.Resize(verticesLength).Items; + path.ComputeWorldVertices(target, 2, verticesLength, world, 0); + } + + // Curve lengths. + float[] curves = this.curves.Resize(curveCount).Items; + pathLength = 0; + float x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; + float tmpx, tmpy, dddfx, dddfy, ddfx, ddfy, dfx, dfy; + for (int i = 0, w = 2; i < curveCount; i++, w += 6) { + cx1 = world[w]; + cy1 = world[w + 1]; + cx2 = world[w + 2]; + cy2 = world[w + 3]; + x2 = world[w + 4]; + y2 = world[w + 5]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.1875f; + tmpy = (y1 - cy1 * 2 + cy2) * 0.1875f; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375f; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375f; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.75f + tmpx + dddfx * 0.16666667f; + dfy = (cy1 - y1) * 0.75f + tmpy + dddfy * 0.16666667f; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + pathLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + curves[i] = pathLength; + x1 = x2; + y1 = y2; + } + if (percentPosition) position *= pathLength; + if (percentSpacing) { + for (int i = 0; i < spacesCount; i++) + spaces[i] *= pathLength; + } + + float[] segments = this.segments; + float curveLength = 0; + for (int i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { + float space = spaces[i]; + position += space; + float p = position; + + if (closed) { + p %= pathLength; + if (p < 0) p += pathLength; + curve = 0; + } else if (p < 0) { + AddBeforePosition(p, world, 0, output, o); + continue; + } else if (p > pathLength) { + AddAfterPosition(p - pathLength, world, verticesLength - 4, output, o); + continue; + } + + // Determine curve containing position. + for (;; curve++) { + float length = curves[curve]; + if (p > length) continue; + if (curve == 0) + p /= length; + else { + float prev = curves[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + + // Curve segment lengths. + if (curve != prevCurve) { + prevCurve = curve; + int ii = curve * 6; + x1 = world[ii]; + y1 = world[ii + 1]; + cx1 = world[ii + 2]; + cy1 = world[ii + 3]; + cx2 = world[ii + 4]; + cy2 = world[ii + 5]; + x2 = world[ii + 6]; + y2 = world[ii + 7]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.03f; + tmpy = (y1 - cy1 * 2 + cy2) * 0.03f; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006f; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006f; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.3f + tmpx + dddfx * 0.16666667f; + dfy = (cy1 - y1) * 0.3f + tmpy + dddfy * 0.16666667f; + curveLength = (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[0] = curveLength; + for (ii = 1; ii < 8; ii++) { + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[ii] = curveLength; + } + dfx += ddfx; + dfy += ddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[8] = curveLength; + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + curveLength += (float)Math.Sqrt(dfx * dfx + dfy * dfy); + segments[9] = curveLength; + segment = 0; + } + + // Weight by segment length. + p *= curveLength; + for (;; segment++) { + float length = segments[segment]; + if (p > length) continue; + if (segment == 0) + p /= length; + else { + float prev = segments[segment - 1]; + p = segment + (p - prev) / (length - prev); + } + break; + } + AddCurvePosition(p * 0.1f, x1, y1, cx1, cy1, cx2, cy2, x2, y2, output, o, tangents || (i > 0 && space == 0)); + } + return output; + } + + private void AddBeforePosition (float p, float[] temp, int i, float[] output, int o) { + float x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = MathUtils.Atan2(dy, dx); + output[o] = x1 + p * MathUtils.Cos(r); + output[o + 1] = y1 + p * MathUtils.Sin(r); + output[o + 2] = r; + } + + private void AddAfterPosition (float p, float[] temp, int i, float[] output, int o) { + float x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = MathUtils.Atan2(dy, dx); + output[o] = x1 + p * MathUtils.Cos(r); + output[o + 1] = y1 + p * MathUtils.Sin(r); + output[o + 2] = r; + } + + private void AddCurvePosition (float p, float x1, float y1, float cx1, float cy1, float cx2, float cy2, float x2, float y2, + float[] output, int o, bool tangents) { + if (p == 0) p = 0.0001f; + float tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; + float ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; + float x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; + output[o] = x; + output[o + 1] = y; + if (tangents) output[o + 2] = (float)Math.Atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + } + } +} diff --git a/spine-csharp/src/PathConstraintData.cs b/spine-csharp/src/PathConstraintData.cs new file mode 100644 index 000000000..ed2cda3e0 --- /dev/null +++ b/spine-csharp/src/PathConstraintData.cs @@ -0,0 +1,74 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.3 + * + * Copyright (c) 2013-2015, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to use, install, execute and perform the Spine + * Runtimes Software (the "Software") and derivative works solely for personal + * or internal use. Without the written permission of Esoteric Software (see + * Section 2 of the Spine Software License Agreement), you may not (a) modify, + * translate, adapt or otherwise create derivative works, improvements of the + * Software or develop new applications using the Software or (b) remove, + * delete, alter or obscure any trademarks or any copyright, trademark, patent + * or other intellectual property or proprietary rights notices on or in the + * Software, including any copy thereof. Redistributions in binary or source + * form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +using System; + +namespace Spine { + public class PathConstraintData { + internal String name; + internal ExposedList bones = new ExposedList(); + internal SlotData target; + internal PositionMode positionMode; + internal SpacingMode spacingMode; + internal RotateMode rotateMode; + internal float offsetRotation; + internal float position, spacing, rotateMix, translateMix; + + public ExposedList Bones { get { return bones; } } + public SlotData Target { get { return target; } set { target = value; } } + public PositionMode PositionMode { get { return positionMode; } set { positionMode = value; } } + public SpacingMode SpacingMode { get { return spacingMode; } set { spacingMode = value; } } + public RotateMode RotateMode { get { return rotateMode; } set { rotateMode = value; } } + public float OffsetRotation { get { return offsetRotation; } set { offsetRotation = value; } } + public float Position { get { return position; } set { position = value; } } + public float Spacing { get { return spacing; } set { spacing = value; } } + public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } + public float TranslateMix { get { return translateMix; } set { translateMix = value; } } + public String Name { get { return name; } } + + public PathConstraintData (String name) { + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + this.name = name; + } + } + + public enum PositionMode { + Fixed, Percent + } + + public enum SpacingMode { + Length, Fixed, Percent + } + + public enum RotateMode { + Tangent, Chain, ChainScale + } +} diff --git a/spine-csharp/src/Skeleton.cs b/spine-csharp/src/Skeleton.cs index ea88ecd76..ca4c04ee3 100644 --- a/spine-csharp/src/Skeleton.cs +++ b/spine-csharp/src/Skeleton.cs @@ -38,9 +38,10 @@ namespace Spine { internal ExposedList bones; internal ExposedList slots; internal ExposedList drawOrder; - internal ExposedList ikConstraints; + internal ExposedList ikConstraints, ikConstraintsSorted; internal ExposedList transformConstraints; - private ExposedList updateCache = new ExposedList(); + internal ExposedList pathConstraints; + internal ExposedList updateCache = new ExposedList(); internal Skin skin; internal float r = 1, g = 1, b = 1, a = 1; internal float time; @@ -49,9 +50,12 @@ namespace Spine { public SkeletonData Data { get { return data; } } public ExposedList Bones { get { return bones; } } + public ExposedList UpdateCacheList { get { return updateCache; } } public ExposedList Slots { get { return slots; } } public ExposedList DrawOrder { get { return drawOrder; } } - public ExposedList IkConstraints { get { return ikConstraints; } set { ikConstraints = value; } } + public ExposedList IkConstraints { get { return ikConstraints; } } + public ExposedList PathConstraints { get { return pathConstraints; } } + public ExposedList TransformConstraints { get { return transformConstraints; } } public Skin Skin { get { return skin; } set { skin = value; } } public float R { get { return r; } set { r = value; } } public float G { get { return g; } set { g = value; } } @@ -64,33 +68,37 @@ namespace Spine { public bool FlipY { get { return flipY; } set { flipY = value; } } public Bone RootBone { - get { - return bones.Count == 0 ? null : bones.Items[0]; - } + get { return bones.Count == 0 ? null : bones.Items[0]; } } public Skeleton (SkeletonData data) { - if (data == null) throw new ArgumentNullException("data cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); this.data = data; bones = new ExposedList(data.bones.Count); foreach (BoneData boneData in data.bones) { - Bone parent = boneData.parent == null ? null : bones.Items[data.bones.IndexOf(boneData.parent)]; - Bone bone = new Bone(boneData, this, parent); - if (parent != null) parent.children.Add(bone); + Bone bone; + if (boneData.parent == null) { + bone = new Bone (boneData, this, null); + } else { + Bone parent = bones.Items[boneData.parent.index]; + bone = new Bone (boneData, this, parent); + parent.children.Add (bone); + } bones.Add(bone); } slots = new ExposedList(data.slots.Count); drawOrder = new ExposedList(data.slots.Count); foreach (SlotData slotData in data.slots) { - Bone bone = bones.Items[data.bones.IndexOf(slotData.boneData)]; + Bone bone = bones.Items[slotData.boneData.index]; Slot slot = new Slot(slotData, bone); slots.Add(slot); drawOrder.Add(slot); } ikConstraints = new ExposedList(data.ikConstraints.Count); + ikConstraintsSorted = new ExposedList(data.ikConstraints.Count); foreach (IkConstraintData ikConstraintData in data.ikConstraints) ikConstraints.Add(new IkConstraint(ikConstraintData, this)); @@ -98,46 +106,150 @@ namespace Spine { foreach (TransformConstraintData transformConstraintData in data.transformConstraints) transformConstraints.Add(new TransformConstraint(transformConstraintData, this)); + pathConstraints = new ExposedList (data.pathConstraints.Count); + foreach (PathConstraintData pathConstraintData in data.pathConstraints) + pathConstraints.Add(new PathConstraint(pathConstraintData, this)); + UpdateCache(); UpdateWorldTransform(); } - /// Caches information about bones and constraints. Must be called if bones or constraints are added + /// Caches information about bones and constraints. Must be called if bones, constraints or weighted path attachments are added /// or removed. public void UpdateCache () { - ExposedList bones = this.bones; ExposedList updateCache = this.updateCache; - ExposedList ikConstraints = this.ikConstraints; - ExposedList transformConstraints = this.transformConstraints; - int ikConstraintsCount = ikConstraints.Count; - int transformConstraintsCount = transformConstraints.Count; updateCache.Clear(); - for (int i = 0, n = bones.Count; i < n; i++) { - Bone bone = bones.Items[i]; - updateCache.Add(bone); - for (int ii = 0; ii < ikConstraintsCount; ii++) { - IkConstraint ikConstraint = ikConstraints.Items[ii]; - if (bone == ikConstraint.bones.Items[ikConstraint.bones.Count - 1]) { - updateCache.Add(ikConstraint); - break; - } + + ExposedList bones = this.bones; + for (int i = 0, n = bones.Count; i < n; i++) + bones.Items[i].sorted = false; + + ExposedList ikConstraints = this.ikConstraintsSorted; + ikConstraints.Clear(); + ikConstraints.AddRange(this.ikConstraints); + int ikCount = ikConstraints.Count; + for (int i = 0, level, n = ikCount; i < n; i++) { + IkConstraint ik = ikConstraints.Items[i]; + Bone bone = ik.bones.Items[0].Parent; + for (level = 0; bone != null; level++) + bone = bone.Parent; + ik.level = level; + } + for (int i = 1, ii; i < ikCount; i++) { + IkConstraint ik = ikConstraints.Items [i]; + int level = ik.level; + for (ii = i - 1; ii >= 0; ii--) { + IkConstraint other = ikConstraints.Items[ii]; + if (other.level < level) break; + ikConstraints.Items[ii + 1] = other; } + ikConstraints.Items[ii + 1] = ik; + } + for (int i = 0, n = ikConstraints.Count; i < n; i++) { + IkConstraint constraint = ikConstraints.Items[i]; + Bone target = constraint.target; + SortBone(target); + + ExposedList constrained = constraint.bones; + Bone parent = constrained.Items [0]; + SortBone(parent); + + updateCache.Add(constraint); + + SortReset(parent.children); + constrained.Items[constrained.Count - 1].sorted = true; } - for (int i = 0; i < transformConstraintsCount; i++) { - TransformConstraint transformConstraint = transformConstraints.Items[i]; - for (int ii = updateCache.Count - 1; i >= 0; ii--) { - if (updateCache.Items[ii] == transformConstraint.bone) { - updateCache.Insert(ii + 1, transformConstraint); - break; - } - } + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraint constraint = pathConstraints.Items[i]; + + Slot slot = constraint.Target; + int slotIndex = slot.data.index; + Bone slotBone = slot.bone; + if (skin != null) SortPathConstraintAttachment(skin, slotIndex, slotBone); + if (data.defaultSkin != null && data.defaultSkin != skin) + SortPathConstraintAttachment(data.defaultSkin, slotIndex, slotBone); + for (int ii = 0, nn = data.skins.Count; ii < nn; ii++) + SortPathConstraintAttachment(data.skins.Items[ii], slotIndex, slotBone); + + PathAttachment attachment = slot.Attachment as PathAttachment; + if (attachment != null) SortPathConstraintAttachment(attachment, slotBone); + + ExposedList constrained = constraint.bones; + int boneCount = constrained.Count; + for (int ii = 0; ii < boneCount; ii++) + SortBone(constrained.Items[ii]); + + updateCache.Add(constraint); + + for (int ii = 0; ii < boneCount; ii++) + SortReset(constrained.Items[ii].children); + for (int ii = 0; ii < boneCount; ii++) + constrained.Items[ii].sorted = true; + } + + ExposedList transformConstraints = this.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + TransformConstraint constraint = transformConstraints.Items[i]; + + SortBone(constraint.target); + + ExposedList constrained = constraint.bones; + int boneCount = constrained.Count; + for (int ii = 0; ii < boneCount; ii++) + SortBone(constrained.Items[ii]); + + updateCache.Add(constraint); + + for (int ii = 0; ii < boneCount; ii++) + SortReset(constrained.Items[ii].children); + for (int ii = 0; ii < boneCount; ii++) + constrained.Items[ii].sorted = true; + } + + for (int i = 0, n = bones.Count; i < n; i++) + SortBone(bones.Items[i]); + } + + private void SortPathConstraintAttachment (Skin skin, int slotIndex, Bone slotBone) { + foreach (var entry in skin.Attachments) + if (entry.Key.slotIndex == slotIndex) SortPathConstraintAttachment(entry.Value, slotBone); + } + + private void SortPathConstraintAttachment (Attachment attachment, Bone slotBone) { + var pathAttachment = attachment as PathAttachment; + if (pathAttachment == null) return; + int[] pathBones = pathAttachment.bones; + if (pathBones == null) + SortBone(slotBone); + else { + var bones = this.bones; + for (int i = 0, n = pathBones.Length; i < n; i++) + SortBone(bones.Items[pathBones[i]]); + } + } + + private void SortBone (Bone bone) { + if (bone.sorted) return; + Bone parent = bone.parent; + if (parent != null) SortBone(parent); + bone.sorted = true; + updateCache.Add(bone); + } + + private void SortReset (ExposedList bones) { + var bonesItems = bones.Items; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bonesItems[i]; + if (bone.sorted) SortReset(bone.children); + bone.sorted = false; } } /// Updates the world transform for each bone and applies constraints. public void UpdateWorldTransform () { - ExposedList updateCache = this.updateCache; + var updateCache = this.updateCache; for (int i = 0, n = updateCache.Count; i < n; i++) updateCache.Items[i].Update(); } @@ -150,44 +262,56 @@ namespace Spine { /// Sets the bones and constraints to their setup pose values. public void SetBonesToSetupPose () { - ExposedList bones = this.bones; + var bonesItems = this.bones.Items; for (int i = 0, n = bones.Count; i < n; i++) - bones.Items[i].SetToSetupPose(); + bonesItems[i].SetToSetupPose(); - ExposedList ikConstraints = this.ikConstraints; + var ikConstraintsItems = this.ikConstraints.Items; for (int i = 0, n = ikConstraints.Count; i < n; i++) { - IkConstraint constraint = ikConstraints.Items[i]; + IkConstraint constraint = ikConstraintsItems[i]; constraint.bendDirection = constraint.data.bendDirection; constraint.mix = constraint.data.mix; } - ExposedList transformConstraints = this.transformConstraints; + var transformConstraintsItems = this.transformConstraints.Items; for (int i = 0, n = transformConstraints.Count; i < n; i++) { - TransformConstraint constraint = transformConstraints.Items[i]; + TransformConstraint constraint = transformConstraintsItems[i]; TransformConstraintData data = constraint.data; constraint.rotateMix = data.rotateMix; constraint.translateMix = data.translateMix; constraint.scaleMix = data.scaleMix; constraint.shearMix = data.shearMix; } + + var pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraint constraint = pathConstraints.Items[i]; + PathConstraintData data = constraint.data; + constraint.position = data.position; + constraint.spacing = data.spacing; + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + } } public void SetSlotsToSetupPose () { - ExposedList slots = this.slots; + var slots = this.slots; + var slotsItems = slots.Items; drawOrder.Clear(); for (int i = 0, n = slots.Count; i < n; i++) - drawOrder.Add(slots.Items[i]); + drawOrder.Add(slotsItems[i]); for (int i = 0, n = slots.Count; i < n; i++) - slots.Items[i].SetToSetupPose(i); + slotsItems[i].SetToSetupPose(); } /// May be null. public Bone FindBone (String boneName) { - if (boneName == null) throw new ArgumentNullException("boneName cannot be null."); - ExposedList bones = this.bones; + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; for (int i = 0, n = bones.Count; i < n; i++) { - Bone bone = bones.Items[i]; + Bone bone = bonesItems[i]; if (bone.data.name == boneName) return bone; } return null; @@ -195,19 +319,21 @@ namespace Spine { /// -1 if the bone was not found. public int FindBoneIndex (String boneName) { - if (boneName == null) throw new ArgumentNullException("boneName cannot be null."); - ExposedList bones = this.bones; + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); + var bones = this.bones; + var bonesItems = bones.Items; for (int i = 0, n = bones.Count; i < n; i++) - if (bones.Items[i].data.name == boneName) return i; + if (bonesItems[i].data.name == boneName) return i; return -1; } /// May be null. public Slot FindSlot (String slotName) { - if (slotName == null) throw new ArgumentNullException("slotName cannot be null."); - ExposedList slots = this.slots; + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + var slots = this.slots; + var slotsItems = slots.Items; for (int i = 0, n = slots.Count; i < n; i++) { - Slot slot = slots.Items[i]; + Slot slot = slotsItems[i]; if (slot.data.name == slotName) return slot; } return null; @@ -215,17 +341,18 @@ namespace Spine { /// -1 if the bone was not found. public int FindSlotIndex (String slotName) { - if (slotName == null) throw new ArgumentNullException("slotName cannot be null."); - ExposedList slots = this.slots; + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); + var slots = this.slots; + var slotsItems = slots.Items; for (int i = 0, n = slots.Count; i < n; i++) - if (slots.Items[i].data.name.Equals(slotName)) return i; + if (slotsItems[i].data.name.Equals(slotName)) return i; return -1; } /// Sets a skin by name (see SetSkin). public void SetSkin (String skinName) { Skin skin = data.FindSkin(skinName); - if (skin == null) throw new ArgumentException("Skin not found: " + skinName); + if (skin == null) throw new ArgumentException("Skin not found: " + skinName, "skinName"); SetSkin(skin); } @@ -259,7 +386,7 @@ namespace Spine { /// May be null. public Attachment GetAttachment (int slotIndex, String attachmentName) { - if (attachmentName == null) throw new ArgumentNullException("attachmentName cannot be null."); + if (attachmentName == null) throw new ArgumentNullException("attachmentName", "attachmentName cannot be null."); if (skin != null) { Attachment attachment = skin.GetAttachment(slotIndex, attachmentName); if (attachment != null) return attachment; @@ -270,7 +397,7 @@ namespace Spine { /// May be null. public void SetAttachment (String slotName, String attachmentName) { - if (slotName == null) throw new ArgumentNullException("slotName cannot be null."); + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); ExposedList slots = this.slots; for (int i = 0, n = slots.Count; i < n; i++) { Slot slot = slots.Items[i]; @@ -286,10 +413,10 @@ namespace Spine { } throw new Exception("Slot not found: " + slotName); } - - /** @return May be null. */ + + /// May be null. public IkConstraint FindIkConstraint (String constraintName) { - if (constraintName == null) throw new ArgumentNullException("constraintName cannot be null."); + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); ExposedList ikConstraints = this.ikConstraints; for (int i = 0, n = ikConstraints.Count; i < n; i++) { IkConstraint ikConstraint = ikConstraints.Items[i]; @@ -298,9 +425,9 @@ namespace Spine { return null; } - /** @return May be null. */ + /// May be null. public TransformConstraint FindTransformConstraint (String constraintName) { - if (constraintName == null) throw new ArgumentNullException("constraintName cannot be null."); + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); ExposedList transformConstraints = this.transformConstraints; for (int i = 0, n = transformConstraints.Count; i < n; i++) { TransformConstraint transformConstraint = transformConstraints.Items[i]; @@ -309,6 +436,17 @@ namespace Spine { return null; } + /// May be null. + public PathConstraint FindPathConstraint (String constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraint constraint = pathConstraints.Items[i]; + if (constraint.data.name.Equals(constraintName)) return constraint; + } + return null; + } + public void Update (float delta) { time += delta; } diff --git a/spine-csharp/src/SkeletonBinary.cs b/spine-csharp/src/SkeletonBinary.cs index d5228f43e..e564952ea 100644 --- a/spine-csharp/src/SkeletonBinary.cs +++ b/spine-csharp/src/SkeletonBinary.cs @@ -44,12 +44,17 @@ using Windows.Storage; namespace Spine { public class SkeletonBinary { - public const int TIMELINE_ROTATE = 0; - public const int TIMELINE_TRANSLATE = 1; - public const int TIMELINE_SCALE = 2; - public const int TIMELINE_SHEAR = 3; - public const int TIMELINE_ATTACHMENT = 4; - public const int TIMELINE_COLOR = 5; + public const int BONE_ROTATE = 0; + public const int BONE_TRANSLATE = 1; + public const int BONE_SCALE = 2; + public const int BONE_SHEAR = 3; + + public const int SLOT_ATTACHMENT = 0; + public const int SLOT_COLOR = 1; + + public const int PATH_POSITION = 0; + public const int PATH_SPACING = 1; + public const int PATH_MIX = 2; public const int CURVE_LINEAR = 0; public const int CURVE_STEPPED = 1; @@ -122,55 +127,26 @@ namespace Spine { for (int i = 0, n = ReadVarint(input, true); i < n; i++) { String name = ReadString(input); BoneData parent = i == 0 ? null : skeletonData.bones.Items[ReadVarint(input, true)]; - BoneData boneData = new BoneData(name, parent); - boneData.rotation = ReadFloat(input); - boneData.x = ReadFloat(input) * scale; - boneData.y = ReadFloat(input) * scale; - boneData.scaleX = ReadFloat(input); - boneData.scaleY = ReadFloat(input); - boneData.shearX = ReadFloat(input); - boneData.shearY = ReadFloat(input); - boneData.length = ReadFloat(input) * scale; - boneData.inheritRotation = ReadBoolean(input); - boneData.inheritScale = ReadBoolean(input); + BoneData data = new BoneData(i, name, parent); + data.rotation = ReadFloat(input); + data.x = ReadFloat(input) * scale; + data.y = ReadFloat(input) * scale; + data.scaleX = ReadFloat(input); + data.scaleY = ReadFloat(input); + data.shearX = ReadFloat(input); + data.shearY = ReadFloat(input); + data.length = ReadFloat(input) * scale; + data.inheritRotation = ReadBoolean(input); + data.inheritScale = ReadBoolean(input); if (nonessential) ReadInt(input); // Skip bone color. - skeletonData.bones.Add(boneData); - } - - // IK constraints. - for (int i = 0, n = ReadVarint(input, true); i < n; i++) { - IkConstraintData ikConstraintData = new IkConstraintData(ReadString(input)); - for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) - ikConstraintData.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); - ikConstraintData.target = skeletonData.bones.Items[ReadVarint(input, true)]; - ikConstraintData.mix = ReadFloat(input); - ikConstraintData.bendDirection = ReadSByte(input); - skeletonData.ikConstraints.Add(ikConstraintData); - } - - // Transform constraints. - for (int i = 0, n = ReadVarint(input, true); i < n; i++) { - TransformConstraintData transformConstraintData = new TransformConstraintData(ReadString(input)); - transformConstraintData.bone = skeletonData.bones.Items[ReadVarint(input, true)]; - transformConstraintData.target = skeletonData.bones.Items[ReadVarint(input, true)]; - transformConstraintData.offsetRotation = ReadFloat(input); - transformConstraintData.offsetX = ReadFloat(input) * scale; - transformConstraintData.offsetY = ReadFloat(input) * scale; - transformConstraintData.offsetScaleX = ReadFloat(input); - transformConstraintData.offsetScaleY = ReadFloat(input); - transformConstraintData.offsetShearY = ReadFloat(input); - transformConstraintData.rotateMix = ReadFloat(input); - transformConstraintData.translateMix = ReadFloat(input); - transformConstraintData.scaleMix = ReadFloat(input); - transformConstraintData.shearMix = ReadFloat(input); - skeletonData.transformConstraints.Add(transformConstraintData); + skeletonData.bones.Add(data); } // Slots. for (int i = 0, n = ReadVarint(input, true); i < n; i++) { String slotName = ReadString(input); BoneData boneData = skeletonData.bones.Items[ReadVarint(input, true)]; - SlotData slotData = new SlotData(slotName, boneData); + SlotData slotData = new SlotData(i, slotName, boneData); int color = ReadInt(input); slotData.r = ((color & 0xff000000) >> 24) / 255f; slotData.g = ((color & 0x00ff0000) >> 16) / 255f; @@ -181,6 +157,55 @@ namespace Spine { skeletonData.slots.Add(slotData); } + // IK constraints. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + IkConstraintData data = new IkConstraintData(ReadString(input)); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.bones.Items[ReadVarint(input, true)]; + data.mix = ReadFloat(input); + data.bendDirection = ReadSByte(input); + skeletonData.ikConstraints.Add(data); + } + + // Transform constraints. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + TransformConstraintData data = new TransformConstraintData(ReadString(input)); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.bones.Items[ReadVarint(input, true)]; + data.offsetRotation = ReadFloat(input); + data.offsetX = ReadFloat(input) * scale; + data.offsetY = ReadFloat(input) * scale; + data.offsetScaleX = ReadFloat(input); + data.offsetScaleY = ReadFloat(input); + data.offsetShearY = ReadFloat(input); + data.rotateMix = ReadFloat(input); + data.translateMix = ReadFloat(input); + data.scaleMix = ReadFloat(input); + data.shearMix = ReadFloat(input); + skeletonData.transformConstraints.Add(data); + } + + // Path constraints + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + PathConstraintData data = new PathConstraintData(ReadString(input)); + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) + data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]); + data.target = skeletonData.slots.Items[ReadVarint(input, true)]; + data.positionMode = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(ReadVarint(input, true)); + data.spacingMode = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(ReadVarint(input, true)); + data.rotateMode = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(ReadVarint(input, true)); + data.offsetRotation = ReadFloat(input); + data.position = ReadFloat(input); + if (data.positionMode == PositionMode.Fixed) data.position *= scale; + data.spacing = ReadFloat(input); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale; + data.rotateMix = ReadFloat(input); + data.translateMix = ReadFloat(input); + skeletonData.pathConstraints.Add(data); + } + // Default skin. Skin defaultSkin = ReadSkin(input, "default", nonessential); if (defaultSkin != null) { @@ -199,25 +224,18 @@ namespace Spine { if (skin == null) throw new Exception("Skin not found: " + linkedMesh.skin); Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent); if (parent == null) throw new Exception("Parent mesh not found: " + linkedMesh.parent); - if (linkedMesh.mesh is MeshAttachment) { - MeshAttachment mesh = (MeshAttachment)linkedMesh.mesh; - mesh.ParentMesh = (MeshAttachment)parent; - mesh.UpdateUVs(); - } else { - WeightedMeshAttachment mesh = (WeightedMeshAttachment)linkedMesh.mesh; - mesh.ParentMesh = (WeightedMeshAttachment)parent; - mesh.UpdateUVs(); - } + linkedMesh.mesh.ParentMesh = (MeshAttachment)parent; + linkedMesh.mesh.UpdateUVs(); } linkedMeshes.Clear(); // Events. for (int i = 0, n = ReadVarint(input, true); i < n; i++) { - EventData eventData = new EventData(ReadString(input)); - eventData.Int = ReadVarint(input, false); - eventData.Float = ReadFloat(input); - eventData.String = ReadString(input); - skeletonData.events.Add(eventData); + EventData data = new EventData(ReadString(input)); + data.Int = ReadVarint(input, false); + data.Float = ReadFloat(input); + data.String = ReadString(input); + skeletonData.events.Add(data); } // Animations. @@ -230,10 +248,12 @@ namespace Spine { skeletonData.events.TrimExcess(); skeletonData.animations.TrimExcess(); skeletonData.ikConstraints.TrimExcess(); + skeletonData.pathConstraints.TrimExcess(); return skeletonData; } - /** @return May be null. */ + + /// May be null. private Skin ReadSkin (Stream input, String skinName, bool nonessential) { int slotCount = ReadVarint(input, true); if (slotCount == 0) return null; @@ -256,7 +276,7 @@ namespace Spine { AttachmentType type = (AttachmentType)input.ReadByte(); switch (type) { - case AttachmentType.region: { + case AttachmentType.Region: { String path = ReadString(input); float rotation = ReadFloat(input); float x = ReadFloat(input); @@ -285,96 +305,25 @@ namespace Spine { region.UpdateOffset(); return region; } - case AttachmentType.boundingbox: { - float[] vertices = ReadFloatArray(input, ReadVarint(input, true) * 2, scale); + case AttachmentType.Boundingbox: { + int vertexCount = ReadVarint(input, true); + Vertices vertices = ReadVertices(input, vertexCount); + if (nonessential) ReadInt(input); //int color = nonessential ? ReadInt(input) : 0; // Avoid unused local warning. + BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, name); if (box == null) return null; - box.vertices = vertices; + box.worldVerticesLength = vertexCount << 1; + box.vertices = vertices.vertices; + box.bones = vertices.bones; return box; } - case AttachmentType.mesh: { + case AttachmentType.Mesh: { String path = ReadString(input); int color = ReadInt(input); - int hullLength = 0; - int verticesLength = ReadVarint(input, true) * 2; - float[] uvs = ReadFloatArray(input, verticesLength, 1); + int vertexCount = ReadVarint(input, true); + float[] uvs = ReadFloatArray(input, vertexCount << 1, 1); int[] triangles = ReadShortArray(input); - float[] vertices = ReadFloatArray(input, verticesLength, scale); - hullLength = ReadVarint(input, true); - int[] edges = null; - float width = 0, height = 0; - if (nonessential) { - edges = ReadShortArray(input); - width = ReadFloat(input); - height = ReadFloat(input); - } - - if (path == null) path = name; - MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); - if (mesh == null) return null; - mesh.Path = path; - mesh.r = ((color & 0xff000000) >> 24) / 255f; - mesh.g = ((color & 0x00ff0000) >> 16) / 255f; - mesh.b = ((color & 0x0000ff00) >> 8) / 255f; - mesh.a = ((color & 0x000000ff)) / 255f; - mesh.vertices = vertices; - mesh.triangles = triangles; - mesh.regionUVs = uvs; - mesh.UpdateUVs(); - mesh.HullLength = hullLength; - if (nonessential) { - mesh.Edges = edges; - mesh.Width = width * scale; - mesh.Height = height * scale; - } - return mesh; - } - case AttachmentType.linkedmesh: { - String path = ReadString(input); - int color = ReadInt(input); - String skinName = ReadString(input); - String parent = ReadString(input); - bool inheritFFD = ReadBoolean(input); - float width = 0, height = 0; - if (nonessential) { - width = ReadFloat(input); - height = ReadFloat(input); - } - - if (path == null) path = name; - MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); - if (mesh == null) return null; - mesh.Path = path; - mesh.r = ((color & 0xff000000) >> 24) / 255f; - mesh.g = ((color & 0x00ff0000) >> 16) / 255f; - mesh.b = ((color & 0x0000ff00) >> 8) / 255f; - mesh.a = ((color & 0x000000ff)) / 255f; - mesh.inheritFFD = inheritFFD; - if (nonessential) { - mesh.Width = width * scale; - mesh.Height = height * scale; - } - linkedMeshes.Add(new SkeletonJson.LinkedMesh(mesh, skinName, slotIndex, parent)); - return mesh; - } - case AttachmentType.weightedmesh: { - String path = ReadString(input); - int color = ReadInt(input); - int vertexCount = ReadVarint(input, true); - float[] uvs = ReadFloatArray(input, vertexCount * 2, 1); - int[] triangles = ReadShortArray(input); - var weights = new List(uvs.Length * 3 * 3); - var bones = new List(uvs.Length * 3); - for (int i = 0; i < vertexCount; i++) { - int boneCount = (int)ReadFloat(input); - bones.Add(boneCount); - for (int ii = 0; ii < boneCount; ii++) { - bones.Add((int)ReadFloat(input)); - weights.Add(ReadFloat(input) * scale); - weights.Add(ReadFloat(input) * scale); - weights.Add(ReadFloat(input)); - } - } + Vertices vertices = ReadVertices(input, vertexCount); int hullLength = ReadVarint(input, true); int[] edges = null; float width = 0, height = 0; @@ -385,33 +334,33 @@ namespace Spine { } if (path == null) path = name; - WeightedMeshAttachment mesh = attachmentLoader.NewWeightedMeshAttachment(skin, name, path); + MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); if (mesh == null) return null; mesh.Path = path; mesh.r = ((color & 0xff000000) >> 24) / 255f; mesh.g = ((color & 0x00ff0000) >> 16) / 255f; mesh.b = ((color & 0x0000ff00) >> 8) / 255f; mesh.a = ((color & 0x000000ff)) / 255f; - mesh.bones = bones.ToArray(); - mesh.weights = weights.ToArray(); + mesh.bones = vertices.bones; + mesh.vertices = vertices.vertices; + mesh.WorldVerticesLength = vertexCount << 1; mesh.triangles = triangles; mesh.regionUVs = uvs; mesh.UpdateUVs(); - mesh.HullLength = hullLength * 2; + mesh.HullLength = hullLength << 1; if (nonessential) { mesh.Edges = edges; mesh.Width = width * scale; mesh.Height = height * scale; } - // return mesh; } - case AttachmentType.weightedlinkedmesh: { + case AttachmentType.Linkedmesh: { String path = ReadString(input); int color = ReadInt(input); String skinName = ReadString(input); String parent = ReadString(input); - bool inheritFFD = ReadBoolean(input); + bool inheritDeform = ReadBoolean(input); float width = 0, height = 0; if (nonessential) { width = ReadFloat(input); @@ -419,14 +368,14 @@ namespace Spine { } if (path == null) path = name; - WeightedMeshAttachment mesh = attachmentLoader.NewWeightedMeshAttachment(skin, name, path); + MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); if (mesh == null) return null; mesh.Path = path; mesh.r = ((color & 0xff000000) >> 24) / 255f; mesh.g = ((color & 0x00ff0000) >> 16) / 255f; mesh.b = ((color & 0x0000ff00) >> 8) / 255f; mesh.a = ((color & 0x000000ff)) / 255f; - mesh.inheritFFD = inheritFFD; + mesh.inheritDeform = inheritDeform; if (nonessential) { mesh.Width = width * scale; mesh.Height = height * scale; @@ -434,10 +383,56 @@ namespace Spine { linkedMeshes.Add(new SkeletonJson.LinkedMesh(mesh, skinName, slotIndex, parent)); return mesh; } + case AttachmentType.Path: { + bool closed = ReadBoolean(input); + bool constantSpeed = ReadBoolean(input); + int vertexCount = ReadVarint(input, true); + Vertices vertices = ReadVertices(input, vertexCount); + float[] lengths = new float[vertexCount / 3]; + for (int i = 0, n = lengths.Length; i < n; i++) + lengths[i] = ReadFloat(input) * scale; + if (nonessential) ReadInt(input); //int color = nonessential ? ReadInt(input) : 0; // Avoid unused local warning. + + PathAttachment path = attachmentLoader.NewPathAttachment(skin, name); + if (path == null) return null; + path.closed = closed; + path.constantSpeed = constantSpeed; + path.worldVerticesLength = vertexCount << 1; + path.vertices = vertices.vertices; + path.bones = vertices.bones; + path.lengths = lengths; + return path; + } } return null; } + private Vertices ReadVertices (Stream input, int vertexCount) { + float scale = Scale; + int verticesLength = vertexCount << 1; + Vertices vertices = new Vertices(); + if(!ReadBoolean(input)) { + vertices.vertices = ReadFloatArray(input, verticesLength, scale); + return vertices; + } + var weights = new ExposedList(verticesLength * 3 * 3); + var bonesArray = new ExposedList(verticesLength * 3); + for (int i = 0; i < vertexCount; i++) { + int boneCount = ReadVarint(input, true); + bonesArray.Add(boneCount); + for (int ii = 0; ii < boneCount; ii++) { + bonesArray.Add(ReadVarint(input, true)); + weights.Add(ReadFloat(input) * scale); + weights.Add(ReadFloat(input) * scale); + weights.Add(ReadFloat(input)); + } + } + + vertices.vertices = weights.ToArray(); + vertices.bones = bonesArray.ToArray(); + return vertices; + } + private float[] ReadFloatArray (Stream input, int n, float scale) { float[] array = new float[n]; if (scale == 1) { @@ -470,7 +465,7 @@ namespace Spine { int timelineType = input.ReadByte(); int frameCount = ReadVarint(input, true); switch (timelineType) { - case TIMELINE_COLOR: { + case SLOT_COLOR: { ColorTimeline timeline = new ColorTimeline(frameCount); timeline.slotIndex = slotIndex; for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { @@ -484,10 +479,10 @@ namespace Spine { if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[frameCount * 5 - 5]); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * ColorTimeline.ENTRIES]); break; } - case TIMELINE_ATTACHMENT: { + case SLOT_ATTACHMENT: { AttachmentTimeline timeline = new AttachmentTimeline(frameCount); timeline.slotIndex = slotIndex; for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) @@ -507,7 +502,7 @@ namespace Spine { int timelineType = input.ReadByte(); int frameCount = ReadVarint(input, true); switch (timelineType) { - case TIMELINE_ROTATE: { + case BONE_ROTATE: { RotateTimeline timeline = new RotateTimeline(frameCount); timeline.boneIndex = boneIndex; for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { @@ -515,17 +510,17 @@ namespace Spine { if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[frameCount * 2 - 2]); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * RotateTimeline.ENTRIES]); break; } - case TIMELINE_TRANSLATE: - case TIMELINE_SCALE: - case TIMELINE_SHEAR: { + case BONE_TRANSLATE: + case BONE_SCALE: + case BONE_SHEAR: { TranslateTimeline timeline; float timelineScale = 1; - if (timelineType == TIMELINE_SCALE) + if (timelineType == BONE_SCALE) timeline = new ScaleTimeline(frameCount); - else if (timelineType == TIMELINE_SHEAR) + else if (timelineType == BONE_SHEAR) timeline = new ShearTimeline(frameCount); else { timeline = new TranslateTimeline(frameCount); @@ -538,7 +533,7 @@ namespace Spine { if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[frameCount * 3 - 3]); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * TranslateTimeline.ENTRIES]); break; } } @@ -546,81 +541,118 @@ namespace Spine { } // IK timelines. - for (int i = 0, n = ReadVarint(input, true); i < n; i++) { - IkConstraintData constraint = skeletonData.ikConstraints.Items[ReadVarint(input, true)]; + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int index = ReadVarint(input, true); int frameCount = ReadVarint(input, true); IkConstraintTimeline timeline = new IkConstraintTimeline(frameCount); - timeline.ikConstraintIndex = skeletonData.ikConstraints.IndexOf(constraint); + timeline.ikConstraintIndex = index; for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadSByte(input)); if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[frameCount * 3 - 3]); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * IkConstraintTimeline.ENTRIES]); } // Transform constraint timelines. for (int i = 0, n = ReadVarint(input, true); i < n; i++) { - TransformConstraintData constraint = skeletonData.transformConstraints.Items[ReadVarint(input, true)]; + int index = ReadVarint(input, true); int frameCount = ReadVarint(input, true); TransformConstraintTimeline timeline = new TransformConstraintTimeline(frameCount); - timeline.transformConstraintIndex = skeletonData.transformConstraints.IndexOf(constraint); + timeline.transformConstraintIndex = index; for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadFloat(input), ReadFloat(input), ReadFloat(input)); if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[frameCount * 5 - 5]); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * TransformConstraintTimeline.ENTRIES]); } - // FFD timelines. + // Path constraint timelines. + for (int i = 0, n = ReadVarint(input, true); i < n; i++) { + int index = ReadVarint(input, true); + PathConstraintData data = skeletonData.pathConstraints.Items[index]; + for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { + int timelineType = ReadSByte(input); + int frameCount = ReadVarint(input, true); + switch(timelineType) { + case PATH_POSITION: + case PATH_SPACING: { + PathConstraintPositionTimeline timeline; + float timelineScale = 1; + if (timelineType == PATH_SPACING) { + timeline = new PathConstraintSpacingTimeline(frameCount); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale; + } else { + timeline = new PathConstraintPositionTimeline(frameCount); + if (data.positionMode == PositionMode.Fixed) timelineScale = scale; + } + timeline.pathConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input) * timelineScale); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * PathConstraintPositionTimeline.ENTRIES]); + break; + } + case PATH_MIX: { + PathConstraintMixTimeline timeline = new PathConstraintMixTimeline(frameCount); + timeline.pathConstraintIndex = index; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { + timeline.SetFrame(frameIndex, ReadFloat(input), ReadFloat(input), ReadFloat(input)); + if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(frameCount - 1) * PathConstraintMixTimeline.ENTRIES]); + break; + } + } + } + } + + // Deform timelines. for (int i = 0, n = ReadVarint(input, true); i < n; i++) { Skin skin = skeletonData.skins.Items[ReadVarint(input, true)]; for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++) { int slotIndex = ReadVarint(input, true); for (int iii = 0, nnn = ReadVarint(input, true); iii < nnn; iii++) { - Attachment attachment = skin.GetAttachment(slotIndex, ReadString(input)); + VertexAttachment attachment = (VertexAttachment)skin.GetAttachment(slotIndex, ReadString(input)); + bool weighted = attachment.bones != null; + float[] vertices = attachment.vertices; + int deformLength = weighted ? vertices.Length / 3 * 2 : vertices.Length; + int frameCount = ReadVarint(input, true); - FfdTimeline timeline = new FfdTimeline(frameCount); + DeformTimeline timeline = new DeformTimeline(frameCount); timeline.slotIndex = slotIndex; timeline.attachment = attachment; + for (int frameIndex = 0; frameIndex < frameCount; frameIndex++) { float time = ReadFloat(input); - - float[] vertices; - int vertexCount; - if (attachment is MeshAttachment) - vertexCount = ((MeshAttachment)attachment).vertices.Length; - else - vertexCount = ((WeightedMeshAttachment)attachment).weights.Length / 3 * 2; - + float[] deform; int end = ReadVarint(input, true); - if (end == 0) { - if (attachment is MeshAttachment) - vertices = ((MeshAttachment)attachment).vertices; - else - vertices = new float[vertexCount]; - } else { - vertices = new float[vertexCount]; + if (end == 0) + deform = weighted ? new float[deformLength] : vertices; + else { + deform = new float[deformLength]; int start = ReadVarint(input, true); end += start; if (scale == 1) { for (int v = start; v < end; v++) - vertices[v] = ReadFloat(input); + deform[v] = ReadFloat(input); } else { for (int v = start; v < end; v++) - vertices[v] = ReadFloat(input) * scale; + deform[v] = ReadFloat(input) * scale; } - if (attachment is MeshAttachment) { - float[] meshVertices = ((MeshAttachment)attachment).vertices; - for (int v = 0, vn = vertices.Length; v < vn; v++) - vertices[v] += meshVertices[v]; + if (!weighted) { + for (int v = 0, vn = deform.Length; v < vn; v++) + deform[v] += vertices[v]; } } - timeline.SetFrame(frameIndex, time, vertices); + timeline.SetFrame(frameIndex, time, deform); if (frameIndex < frameCount - 1) ReadCurve(input, frameIndex, timeline); - } + } timelines.Add(timeline); duration = Math.Max(duration, timeline.frames[frameCount - 1]); } @@ -756,5 +788,10 @@ namespace Spine { length -= count; } } + + internal class Vertices { + public int[] bones; + public float[] vertices; + } } } diff --git a/spine-csharp/src/SkeletonBounds.cs b/spine-csharp/src/SkeletonBounds.cs index 11d875a68..e694e596e 100644 --- a/spine-csharp/src/SkeletonBounds.cs +++ b/spine-csharp/src/SkeletonBounds.cs @@ -30,7 +30,6 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class SkeletonBounds { @@ -80,7 +79,7 @@ namespace Spine { int count = boundingBox.Vertices.Length; polygon.Count = count; if (polygon.Vertices.Length < count) polygon.Vertices = new float[count]; - boundingBox.ComputeWorldVertices(slot.bone, polygon.Vertices); + boundingBox.ComputeWorldVertices(slot, polygon.Vertices); } if (updateAabb) aabbCompute(); diff --git a/spine-csharp/src/SkeletonData.cs b/spine-csharp/src/SkeletonData.cs index b6ff7edb5..dd3dcdbab 100644 --- a/spine-csharp/src/SkeletonData.cs +++ b/spine-csharp/src/SkeletonData.cs @@ -30,7 +30,6 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class SkeletonData { @@ -43,6 +42,7 @@ namespace Spine { internal ExposedList animations = new ExposedList(); internal ExposedList ikConstraints = new ExposedList(); internal ExposedList transformConstraints = new ExposedList(); + internal ExposedList pathConstraints = new ExposedList(); internal float width, height; internal String version, hash, imagesPath; @@ -55,6 +55,8 @@ namespace Spine { public ExposedList Events { get { return events; } set { events = value; } } public ExposedList Animations { get { return animations; } set { animations = value; } } public ExposedList IkConstraints { get { return ikConstraints; } set { ikConstraints = value; } } + public ExposedList TransformConstraints { get { return transformConstraints; } set { transformConstraints = value; } } + public ExposedList PathConstraints { get { return pathConstraints; } set { pathConstraints = value; } } public float Width { get { return width; } set { width = value; } } public float Height { get { return height; } set { height = value; } } /// The Spine version used to export this data. @@ -65,7 +67,7 @@ namespace Spine { /// May be null. public BoneData FindBone (String boneName) { - if (boneName == null) throw new ArgumentNullException("boneName cannot be null."); + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); ExposedList bones = this.bones; for (int i = 0, n = bones.Count; i < n; i++) { BoneData bone = bones.Items[i]; @@ -76,7 +78,7 @@ namespace Spine { /// -1 if the bone was not found. public int FindBoneIndex (String boneName) { - if (boneName == null) throw new ArgumentNullException("boneName cannot be null."); + if (boneName == null) throw new ArgumentNullException("boneName", "boneName cannot be null."); ExposedList bones = this.bones; for (int i = 0, n = bones.Count; i < n; i++) if (bones.Items[i].name == boneName) return i; @@ -87,7 +89,7 @@ namespace Spine { /// May be null. public SlotData FindSlot (String slotName) { - if (slotName == null) throw new ArgumentNullException("slotName cannot be null."); + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); ExposedList slots = this.slots; for (int i = 0, n = slots.Count; i < n; i++) { SlotData slot = slots.Items[i]; @@ -96,9 +98,9 @@ namespace Spine { return null; } - /// -1 if the bone was not found. + /// -1 if the slot was not found. public int FindSlotIndex (String slotName) { - if (slotName == null) throw new ArgumentNullException("slotName cannot be null."); + if (slotName == null) throw new ArgumentNullException("slotName", "slotName cannot be null."); ExposedList slots = this.slots; for (int i = 0, n = slots.Count; i < n; i++) if (slots.Items[i].name == slotName) return i; @@ -109,7 +111,7 @@ namespace Spine { /// May be null. public Skin FindSkin (String skinName) { - if (skinName == null) throw new ArgumentNullException("skinName cannot be null."); + if (skinName == null) throw new ArgumentNullException("skinName", "skinName cannot be null."); foreach (Skin skin in skins) if (skin.name == skinName) return skin; return null; @@ -119,7 +121,7 @@ namespace Spine { /// May be null. public EventData FindEvent (String eventDataName) { - if (eventDataName == null) throw new ArgumentNullException("eventDataName cannot be null."); + if (eventDataName == null) throw new ArgumentNullException("eventDataName", "eventDataName cannot be null."); foreach (EventData eventData in events) if (eventData.name == eventDataName) return eventData; return null; @@ -129,7 +131,7 @@ namespace Spine { /// May be null. public Animation FindAnimation (String animationName) { - if (animationName == null) throw new ArgumentNullException("animationName cannot be null."); + if (animationName == null) throw new ArgumentNullException("animationName", "animationName cannot be null."); ExposedList animations = this.animations; for (int i = 0, n = animations.Count; i < n; i++) { Animation animation = animations.Items[i]; @@ -142,7 +144,7 @@ namespace Spine { /// May be null. public IkConstraintData FindIkConstraint (String constraintName) { - if (constraintName == null) throw new ArgumentNullException("constraintName cannot be null."); + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); ExposedList ikConstraints = this.ikConstraints; for (int i = 0, n = ikConstraints.Count; i < n; i++) { IkConstraintData ikConstraint = ikConstraints.Items[i]; @@ -155,7 +157,7 @@ namespace Spine { /// May be null. public TransformConstraintData FindTransformConstraint (String constraintName) { - if (constraintName == null) throw new ArgumentNullException("constraintName cannot be null."); + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); ExposedList transformConstraints = this.transformConstraints; for (int i = 0, n = transformConstraints.Count; i < n; i++) { TransformConstraintData transformConstraint = transformConstraints.Items[i]; @@ -164,6 +166,28 @@ namespace Spine { return null; } + // --- Path constraints. + + /// May be null. + public PathConstraintData FindPathConstraint (String constraintName) { + if (constraintName == null) throw new ArgumentNullException("constraintName", "constraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + PathConstraintData constraint = pathConstraints.Items[i]; + if (constraint.name.Equals(constraintName)) return constraint; + } + return null; + } + + /// -1 if the path constraint was not found. + public int FindPathConstraintIndex (String pathConstraintName) { + if (pathConstraintName == null) throw new ArgumentNullException("pathConstraintName", "pathConstraintName cannot be null."); + ExposedList pathConstraints = this.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) + if (pathConstraints.Items[i].name.Equals(pathConstraintName)) return i; + return -1; + } + // --- override public String ToString () { diff --git a/spine-csharp/src/SkeletonJson.cs b/spine-csharp/src/SkeletonJson.cs index 5ae9f1238..1ad145e72 100644 --- a/spine-csharp/src/SkeletonJson.cs +++ b/spine-csharp/src/SkeletonJson.cs @@ -54,7 +54,7 @@ namespace Spine { } public SkeletonJson (AttachmentLoader attachmentLoader) { - if (attachmentLoader == null) throw new ArgumentNullException("attachmentLoader cannot be null."); + if (attachmentLoader == null) throw new ArgumentNullException("attachmentLoader", "attachmentLoader cannot be null."); this.attachmentLoader = attachmentLoader; Scale = 1; } @@ -79,7 +79,7 @@ namespace Spine { Stream stream = Microsoft.Xna.Framework.TitleContainer.OpenStream(path); using (StreamReader reader = new StreamReader(stream)) { #else - using (StreamReader reader = new StreamReader(path)) { + using (var reader = new StreamReader(path)) { #endif // WINDOWS_PHONE SkeletonData skeletonData = ReadSkeletonData(reader); skeletonData.name = Path.GetFileNameWithoutExtension(path); @@ -89,7 +89,7 @@ namespace Spine { #endif // WINDOWS_STOREAPP public SkeletonData ReadSkeletonData (TextReader reader) { - if (reader == null) throw new ArgumentNullException("reader cannot be null."); + if (reader == null) throw new ArgumentNullException("reader", "reader cannot be null."); var scale = this.Scale; var skeletonData = new SkeletonData(); @@ -114,69 +114,19 @@ namespace Spine { if (parent == null) throw new Exception("Parent bone not found: " + boneMap["parent"]); } - var boneData = new BoneData((String)boneMap["name"], parent); - boneData.length = GetFloat(boneMap, "length", 0) * scale; - boneData.x = GetFloat(boneMap, "x", 0) * scale; - boneData.y = GetFloat(boneMap, "y", 0) * scale; - boneData.rotation = GetFloat(boneMap, "rotation", 0); - boneData.scaleX = GetFloat(boneMap, "scaleX", 1); - boneData.scaleY = GetFloat(boneMap, "scaleY", 1); - boneData.shearX = GetFloat(boneMap, "shearX", 0); - boneData.shearY = GetFloat(boneMap, "shearY", 0); - boneData.inheritScale = GetBoolean(boneMap, "inheritScale", true); - boneData.inheritRotation = GetBoolean(boneMap, "inheritRotation", true); - skeletonData.bones.Add(boneData); - } + var data = new BoneData(skeletonData.Bones.Count, (String)boneMap["name"], parent); + data.length = GetFloat(boneMap, "length", 0) * scale; + data.x = GetFloat(boneMap, "x", 0) * scale; + data.y = GetFloat(boneMap, "y", 0) * scale; + data.rotation = GetFloat(boneMap, "rotation", 0); + data.scaleX = GetFloat(boneMap, "scaleX", 1); + data.scaleY = GetFloat(boneMap, "scaleY", 1); + data.shearX = GetFloat(boneMap, "shearX", 0); + data.shearY = GetFloat(boneMap, "shearY", 0); + data.inheritRotation = GetBoolean(boneMap, "inheritRotation", true); + data.inheritScale = GetBoolean(boneMap, "inheritScale", true); - // IK constraints. - if (root.ContainsKey("ik")) { - foreach (Dictionary ikMap in (List)root["ik"]) { - IkConstraintData ikConstraintData = new IkConstraintData((String)ikMap["name"]); - - foreach (String boneName in (List)ikMap["bones"]) { - BoneData bone = skeletonData.FindBone(boneName); - if (bone == null) throw new Exception("IK bone not found: " + boneName); - ikConstraintData.bones.Add(bone); - } - - String targetName = (String)ikMap["target"]; - ikConstraintData.target = skeletonData.FindBone(targetName); - if (ikConstraintData.target == null) throw new Exception("Target bone not found: " + targetName); - - ikConstraintData.bendDirection = GetBoolean(ikMap, "bendPositive", true) ? 1 : -1; - ikConstraintData.mix = GetFloat(ikMap, "mix", 1); - - skeletonData.ikConstraints.Add(ikConstraintData); - } - } - - // Transform constraints. - if (root.ContainsKey("transform")) { - foreach (Dictionary transformMap in (List)root["transform"]) { - TransformConstraintData transformConstraintData = new TransformConstraintData((String)transformMap["name"]); - - String boneName = (String)transformMap["bone"]; - transformConstraintData.bone = skeletonData.FindBone(boneName); - if (transformConstraintData.bone == null) throw new Exception("Bone not found: " + boneName); - - String targetName = (String)transformMap["target"]; - transformConstraintData.target = skeletonData.FindBone(targetName); - if (transformConstraintData.target == null) throw new Exception("Target bone not found: " + targetName); - - transformConstraintData.offsetRotation = GetFloat(transformMap, "rotation", 0); - transformConstraintData.offsetX = GetFloat(transformMap, "x", 0) * scale; - transformConstraintData.offsetY = GetFloat(transformMap, "y", 0) * scale; - transformConstraintData.offsetScaleX = GetFloat(transformMap, "scaleX", 0); - transformConstraintData.offsetScaleY = GetFloat(transformMap, "scaleY", 0); - transformConstraintData.offsetShearY = GetFloat(transformMap, "shearY", 0); - - transformConstraintData.rotateMix = GetFloat(transformMap, "rotateMix", 1); - transformConstraintData.translateMix = GetFloat(transformMap, "translateMix", 1); - transformConstraintData.scaleMix = GetFloat(transformMap, "scaleMix", 1); - transformConstraintData.shearMix = GetFloat(transformMap, "shearMix", 1); - - skeletonData.transformConstraints.Add(transformConstraintData); - } + skeletonData.bones.Add(data); } // Slots. @@ -185,44 +135,126 @@ namespace Spine { var slotName = (String)slotMap["name"]; var boneName = (String)slotMap["bone"]; BoneData boneData = skeletonData.FindBone(boneName); - if (boneData == null) - throw new Exception("Slot bone not found: " + boneName); - var slotData = new SlotData(slotName, boneData); + if (boneData == null) throw new Exception("Slot bone not found: " + boneName); + var data = new SlotData(skeletonData.Slots.Count, slotName, boneData); if (slotMap.ContainsKey("color")) { var color = (String)slotMap["color"]; - slotData.r = ToColor(color, 0); - slotData.g = ToColor(color, 1); - slotData.b = ToColor(color, 2); - slotData.a = ToColor(color, 3); + data.r = ToColor(color, 0); + data.g = ToColor(color, 1); + data.b = ToColor(color, 2); + data.a = ToColor(color, 3); + } + + data.attachmentName = GetString(slotMap, "attachment", null); + if (slotMap.ContainsKey("blend")) + data.blendMode = (BlendMode)Enum.Parse(typeof(BlendMode), (String)slotMap["blend"], false); + else + data.blendMode = BlendMode.normal; + skeletonData.slots.Add(data); + } + } + + // IK constraints. + if (root.ContainsKey("ik")) { + foreach (Dictionary constraintMap in (List)root["ik"]) { + IkConstraintData data = new IkConstraintData((String)constraintMap["name"]); + + foreach (String boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("IK constraint bone not found: " + boneName); + data.bones.Add(bone); + } + + String targetName = (String)constraintMap["target"]; + data.target = skeletonData.FindBone(targetName); + if (data.target == null) throw new Exception("Target bone not found: " + targetName); + + data.bendDirection = GetBoolean(constraintMap, "bendPositive", true) ? 1 : -1; + data.mix = GetFloat(constraintMap, "mix", 1); + + skeletonData.ikConstraints.Add(data); + } + } + + // Transform constraints. + if (root.ContainsKey("transform")) { + foreach (Dictionary constraintMap in (List)root["transform"]) { + TransformConstraintData data = new TransformConstraintData((String)constraintMap["name"]); + + foreach (String boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("Transform constraint bone not found: " + boneName); + data.bones.Add(bone); } - if (slotMap.ContainsKey("attachment")) - slotData.attachmentName = (String)slotMap["attachment"]; + String targetName = (String)constraintMap["target"]; + data.target = skeletonData.FindBone(targetName); + if (data.target == null) throw new Exception("Target bone not found: " + targetName); - if (slotMap.ContainsKey("blend")) - slotData.blendMode = (BlendMode)Enum.Parse(typeof(BlendMode), (String)slotMap["blend"], false); - else - slotData.blendMode = BlendMode.normal; + data.offsetRotation = GetFloat(constraintMap, "rotation", 0); + data.offsetX = GetFloat(constraintMap, "x", 0) * scale; + data.offsetY = GetFloat(constraintMap, "y", 0) * scale; + data.offsetScaleX = GetFloat(constraintMap, "scaleX", 0); + data.offsetScaleY = GetFloat(constraintMap, "scaleY", 0); + data.offsetShearY = GetFloat(constraintMap, "shearY", 0); - skeletonData.slots.Add(slotData); + data.rotateMix = GetFloat(constraintMap, "rotateMix", 1); + data.translateMix = GetFloat(constraintMap, "translateMix", 1); + data.scaleMix = GetFloat(constraintMap, "scaleMix", 1); + data.shearMix = GetFloat(constraintMap, "shearMix", 1); + + skeletonData.transformConstraints.Add(data); + } + } + + // Path constraints. + if(root.ContainsKey("path")) { + foreach (Dictionary constraintMap in (List)root["path"]) { + PathConstraintData data = new PathConstraintData((String)constraintMap["name"]); + + foreach (String boneName in (List)constraintMap["bones"]) { + BoneData bone = skeletonData.FindBone(boneName); + if (bone == null) throw new Exception("Path bone not found: " + boneName); + data.bones.Add(bone); + } + + String targetName = (String)constraintMap["target"]; + data.target = skeletonData.FindSlot(targetName); + if (data.target == null) throw new Exception("Target slot not found: " + targetName); + + data.positionMode = (PositionMode)Enum.Parse(typeof(PositionMode), GetString(constraintMap, "positionMode", "percent"), true); + data.spacingMode = (SpacingMode)Enum.Parse(typeof(SpacingMode), GetString(constraintMap, "spacingMode", "length"), true); + data.rotateMode = (RotateMode)Enum.Parse(typeof(RotateMode), GetString(constraintMap, "rotateMode", "tangent"), true); + data.offsetRotation = GetFloat(constraintMap, "rotation", 0); + data.position = GetFloat(constraintMap, "position", 0); + if (data.positionMode == PositionMode.Fixed) data.position *= scale; + data.spacing = GetFloat(constraintMap, "spacing", 0); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale; + data.rotateMix = GetFloat(constraintMap, "rotateMix", 1); + data.translateMix = GetFloat(constraintMap, "translateMix", 1); + + skeletonData.pathConstraints.Add(data); } } // Skins. if (root.ContainsKey("skins")) { - foreach (KeyValuePair entry in (Dictionary)root["skins"]) { - var skin = new Skin(entry.Key); - foreach (KeyValuePair slotEntry in (Dictionary)entry.Value) { + foreach (KeyValuePair skinMap in (Dictionary)root["skins"]) { + var skin = new Skin(skinMap.Key); + foreach (KeyValuePair slotEntry in (Dictionary)skinMap.Value) { int slotIndex = skeletonData.FindSlotIndex(slotEntry.Key); - foreach (KeyValuePair attachmentEntry in ((Dictionary)slotEntry.Value)) { - Attachment attachment = ReadAttachment(skin, slotIndex, attachmentEntry.Key, (Dictionary)attachmentEntry.Value); - if (attachment != null) skin.AddAttachment(slotIndex, attachmentEntry.Key, attachment); - } + foreach (KeyValuePair entry in ((Dictionary)slotEntry.Value)) { + try { + Attachment attachment = ReadAttachment((Dictionary)entry.Value, skin, slotIndex, entry.Key); + if (attachment != null) skin.AddAttachment(slotIndex, entry.Key, attachment); + } catch (Exception e) { + throw new Exception("Error reading attachment: " + entry.Key + ", skin: " + skin, e); + } + } } skeletonData.skins.Add(skin); - if (skin.name == "default") - skeletonData.defaultSkin = skin; + if (skin.name == "default") skeletonData.defaultSkin = skin; } } @@ -233,15 +265,8 @@ namespace Spine { if (skin == null) throw new Exception("Slot not found: " + linkedMesh.skin); Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent); if (parent == null) throw new Exception("Parent mesh not found: " + linkedMesh.parent); - if (linkedMesh.mesh is MeshAttachment) { - MeshAttachment mesh = (MeshAttachment)linkedMesh.mesh; - mesh.ParentMesh = (MeshAttachment)parent; - mesh.UpdateUVs(); - } else { - WeightedMeshAttachment mesh = (WeightedMeshAttachment)linkedMesh.mesh; - mesh.ParentMesh = (WeightedMeshAttachment)parent; - mesh.UpdateUVs(); - } + linkedMesh.mesh.ParentMesh = (MeshAttachment)parent; + linkedMesh.mesh.UpdateUVs(); } linkedMeshes.Clear(); @@ -249,18 +274,23 @@ namespace Spine { if (root.ContainsKey("events")) { foreach (KeyValuePair entry in (Dictionary)root["events"]) { var entryMap = (Dictionary)entry.Value; - var eventData = new EventData(entry.Key); - eventData.Int = GetInt(entryMap, "int", 0); - eventData.Float = GetFloat(entryMap, "float", 0); - eventData.String = GetString(entryMap, "string", null); - skeletonData.events.Add(eventData); + var data = new EventData(entry.Key); + data.Int = GetInt(entryMap, "int", 0); + data.Float = GetFloat(entryMap, "float", 0); + data.String = GetString(entryMap, "string", null); + skeletonData.events.Add(data); } } // Animations. if (root.ContainsKey("animations")) { - foreach (KeyValuePair entry in (Dictionary)root["animations"]) - ReadAnimation(entry.Key, (Dictionary)entry.Value, skeletonData); + foreach (KeyValuePair entry in (Dictionary)root["animations"]) { + try { + ReadAnimation((Dictionary)entry.Value, entry.Key, skeletonData); + } catch (Exception e) { + throw new Exception("Error reading animation: " + entry.Key, e); + } + } } skeletonData.bones.TrimExcess(); @@ -272,25 +302,20 @@ namespace Spine { return skeletonData; } - private Attachment ReadAttachment (Skin skin, int slotIndex, String name, Dictionary map) { - if (map.ContainsKey("name")) - name = (String)map["name"]; - + private Attachment ReadAttachment (Dictionary map, Skin skin, int slotIndex, String name) { var scale = this.Scale; + name = GetString(map, "name", name); - var type = AttachmentType.region; - if (map.ContainsKey("type")) { - var typeName = (String)map["type"]; - if (typeName == "skinnedmesh") typeName = "weightedmesh"; - type = (AttachmentType)Enum.Parse(typeof(AttachmentType), typeName , false); - } + var typeName = GetString(map, "type", "region"); + if (typeName == "skinnedmesh") typeName = "weightedmesh"; + if (typeName == "weightedmesh") typeName = "mesh"; + if (typeName == "weightedlinkedmesh") typeName = "linkedmesh"; + var type = (AttachmentType)Enum.Parse(typeof(AttachmentType), typeName, true); - String path = name; - if (map.ContainsKey("path")) - path = (String)map["path"]; + String path = GetString(map, "path", name); switch (type) { - case AttachmentType.region: + case AttachmentType.Region: RegionAttachment region = attachmentLoader.NewRegionAttachment(skin, name, path); if (region == null) return null; region.Path = path; @@ -311,9 +336,15 @@ namespace Spine { region.a = ToColor(color, 3); } + region.UpdateOffset(); return region; - case AttachmentType.mesh: - case AttachmentType.linkedmesh: { + case AttachmentType.Boundingbox: + BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, name); + if (box == null) return null; + ReadVertices(map, box, GetInt(map, "vertexCount", 0) << 1); + return box; + case AttachmentType.Mesh: + case AttachmentType.Linkedmesh: { MeshAttachment mesh = attachmentLoader.NewMeshAttachment(skin, name, path); if (mesh == null) return null; mesh.Path = path; @@ -326,145 +357,83 @@ namespace Spine { mesh.a = ToColor(color, 3); } - mesh.Width = GetInt(map, "width", 0) * scale; - mesh.Height = GetInt(map, "height", 0) * scale; + mesh.Width = GetFloat(map, "width", 0) * scale; + mesh.Height = GetFloat(map, "height", 0) * scale; String parent = GetString(map, "parent", null); - if (parent == null) { - mesh.vertices = GetFloatArray(map, "vertices", scale); - mesh.triangles = GetIntArray(map, "triangles"); - mesh.regionUVs = GetFloatArray(map, "uvs", 1); - mesh.UpdateUVs(); - - mesh.HullLength = GetInt(map, "hull", 0) * 2; - if (map.ContainsKey("edges")) mesh.Edges = GetIntArray(map, "edges"); - } else { - mesh.InheritFFD = GetBoolean(map, "ffd", true); + if (parent != null) { + mesh.InheritDeform = GetBoolean(map, "deform", true); linkedMeshes.Add(new LinkedMesh(mesh, GetString(map, "skin", null), slotIndex, parent)); + return mesh; } + float[] uvs = GetFloatArray(map, "uvs", 1); + ReadVertices(map, mesh, uvs.Length); + mesh.triangles = GetIntArray(map, "triangles"); + mesh.regionUVs = uvs; + mesh.UpdateUVs(); + + if (map.ContainsKey("hull")) mesh.HullLength = GetInt(map, "hull", 0) * 2; + if (map.ContainsKey("edges")) mesh.Edges = GetIntArray(map, "edges"); return mesh; } - case AttachmentType.weightedmesh: - case AttachmentType.weightedlinkedmesh: { - WeightedMeshAttachment mesh = attachmentLoader.NewWeightedMeshAttachment(skin, name, path); - if (mesh == null) return null; + case AttachmentType.Path: { + PathAttachment pathAttachment = attachmentLoader.NewPathAttachment(skin, name); + if (pathAttachment == null) return null; + pathAttachment.closed = GetBoolean(map, "closed", false); + pathAttachment.constantSpeed = GetBoolean(map, "constantSpeed", true); - mesh.Path = path; + int vertexCount = GetInt(map, "vertexCount", 0); + ReadVertices(map, pathAttachment, vertexCount << 1); - if (map.ContainsKey("color")) { - var color = (String)map["color"]; - mesh.r = ToColor(color, 0); - mesh.g = ToColor(color, 1); - mesh.b = ToColor(color, 2); - mesh.a = ToColor(color, 3); - } - - mesh.Width = GetInt(map, "width", 0) * scale; - mesh.Height = GetInt(map, "height", 0) * scale; - - String parent = GetString(map, "parent", null); - if (parent == null) { - float[] uvs = GetFloatArray(map, "uvs", 1); - float[] vertices = GetFloatArray(map, "vertices", 1); - var weights = new List(uvs.Length * 3 * 3); - var bones = new List(uvs.Length * 3); - for (int i = 0, n = vertices.Length; i < n;) { - int boneCount = (int)vertices[i++]; - bones.Add(boneCount); - for (int nn = i + boneCount * 4; i < nn; i += 4) { - bones.Add((int)vertices[i]); - weights.Add(vertices[i + 1] * scale); - weights.Add(vertices[i + 2] * scale); - weights.Add(vertices[i + 3]); - } - } - mesh.bones = bones.ToArray(); - mesh.weights = weights.ToArray(); - mesh.triangles = GetIntArray(map, "triangles"); - mesh.regionUVs = uvs; - mesh.UpdateUVs(); - - mesh.HullLength = GetInt(map, "hull", 0) * 2; - if (map.ContainsKey("edges")) mesh.Edges = GetIntArray(map, "edges"); - } else { - mesh.InheritFFD = GetBoolean(map, "ffd", true); - linkedMeshes.Add(new LinkedMesh(mesh, GetString(map, "skin", null), slotIndex, parent)); - } - - return mesh; + // potential BOZO see Java impl + pathAttachment.lengths = GetFloatArray(map, "lengths", scale); + return pathAttachment; } - case AttachmentType.boundingbox: - BoundingBoxAttachment box = attachmentLoader.NewBoundingBoxAttachment(skin, name); - if (box == null) return null; - box.vertices = GetFloatArray(map, "vertices", scale); - return box; } return null; } - private float[] GetFloatArray (Dictionary map, String name, float scale) { - var list = (List)map[name]; - var values = new float[list.Count]; - if (scale == 1) { - for (int i = 0, n = list.Count; i < n; i++) - values[i] = (float)list[i]; - } else { - for (int i = 0, n = list.Count; i < n; i++) - values[i] = (float)list[i] * scale; + private void ReadVertices (Dictionary map, VertexAttachment attachment, int verticesLength) { + attachment.WorldVerticesLength = verticesLength; + float[] vertices = GetFloatArray(map, "vertices", 1); + float scale = Scale; + if (verticesLength == vertices.Length) { + if (scale != 1) { + for (int i = 0; i < vertices.Length; i++) { + vertices[i] *= scale; + } + } + attachment.vertices = vertices; + return; } - return values; + ExposedList weights = new ExposedList(verticesLength * 3 * 3); + ExposedList bones = new ExposedList(verticesLength * 3); + for (int i = 0, n = vertices.Length; i < n;) { + int boneCount = (int)vertices[i++]; + bones.Add(boneCount); + for (int nn = i + boneCount * 4; i < nn; i += 4) { + bones.Add((int)vertices[i]); + weights.Add(vertices[i + 1] * this.Scale); + weights.Add(vertices[i + 2] * this.Scale); + weights.Add(vertices[i + 3]); + } + } + attachment.bones = bones.ToArray(); + attachment.vertices = weights.ToArray(); } - private int[] GetIntArray (Dictionary map, String name) { - var list = (List)map[name]; - var values = new int[list.Count]; - for (int i = 0, n = list.Count; i < n; i++) - values[i] = (int)(float)list[i]; - return values; - } - - private float GetFloat (Dictionary map, String name, float defaultValue) { - if (!map.ContainsKey(name)) - return defaultValue; - return (float)map[name]; - } - - private int GetInt (Dictionary map, String name, int defaultValue) { - if (!map.ContainsKey(name)) - return defaultValue; - return (int)(float)map[name]; - } - - private bool GetBoolean (Dictionary map, String name, bool defaultValue) { - if (!map.ContainsKey(name)) - return defaultValue; - return (bool)map[name]; - } - - private String GetString (Dictionary map, String name, String defaultValue) { - if (!map.ContainsKey(name)) - return defaultValue; - return (String)map[name]; - } - - private float ToColor (String hexString, int colorIndex) { - if (hexString.Length != 8) - throw new ArgumentException("Color hexidecimal length must be 8, recieved: " + hexString); - return Convert.ToInt32(hexString.Substring(colorIndex * 2, 2), 16) / (float)255; - } - - private void ReadAnimation (String name, Dictionary map, SkeletonData skeletonData) { + private void ReadAnimation (Dictionary map, String name, SkeletonData skeletonData) { + var scale = this.Scale; var timelines = new ExposedList(); float duration = 0; - var scale = this.Scale; + // Slot timelines. if (map.ContainsKey("slots")) { foreach (KeyValuePair entry in (Dictionary)map["slots"]) { String slotName = entry.Key; int slotIndex = skeletonData.FindSlotIndex(slotName); var timelineMap = (Dictionary)entry.Value; - foreach (KeyValuePair timelineEntry in timelineMap) { var values = (List)timelineEntry.Value; var timelineName = (String)timelineEntry.Key; @@ -477,11 +446,11 @@ namespace Spine { float time = (float)valueMap["time"]; String c = (String)valueMap["color"]; timeline.SetFrame(frameIndex, time, ToColor(c, 0), ToColor(c, 1), ToColor(c, 2), ToColor(c, 3)); - ReadCurve(timeline, frameIndex, valueMap); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[timeline.FrameCount * 5 - 5]); + duration = Math.Max(duration, timeline.frames[timeline.FrameCount -1] * ColorTimeline.ENTRIES); } else if (timelineName == "attachment") { var timeline = new AttachmentTimeline(values.Count); @@ -501,13 +470,12 @@ namespace Spine { } } + // Bone timelines. if (map.ContainsKey("bones")) { foreach (KeyValuePair entry in (Dictionary)map["bones"]) { String boneName = entry.Key; int boneIndex = skeletonData.FindBoneIndex(boneName); - if (boneIndex == -1) - throw new Exception("Bone not found: " + boneName); - + if (boneIndex == -1) throw new Exception("Bone not found: " + boneName); var timelineMap = (Dictionary)entry.Value; foreach (KeyValuePair timelineEntry in timelineMap) { var values = (List)timelineEntry.Value; @@ -518,13 +486,12 @@ namespace Spine { int frameIndex = 0; foreach (Dictionary valueMap in values) { - float time = (float)valueMap["time"]; - timeline.SetFrame(frameIndex, time, (float)valueMap["angle"]); - ReadCurve(timeline, frameIndex, valueMap); + timeline.SetFrame(frameIndex, (float)valueMap["time"], (float)valueMap["angle"]); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[timeline.FrameCount * 2 - 2]); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * RotateTimeline.ENTRIES]); } else if (timelineName == "translate" || timelineName == "scale" || timelineName == "shear") { TranslateTimeline timeline; @@ -544,12 +511,12 @@ namespace Spine { float time = (float)valueMap["time"]; float x = GetFloat(valueMap, "x", 0); float y = GetFloat(valueMap, "y", 0); - timeline.SetFrame(frameIndex, time, (float)x * timelineScale, (float)y * timelineScale); - ReadCurve(timeline, frameIndex, valueMap); + timeline.SetFrame(frameIndex, time, x * timelineScale, y * timelineScale); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[timeline.FrameCount * 3 - 3]); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TranslateTimeline.ENTRIES]); } else throw new Exception("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); @@ -557,7 +524,7 @@ namespace Spine { } } - // IK timelines. + // IK constraint timelines. if (map.ContainsKey("ik")) { foreach (KeyValuePair constraintMap in (Dictionary)map["ik"]) { IkConstraintData constraint = skeletonData.FindIkConstraint(constraintMap.Key); @@ -570,11 +537,11 @@ namespace Spine { float mix = GetFloat(valueMap, "mix", 1); bool bendPositive = GetBoolean(valueMap, "bendPositive", true); timeline.SetFrame(frameIndex, time, mix, bendPositive ? 1 : -1); - ReadCurve(timeline, frameIndex, valueMap); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[timeline.FrameCount * 3 - 3]); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * IkConstraintTimeline.ENTRIES]); } } @@ -593,62 +560,103 @@ namespace Spine { float scaleMix = GetFloat(valueMap, "scaleMix", 1); float shearMix = GetFloat(valueMap, "shearMix", 1); timeline.SetFrame(frameIndex, time, rotateMix, translateMix, scaleMix, shearMix); - ReadCurve(timeline, frameIndex, valueMap); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); - duration = Math.Max(duration, timeline.frames[timeline.FrameCount * 5 - 5]); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * TransformConstraintTimeline.ENTRIES]); } } - // FFD timelines. - if (map.ContainsKey("ffd")) { - foreach (KeyValuePair ffdMap in (Dictionary)map["ffd"]) { - Skin skin = skeletonData.FindSkin(ffdMap.Key); - foreach (KeyValuePair slotMap in (Dictionary)ffdMap.Value) { - int slotIndex = skeletonData.FindSlotIndex(slotMap.Key); - foreach (KeyValuePair meshMap in (Dictionary)slotMap.Value) { - var values = (List)meshMap.Value; - var timeline = new FfdTimeline(values.Count); - Attachment attachment = skin.GetAttachment(slotIndex, meshMap.Key); - if (attachment == null) throw new Exception("FFD attachment not found: " + meshMap.Key); - timeline.slotIndex = slotIndex; - timeline.attachment = attachment; - - int vertexCount; - if (attachment is MeshAttachment) - vertexCount = ((MeshAttachment)attachment).vertices.Length; - else - vertexCount = ((WeightedMeshAttachment)attachment).Weights.Length / 3 * 2; - + // Path constraint timelines. + if (map.ContainsKey("paths")) { + foreach (KeyValuePair constraintMap in (Dictionary)map["paths"]) { + int index = skeletonData.FindPathConstraintIndex(constraintMap.Key); + if (index == -1) throw new Exception("Path constraint not found: " + constraintMap.Key); + PathConstraintData data = skeletonData.pathConstraints.Items[index]; + var timelineMap = (Dictionary)constraintMap.Value; + foreach (KeyValuePair timelineEntry in timelineMap) { + var values = (List)timelineEntry.Value; + var timelineName = (String)timelineEntry.Key; + if (timelineName == "position" || timelineName == "spacing") { + PathConstraintPositionTimeline timeline; + float timelineScale = 1; + if (timelineName == "spacing") { + timeline = new PathConstraintSpacingTimeline(values.Count); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale; + } + else { + timeline = new PathConstraintPositionTimeline(values.Count); + if (data.positionMode == PositionMode.Fixed) timelineScale = scale; + } + timeline.pathConstraintIndex = index; int frameIndex = 0; foreach (Dictionary valueMap in values) { - float[] vertices; + timeline.SetFrame(frameIndex, (float)valueMap["time"], GetFloat(valueMap, timelineName, 0) * timelineScale); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * PathConstraintPositionTimeline.ENTRIES]); + } + else if (timelineName == "mix") { + PathConstraintMixTimeline timeline = new PathConstraintMixTimeline(values.Count); + timeline.pathConstraintIndex = index; + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + timeline.SetFrame(frameIndex, (float)valueMap["time"], GetFloat(valueMap, "rotateMix", 1), GetFloat(valueMap, "translateMix", 1)); + ReadCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.Add(timeline); + duration = Math.Max(duration, timeline.frames[(timeline.FrameCount - 1) * PathConstraintMixTimeline.ENTRIES]); + } + } + } + } + + // Deform timelines. + if (map.ContainsKey("deform")) { + foreach (KeyValuePair deformMap in (Dictionary)map["deform"]) { + Skin skin = skeletonData.FindSkin(deformMap.Key); + foreach (KeyValuePair slotMap in (Dictionary)deformMap.Value) { + int slotIndex = skeletonData.FindSlotIndex(slotMap.Key); + if (slotIndex == -1) throw new Exception("Slot not found: " + slotMap.Key); + foreach (KeyValuePair timelineMap in (Dictionary)slotMap.Value) { + var values = (List)timelineMap.Value; + VertexAttachment attachment = (VertexAttachment)skin.GetAttachment(slotIndex, timelineMap.Key); + if (attachment == null) throw new Exception("Deform attachment not found: " + timelineMap.Key); + bool weighted = attachment.bones != null; + float[] vertices = attachment.vertices; + int deformLength = weighted ? vertices.Length / 3 * 2 : vertices.Length; + + var timeline = new DeformTimeline(values.Count); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + + int frameIndex = 0; + foreach (Dictionary valueMap in values) { + float[] deform; if (!valueMap.ContainsKey("vertices")) { - if (attachment is MeshAttachment) - vertices = ((MeshAttachment)attachment).vertices; - else - vertices = new float[vertexCount]; + deform = weighted ? new float[deformLength] : vertices; } else { - var verticesValue = (List)valueMap["vertices"]; - vertices = new float[vertexCount]; + deform = new float[deformLength]; int start = GetInt(valueMap, "offset", 0); - if (scale == 1) { - for (int i = 0, n = verticesValue.Count; i < n; i++) - vertices[i + start] = (float)verticesValue[i]; - } else { - for (int i = 0, n = verticesValue.Count; i < n; i++) - vertices[i + start] = (float)verticesValue[i] * scale; + float[] verticesValue = GetFloatArray(valueMap, "vertices", 1); + Array.Copy(verticesValue, 0, deform, start, verticesValue.Length); + if (scale != 1) { + for (int i = start, n = i + verticesValue.Length; i < n; i++) + deform[i] *= scale; } - if (attachment is MeshAttachment) { - float[] meshVertices = ((MeshAttachment)attachment).vertices; - for (int i = 0; i < vertexCount; i++) - vertices[i] += meshVertices[i]; + + if (!weighted) { + for (int i = 0; i < deformLength; i++) + deform[i] += vertices[i]; } } - timeline.SetFrame(frameIndex, (float)valueMap["time"], vertices); - ReadCurve(timeline, frameIndex, valueMap); + timeline.SetFrame(frameIndex, (float)valueMap["time"], deform); + ReadCurve(valueMap, timeline, frameIndex); frameIndex++; } timelines.Add(timeline); @@ -658,6 +666,7 @@ namespace Spine { } } + // Draw order timeline. if (map.ContainsKey("drawOrder") || map.ContainsKey("draworder")) { var values = (List)map[map.ContainsKey("drawOrder") ? "drawOrder" : "draworder"]; var timeline = new DrawOrderTimeline(values.Count); @@ -695,6 +704,7 @@ namespace Spine { duration = Math.Max(duration, timeline.frames[timeline.FrameCount - 1]); } + // Event timeline. if (map.ContainsKey("events")) { var eventsMap = (List)map["events"]; var timeline = new EventTimeline(eventsMap.Count); @@ -716,29 +726,81 @@ namespace Spine { skeletonData.animations.Add(new Animation(name, timelines, duration)); } - private void ReadCurve (CurveTimeline timeline, int frameIndex, Dictionary valueMap) { + static void ReadCurve (Dictionary valueMap, CurveTimeline timeline, int frameIndex) { if (!valueMap.ContainsKey("curve")) return; Object curveObject = valueMap["curve"]; if (curveObject.Equals("stepped")) timeline.SetStepped(frameIndex); - else if (curveObject is List) { - var curve = (List)curveObject; - timeline.SetCurve(frameIndex, (float)curve[0], (float)curve[1], (float)curve[2], (float)curve[3]); + else { + var curve = curveObject as List; + if (curve != null) + timeline.SetCurve(frameIndex, (float)curve[0], (float)curve[1], (float)curve[2], (float)curve[3]); } } internal class LinkedMesh { internal String parent, skin; internal int slotIndex; - internal Attachment mesh; + internal MeshAttachment mesh; - public LinkedMesh (Attachment mesh, String skin, int slotIndex, String parent) { + public LinkedMesh (MeshAttachment mesh, String skin, int slotIndex, String parent) { this.mesh = mesh; this.skin = skin; this.slotIndex = slotIndex; this.parent = parent; } } + + static float[] GetFloatArray(Dictionary map, String name, float scale) { + var list = (List)map[name]; + var values = new float[list.Count]; + if (scale == 1) { + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (float)list[i]; + } else { + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (float)list[i] * scale; + } + return values; + } + + static int[] GetIntArray(Dictionary map, String name) { + var list = (List)map[name]; + var values = new int[list.Count]; + for (int i = 0, n = list.Count; i < n; i++) + values[i] = (int)(float)list[i]; + return values; + } + + static float GetFloat(Dictionary map, String name, float defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (float)map[name]; + } + + static int GetInt(Dictionary map, String name, int defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (int)(float)map[name]; + } + + static bool GetBoolean(Dictionary map, String name, bool defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (bool)map[name]; + } + + static String GetString(Dictionary map, String name, String defaultValue) { + if (!map.ContainsKey(name)) + return defaultValue; + return (String)map[name]; + } + + static float ToColor(String hexString, int colorIndex) { + if (hexString.Length != 8) + throw new ArgumentException("Color hexidecimal length must be 8, recieved: " + hexString, "hexString"); + return Convert.ToInt32(hexString.Substring(colorIndex * 2, 2), 16) / (float)255; + } } } diff --git a/spine-csharp/src/Skin.cs b/spine-csharp/src/Skin.cs index 2f6b86019..c3fdd4e40 100644 --- a/spine-csharp/src/Skin.cs +++ b/spine-csharp/src/Skin.cs @@ -40,14 +40,15 @@ namespace Spine { new Dictionary(AttachmentKeyTupleComparer.Instance); public String Name { get { return name; } } + public Dictionary Attachments { get { return attachments; } } public Skin (String name) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); this.name = name; } public void AddAttachment (int slotIndex, String name, Attachment attachment) { - if (attachment == null) throw new ArgumentNullException("attachment cannot be null."); + if (attachment == null) throw new ArgumentNullException("attachment", "attachment cannot be null."); attachments[new AttachmentKeyTuple(slotIndex, name)] = attachment; } @@ -59,13 +60,13 @@ namespace Spine { } public void FindNamesForSlot (int slotIndex, List names) { - if (names == null) throw new ArgumentNullException("names cannot be null."); + if (names == null) throw new ArgumentNullException("names", "names cannot be null."); foreach (AttachmentKeyTuple key in attachments.Keys) if (key.slotIndex == slotIndex) names.Add(key.name); } public void FindAttachmentsForSlot (int slotIndex, List attachments) { - if (attachments == null) throw new ArgumentNullException("attachments cannot be null."); + if (attachments == null) throw new ArgumentNullException("attachments", "attachments cannot be null."); foreach (KeyValuePair entry in this.attachments) if (entry.Key.slotIndex == slotIndex) attachments.Add(entry.Value); } @@ -86,7 +87,7 @@ namespace Spine { } } - struct AttachmentKeyTuple { + public struct AttachmentKeyTuple { public readonly int slotIndex; public readonly string name; internal readonly int nameHashCode; diff --git a/spine-csharp/src/Slot.cs b/spine-csharp/src/Slot.cs index cce0fd869..552264083 100644 --- a/spine-csharp/src/Slot.cs +++ b/spine-csharp/src/Slot.cs @@ -38,8 +38,7 @@ namespace Spine { internal float r, g, b, a; internal Attachment attachment; internal float attachmentTime; - internal float[] attachmentVertices = new float[0]; - internal int attachmentVerticesCount; + internal ExposedList attachmentVertices = new ExposedList(); public SlotData Data { get { return data; } } public Bone Bone { get { return bone; } } @@ -51,38 +50,31 @@ namespace Spine { /// May be null. public Attachment Attachment { - get { - return attachment; - } + get { return attachment; } set { if (attachment == value) return; attachment = value; attachmentTime = bone.skeleton.time; - attachmentVerticesCount = 0; + attachmentVertices.Clear(false); } } public float AttachmentTime { - get { - return bone.skeleton.time - attachmentTime; - } - set { - attachmentTime = bone.skeleton.time - value; - } + get { return bone.skeleton.time - attachmentTime; } + set { attachmentTime = bone.skeleton.time - value; } } - public float[] AttachmentVertices { get { return attachmentVertices; } set { attachmentVertices = value; } } - public int AttachmentVerticesCount { get { return attachmentVerticesCount; } set { attachmentVerticesCount = value; } } + public ExposedList AttachmentVertices { get { return attachmentVertices; } set { attachmentVertices = value; } } public Slot (SlotData data, Bone bone) { - if (data == null) throw new ArgumentNullException("data cannot be null."); - if (bone == null) throw new ArgumentNullException("bone cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (bone == null) throw new ArgumentNullException("bone", "bone cannot be null."); this.data = data; this.bone = bone; SetToSetupPose(); } - internal void SetToSetupPose (int slotIndex) { + public void SetToSetupPose () { r = data.r; g = data.g; b = data.b; @@ -91,14 +83,10 @@ namespace Spine { Attachment = null; else { attachment = null; - Attachment = bone.skeleton.GetAttachment(slotIndex, data.attachmentName); + Attachment = bone.skeleton.GetAttachment(data.index, data.attachmentName); } } - public void SetToSetupPose () { - SetToSetupPose(bone.skeleton.data.slots.IndexOf(data)); - } - override public String ToString () { return data.name; } diff --git a/spine-csharp/src/SlotData.cs b/spine-csharp/src/SlotData.cs index 1a0e072b6..0ba5631b8 100644 --- a/spine-csharp/src/SlotData.cs +++ b/spine-csharp/src/SlotData.cs @@ -33,12 +33,14 @@ using System; namespace Spine { public class SlotData { + internal int index; internal String name; internal BoneData boneData; internal float r = 1, g = 1, b = 1, a = 1; internal String attachmentName; internal BlendMode blendMode; + public int Index { get { return index; } } public String Name { get { return name; } } public BoneData BoneData { get { return boneData; } } public float R { get { return r; } set { r = value; } } @@ -49,9 +51,11 @@ namespace Spine { public String AttachmentName { get { return attachmentName; } set { attachmentName = value; } } public BlendMode BlendMode { get { return blendMode; } set { blendMode = value; } } - public SlotData (String name, BoneData boneData) { - if (name == null) throw new ArgumentNullException("name cannot be null."); - if (boneData == null) throw new ArgumentNullException("boneData cannot be null."); + public SlotData (int index, String name, BoneData boneData) { + if (index < 0) throw new ArgumentException ("index must be >= 0.", "index"); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); + if (boneData == null) throw new ArgumentNullException("boneData", "boneData cannot be null."); + this.index = index; this.name = name; this.boneData = boneData; } diff --git a/spine-csharp/src/TransformConstraint.cs b/spine-csharp/src/TransformConstraint.cs index 4239781a7..df83b9d08 100644 --- a/spine-csharp/src/TransformConstraint.cs +++ b/spine-csharp/src/TransformConstraint.cs @@ -30,46 +30,35 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class TransformConstraint : IUpdatable { internal TransformConstraintData data; - internal Bone bone, target; + internal ExposedList bones; + internal Bone target; internal float rotateMix, translateMix, scaleMix, shearMix; - internal float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY; public TransformConstraintData Data { get { return data; } } - public Bone Bone { get { return bone; } set { bone = value; } } + public ExposedList Bones { get { return bones; } } public Bone Target { get { return target; } set { target = value; } } public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } public float TranslateMix { get { return translateMix; } set { translateMix = value; } } public float ScaleMix { get { return scaleMix; } set { scaleMix = value; } } public float ShearMix { get { return shearMix; } set { shearMix = value; } } - public float OffsetRotation { get { return offsetRotation; } set { offsetRotation = value; } } - public float OffsetX { get { return offsetX; } set { offsetX = value; } } - public float OffsetY { get { return offsetY; } set { offsetY = value; } } - public float OffsetScaleX { get { return offsetScaleX; } set { offsetScaleX = value; } } - public float OffsetScaleY { get { return offsetScaleY; } set { offsetScaleY = value; } } - public float OffsetShearY { get { return offsetShearY; } set { offsetShearY = value; } } - public TransformConstraint (TransformConstraintData data, Skeleton skeleton) { - if (data == null) throw new ArgumentNullException("data cannot be null."); - if (skeleton == null) throw new ArgumentNullException("skeleton cannot be null."); + if (data == null) throw new ArgumentNullException("data", "data cannot be null."); + if (skeleton == null) throw new ArgumentNullException("skeleton", "skeleton cannot be null."); this.data = data; - translateMix = data.translateMix; rotateMix = data.rotateMix; + translateMix = data.translateMix; scaleMix = data.scaleMix; shearMix = data.shearMix; - offsetRotation = data.offsetRotation; - offsetX = data.offsetX; - offsetY = data.offsetY; - offsetScaleX = data.offsetScaleX; - offsetScaleY = data.offsetScaleY; - offsetShearY = data.offsetShearY; - bone = skeleton.FindBone(data.bone.name); + bones = new ExposedList(); + foreach (BoneData boneData in data.bones) + bones.Add (skeleton.FindBone (boneData.name)); + target = skeleton.FindBone(data.target.name); } @@ -78,55 +67,59 @@ namespace Spine { } public void Update () { - Bone bone = this.bone; + float rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; Bone target = this.target; + float ta = target.a, tb = target.b, tc = target.c, td = target.d; + ExposedList bones = this.bones; + for (int i = 0, n = bones.Count; i < n; i++) { + Bone bone = bones.Items[i]; - if (rotateMix > 0) { - float a = bone.a, b = bone.b, c = bone.c, d = bone.d; - float r = MathUtils.Atan2(target.c, target.a) - MathUtils.Atan2(c, a) + offsetRotation * MathUtils.degRad; - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) r += MathUtils.PI2; - r *= rotateMix; - float cos = MathUtils.Cos(r), sin = MathUtils.Sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - } + if (rotateMix > 0) { + float a = bone.a, b = bone.b, c = bone.c, d = bone.d; + float r = (float)Math.Atan2(tc, ta) - (float)Math.Atan2(c, a) + data.offsetRotation * MathUtils.degRad; + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + r *= rotateMix; + float cos = MathUtils.Cos(r), sin = MathUtils.Sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } - if (scaleMix > 0) { - float bs = (float)Math.Sqrt(bone.a * bone.a + bone.c * bone.c); - float ts = (float)Math.Sqrt(target.a * target.a + target.c * target.c); - float s = bs > 0.00001f ? (bs + (ts - bs + offsetScaleX) * scaleMix) / bs : 0; - bone.a *= s; - bone.c *= s; - bs = (float)Math.Sqrt(bone.b * bone.b + bone.d * bone.d); - ts = (float)Math.Sqrt(target.b * target.b + target.d * target.d); - s = bs > 0.00001f ? (bs + (ts - bs + offsetScaleY) * scaleMix) / bs : 0; - bone.b *= s; - bone.d *= s; - } + if (translateMix > 0) { + float tempx, tempy; + target.LocalToWorld(data.offsetX, data.offsetY, out tempx, out tempy); + bone.worldX += (tempx - bone.worldX) * translateMix; + bone.worldY += (tempy - bone.worldY) * translateMix; + } - if (shearMix > 0) { - float b = bone.b, d = bone.d; - float by = MathUtils.Atan2(d, b); - float r = MathUtils.Atan2(target.d, target.b) - MathUtils.Atan2(target.c, target.a) - (by - MathUtils.Atan2(bone.c, bone.a)); - if (r > MathUtils.PI) - r -= MathUtils.PI2; - else if (r < -MathUtils.PI) r += MathUtils.PI2; - r = by + (r + offsetShearY * MathUtils.degRad) * shearMix; - float s = (float)Math.Sqrt(b * b + d * d); - bone.b = MathUtils.Cos(r) * s; - bone.d = MathUtils.Sin(r) * s; - } + if (scaleMix > 0) { + float bs = (float)Math.Sqrt(bone.a * bone.a + bone.c * bone.c); + float ts = (float)Math.Sqrt(ta * ta + tc * tc); + float s = bs > 0.00001f ? (bs + (ts - bs + data.offsetScaleX) * scaleMix) / bs : 0; + bone.a *= s; + bone.c *= s; + bs = (float)Math.Sqrt(bone.b * bone.b + bone.d * bone.d); + ts = (float)Math.Sqrt(tb * tb + td * td); + s = bs > 0.00001f ? (bs + (ts - bs + data.offsetScaleY) * scaleMix) / bs : 0; + bone.b *= s; + bone.d *= s; + } - float translateMix = this.translateMix; - if (translateMix > 0) { - float tx, ty; - target.LocalToWorld(offsetX, offsetY, out tx, out ty); - bone.worldX += (tx - bone.worldX) * translateMix; - bone.worldY += (ty - bone.worldY) * translateMix; + if (shearMix > 0) { + float b = bone.b, d = bone.d; + float by = MathUtils.Atan2(d, b); + float r = MathUtils.Atan2(td, tb) - MathUtils.Atan2(tc, ta) - (by - MathUtils.Atan2(bone.c, bone.a)); + if (r > MathUtils.PI) + r -= MathUtils.PI2; + else if (r < -MathUtils.PI) r += MathUtils.PI2; + r = by + (r + data.offsetShearY * MathUtils.degRad) * shearMix; + float s = (float)Math.Sqrt(b * b + d * d); + bone.b = MathUtils.Cos(r) * s; + bone.d = MathUtils.Sin(r) * s; + } } } diff --git a/spine-csharp/src/TransformConstraintData.cs b/spine-csharp/src/TransformConstraintData.cs index eeee5d21e..b4bba36dd 100644 --- a/spine-csharp/src/TransformConstraintData.cs +++ b/spine-csharp/src/TransformConstraintData.cs @@ -30,17 +30,17 @@ *****************************************************************************/ using System; -using System.Collections.Generic; namespace Spine { public class TransformConstraintData { internal String name; - internal BoneData bone, target; + internal ExposedList bones = new ExposedList(); + internal BoneData target; internal float rotateMix, translateMix, scaleMix, shearMix; internal float offsetRotation, offsetX, offsetY, offsetScaleX, offsetScaleY, offsetShearY; public String Name { get { return name; } } - public BoneData Bone { get { return bone; } set { bone = value; } } + public ExposedList Bones { get { return bones; } } public BoneData Target { get { return target; } set { target = value; } } public float RotateMix { get { return rotateMix; } set { rotateMix = value; } } public float TranslateMix { get { return translateMix; } set { translateMix = value; } } @@ -55,7 +55,7 @@ namespace Spine { public float OffsetShearY { get { return offsetShearY; } set { offsetShearY = value; } } public TransformConstraintData (String name) { - if (name == null) throw new ArgumentNullException("name cannot be null."); + if (name == null) throw new ArgumentNullException("name", "name cannot be null."); this.name = name; } diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java index 3eefa00c5..f737f54e5 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -167,7 +167,7 @@ public class SkeletonJson { String targetName = constraintMap.getString("target"); data.target = skeletonData.findBone(targetName); - if (data.target == null) throw new SerializationException("Target bone not found: " + targetName); + if (data.target == null) throw new SerializationException("IK target bone not found: " + targetName); data.bendDirection = constraintMap.getBoolean("bendPositive", true) ? 1 : -1; data.mix = constraintMap.getFloat("mix", 1); @@ -182,13 +182,13 @@ public class SkeletonJson { for (JsonValue boneMap = constraintMap.getChild("bones"); boneMap != null; boneMap = boneMap.next) { String boneName = boneMap.asString(); BoneData bone = skeletonData.findBone(boneName); - if (bone == null) throw new SerializationException("Path bone not found: " + boneName); + if (bone == null) throw new SerializationException("Transform constraint bone not found: " + boneName); data.bones.add(bone); } String targetName = constraintMap.getString("target"); data.target = skeletonData.findBone(targetName); - if (data.target == null) throw new SerializationException("Target bone not found: " + targetName); + if (data.target == null) throw new SerializationException("Transform constraint target bone not found: " + targetName); data.offsetRotation = constraintMap.getFloat("rotation", 0); data.offsetX = constraintMap.getFloat("x", 0) * scale; @@ -218,7 +218,7 @@ public class SkeletonJson { String targetName = constraintMap.getString("target"); data.target = skeletonData.findSlot(targetName); - if (data.target == null) throw new SerializationException("Target slot not found: " + targetName); + if (data.target == null) throw new SerializationException("Path target slot not found: " + targetName); data.positionMode = PositionMode.valueOf(constraintMap.getString("positionMode", "percent")); data.spacingMode = SpacingMode.valueOf(constraintMap.getString("spacingMode", "length")); diff --git a/spine-monogame/README.md b/spine-monogame/README.md index ae93d235f..76185fe06 100644 --- a/spine-monogame/README.md +++ b/spine-monogame/README.md @@ -10,7 +10,7 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-monogame works with data exported from Spine 3.2.01. Updating spine-monogame to [v3.3](https://github.com/EsotericSoftware/spine-runtimes/issues/613) is in progress. +spine-monogame works with data exported from Spine 3.3.07. spine-monogame supports all Spine features. diff --git a/spine-unity/Assets/Examples/Getting Started/1 The Spine GameObject.unity b/spine-unity/Assets/Examples/Getting Started/1 The Spine GameObject.unity index 4b3446d3c..c9e13e349 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/1 The Spine GameObject.unity and b/spine-unity/Assets/Examples/Getting Started/1 The Spine GameObject.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity b/spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity index eab6bc9bf..9deb572d7 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity and b/spine-unity/Assets/Examples/Getting Started/2 Controlling Animation.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity b/spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity index 6d032562f..661dc5a5f 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity and b/spine-unity/Assets/Examples/Getting Started/3 Controlling Animation Continued.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/4 Object Oriented Sample.unity b/spine-unity/Assets/Examples/Getting Started/4 Object Oriented Sample.unity index 0b3172c32..f93e4070c 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/4 Object Oriented Sample.unity and b/spine-unity/Assets/Examples/Getting Started/4 Object Oriented Sample.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity b/spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity index e2bfd67c3..e5fb0f497 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity and b/spine-unity/Assets/Examples/Getting Started/5 Basic Platformer.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/6 SkeletonGraphic.unity b/spine-unity/Assets/Examples/Getting Started/6 SkeletonGraphic.unity index b6bdee6ed..f96734da1 100644 Binary files a/spine-unity/Assets/Examples/Getting Started/6 SkeletonGraphic.unity and b/spine-unity/Assets/Examples/Getting Started/6 SkeletonGraphic.unity differ diff --git a/spine-unity/Assets/Examples/Getting Started/Scripts/SpineboyBeginnerModel.cs b/spine-unity/Assets/Examples/Getting Started/Scripts/SpineboyBeginnerModel.cs index 20fd265c0..64896112d 100644 --- a/spine-unity/Assets/Examples/Getting Started/Scripts/SpineboyBeginnerModel.cs +++ b/spine-unity/Assets/Examples/Getting Started/Scripts/SpineboyBeginnerModel.cs @@ -50,9 +50,27 @@ public class SpineboyBeginnerModel : MonoBehaviour { IEnumerator JumpRoutine () { if (state == SpineBeginnerBodyState.Jumping) yield break; // Don't jump when already jumping. - // Fake jumping. state = SpineBeginnerBodyState.Jumping; - yield return new WaitForSeconds(1.2f); + + // Terribly-coded Fake jumping. + { + var pos = transform.localPosition; + const float jumpTime = 1.2f; + const float half = jumpTime * 0.5f; + const float jumpPower = 20f; + for (float t = 0; t < half; t += Time.deltaTime) { + float d = jumpPower * (half - t); + transform.Translate((d * Time.deltaTime) * Vector3.up); + yield return null; + } + for (float t = 0; t < half; t += Time.deltaTime) { + float d = jumpPower * t; + transform.Translate((d * Time.deltaTime) * Vector3.down); + yield return null; + } + transform.localPosition = pos; + } + state = SpineBeginnerBodyState.Idle; } diff --git a/spine-unity/Assets/Examples/Other Examples/AtlasRegionAttacher.unity b/spine-unity/Assets/Examples/Other Examples/AtlasRegionAttacher.unity index 4842a5799..80223fcad 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/AtlasRegionAttacher.unity and b/spine-unity/Assets/Examples/Other Examples/AtlasRegionAttacher.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/Dragon.unity b/spine-unity/Assets/Examples/Other Examples/Dragon.unity index afa2abb5b..068358d61 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/Dragon.unity and b/spine-unity/Assets/Examples/Other Examples/Dragon.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/Goblins.unity b/spine-unity/Assets/Examples/Other Examples/Goblins.unity index dd9c62a7c..d668087f6 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/Goblins.unity and b/spine-unity/Assets/Examples/Other Examples/Goblins.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/Mix and Match.unity b/spine-unity/Assets/Examples/Other Examples/Mix and Match.unity index c81130b6a..34505ceb3 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/Mix and Match.unity and b/spine-unity/Assets/Examples/Other Examples/Mix and Match.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SkeletonRenderSeparator.unity b/spine-unity/Assets/Examples/Other Examples/SkeletonRenderSeparator.unity index 30259aa25..7d21b862e 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SkeletonRenderSeparator.unity and b/spine-unity/Assets/Examples/Other Examples/SkeletonRenderSeparator.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Animated Physics.unity b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Animated Physics.unity index 584910f51..656f6fc77 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Animated Physics.unity and b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Animated Physics.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Eyes.unity b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Eyes.unity index dda286dbb..b800ce2d1 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Eyes.unity and b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Eyes.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility GroundConstraint.unity b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility GroundConstraint.unity index 86c0e0eff..2dcb70d43 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility GroundConstraint.unity and b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility GroundConstraint.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Ragdoll.unity b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Ragdoll.unity index bdc1d5d0b..17b539782 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Ragdoll.unity and b/spine-unity/Assets/Examples/Other Examples/SkeletonUtility Ragdoll.unity differ diff --git a/spine-unity/Assets/Examples/Other Examples/SpineGauge.unity b/spine-unity/Assets/Examples/Other Examples/SpineGauge.unity index 6741cb6b9..5efb61299 100644 Binary files a/spine-unity/Assets/Examples/Other Examples/SpineGauge.unity and b/spine-unity/Assets/Examples/Other Examples/SpineGauge.unity differ diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon.json b/spine-unity/Assets/Examples/Spine/Dragon/dragon.json index a22f75978..8ffedc479 100644 --- a/spine-unity/Assets/Examples/Spine/Dragon/dragon.json +++ b/spine-unity/Assets/Examples/Spine/Dragon/dragon.json @@ -1 +1,784 @@ -{"skeleton":{"spine":"1.9.07","hash":"3BCQecnYlSs8J+bIzsK8JxuoBXI","width":897,"height":716.36},"bones":[{"name":"root","y":-176.12},{"name":"COG","parent":"root","y":176.12},{"name":"back","parent":"COG","length":115.37,"x":16.03,"y":27.94,"rotation":151.83},{"name":"chest","parent":"COG","length":31.24,"x":52.52,"y":15.34,"rotation":161.7},{"name":"neck","parent":"COG","length":41.36,"x":64.75,"y":11.98,"rotation":39.05},{"name":"L_front_thigh","parent":"chest","length":67.42,"x":-45.58,"y":7.92,"rotation":138.94},{"name":"L_wing","parent":"chest","length":301.12,"x":-7.24,"y":-24.65,"rotation":-75.51},{"name":"R_front_thigh","parent":"chest","length":81.63,"x":-10.89,"y":28.25,"rotation":67.96},{"name":"R_rear_thigh","parent":"back","length":123.46,"x":65.31,"y":59.89,"rotation":104.87},{"name":"chin","parent":"neck","length":153.15,"x":64.62,"y":-6.99,"rotation":-69.07},{"name":"head","parent":"neck","length":188.83,"x":69.96,"y":2.49,"rotation":8.06},{"name":"tail1","parent":"back","length":65.65,"x":115.37,"y":-0.19,"rotation":44.31},{"name":"L_front_leg","parent":"L_front_thigh","length":51.57,"x":67.42,"y":0.02,"rotation":43.36},{"name":"L_rear_thigh","parent":"R_rear_thigh","length":88.05,"x":-8.59,"y":30.18,"rotation":28.35},{"name":"R_front_leg","parent":"R_front_thigh","length":66.52,"x":83.04,"y":-0.3,"rotation":92.7},{"name":"R_rear_leg","parent":"R_rear_thigh","length":91.06,"x":123.46,"y":-0.26,"rotation":-129.04},{"name":"R_wing","parent":"head","length":359.5,"x":-74.68,"y":20.9,"rotation":83.21},{"name":"tail2","parent":"tail1","length":54.5,"x":65.65,"y":0.22,"rotation":12},{"name":"L_front_toe1","parent":"L_front_leg","length":51.44,"x":45.53,"y":2.43,"rotation":-98},{"name":"L_front_toe2","parent":"L_front_leg","length":61.97,"x":51.57,"y":-0.12,"rotation":-55.26},{"name":"L_front_toe3","parent":"L_front_leg","length":45.65,"x":54.19,"y":0.6,"scaleX":1.134,"rotation":-11.13},{"name":"L_front_toe4","parent":"L_front_leg","length":53.47,"x":50.6,"y":7.08,"scaleX":1.134,"rotation":19.42},{"name":"L_rear_leg","parent":"L_rear_thigh","length":103.74,"x":96.04,"y":-0.97,"rotation":-122.41},{"name":"R_front_toe1","parent":"R_front_leg","length":46.65,"x":70.03,"y":5.31,"rotation":8.59},{"name":"R_front_toe2","parent":"R_front_leg","length":53.66,"x":66.52,"y":0.33,"rotation":-35.02},{"name":"R_front_toe3","parent":"R_front_leg","length":58.38,"x":62.1,"y":-0.79,"rotation":-74.67},{"name":"R_rear_toe1","parent":"R_rear_leg","length":94.99,"x":90.06,"y":2.12,"rotation":141.98},{"name":"R_rear_toe2","parent":"R_rear_leg","length":99.29,"x":89.6,"y":1.52,"rotation":125.32},{"name":"R_rear_toe3","parent":"R_rear_leg","length":103.45,"x":91.06,"y":-0.35,"rotation":112.26},{"name":"tail3","parent":"tail2","length":41.78,"x":54.5,"y":0.37,"rotation":1.8},{"name":"tail4","parent":"tail3","length":34.19,"x":41.78,"y":0.16,"rotation":-1.8},{"name":"tail5","parent":"tail4","length":32.32,"x":34.19,"y":-0.19,"rotation":-3.15},{"name":"tail6","parent":"tail5","length":80.08,"x":32.32,"y":-0.23,"rotation":-29.55}],"ik":[],"slots":[{"name":"L_rear_leg","bone":"L_rear_leg","attachment":"L_rear_leg"},{"name":"L_rear_thigh","bone":"L_rear_thigh","attachment":"L_rear_thigh"},{"name":"L_wing","bone":"L_wing","attachment":"L_wing01"},{"name":"tail6","bone":"tail6","attachment":"tail06"},{"name":"tail5","bone":"tail5","attachment":"tail05"},{"name":"tail4","bone":"tail4","attachment":"tail04"},{"name":"tail3","bone":"tail3","attachment":"tail03"},{"name":"tail2","bone":"tail2","attachment":"tail02"},{"name":"tail1","bone":"tail1","attachment":"tail01"},{"name":"back","bone":"back","attachment":"back"},{"name":"L_front_thigh","bone":"L_front_thigh","attachment":"L_front_thigh"},{"name":"L_front_leg","bone":"L_front_leg","attachment":"L_front_leg"},{"name":"L_front_toe1","bone":"L_front_toe1","attachment":"front_toeA"},{"name":"L_front_toe4","bone":"L_front_toe4","attachment":"front_toeB"},{"name":"L_front_toe3","bone":"L_front_toe3","attachment":"front_toeB"},{"name":"L_front_toe2","bone":"L_front_toe2","attachment":"front_toeB"},{"name":"chest","bone":"chest","attachment":"chest"},{"name":"R_rear_toe1","bone":"R_rear_toe1","attachment":"rear-toe"},{"name":"R_rear_toe2","bone":"R_rear_toe2","attachment":"rear-toe"},{"name":"R_rear_toe3","bone":"R_rear_toe3","attachment":"rear-toe"},{"name":"R_rear_leg","bone":"R_rear_leg","attachment":"R_rear_leg"},{"name":"R_rear_thigh","bone":"R_rear_thigh","attachment":"R_rear_thigh"},{"name":"R_front_toe1","bone":"R_front_toe1","attachment":"front_toeB"},{"name":"R_front_thigh","bone":"R_front_thigh","attachment":"R_front_thigh"},{"name":"R_front_leg","bone":"R_front_leg","attachment":"R_front_leg"},{"name":"R_front_toe2","bone":"R_front_toe2","attachment":"front_toeB"},{"name":"R_front_toe3","bone":"R_front_toe3","attachment":"front_toeB"},{"name":"chin","bone":"chin","attachment":"chin"},{"name":"R_wing","bone":"R_wing","attachment":"R_wing01"},{"name":"head","bone":"head","attachment":"head"},{"name":"logo","bone":"root","attachment":"logo"}],"skins":{"default":{"R_rear_leg":{"R_rear_leg":{"x":60.87,"y":-5.72,"rotation":-127.66,"width":116,"height":100}},"chest":{"chest":{"x":-14.6,"y":24.78,"rotation":-161.7,"width":136,"height":122}},"L_front_leg":{"L_front_leg":{"x":14.68,"y":0.48,"rotation":15.99,"width":84,"height":57}},"L_rear_leg":{"L_rear_leg":{"x":67.29,"y":12.62,"rotation":-162.65,"width":206,"height":177}},"R_rear_thigh":{"R_rear_thigh":{"x":53.25,"y":12.58,"rotation":103.29,"width":91,"height":149}},"R_front_toe1":{"front_toeB":{"x":24.49,"y":-2.61,"rotation":104.18,"width":56,"height":57}},"R_front_leg":{"R_front_leg":{"x":17.79,"y":4.22,"rotation":37.62,"width":101,"height":89}},"R_front_toe3":{"front_toeB":{"x":30.66,"y":-0.06,"rotation":112.29,"width":56,"height":57}},"L_front_thigh":{"L_front_thigh":{"x":27.66,"y":-11.58,"rotation":58.66,"width":84,"height":72}},"L_rear_thigh":{"L_rear_thigh":{"x":56.03,"y":27.38,"rotation":74.93,"width":91,"height":149}},"L_front_toe1":{"front_toeA":{"x":31.92,"y":0.61,"rotation":109.55,"width":29,"height":50}},"L_front_toe2":{"front_toeB":{"x":26.83,"y":-4.94,"rotation":109.51,"width":56,"height":57}},"L_front_toe3":{"front_toeB":{"x":18.21,"y":-7.21,"scaleX":0.881,"scaleY":0.94,"rotation":99.71,"width":56,"height":57}},"L_front_toe4":{"front_toeB":{"x":23.21,"y":-11.68,"scaleX":0.881,"rotation":79.89,"width":56,"height":57}},"R_wing":{"R_wing01":{"x":170.08,"y":-23.67,"rotation":-130.33,"width":219,"height":310},"R_wing02":{"x":171.14,"y":-19.33,"rotation":-130.33,"width":203,"height":305},"R_wing03":{"x":166.46,"y":29.23,"rotation":-130.33,"width":272,"height":247},"R_wing04":{"x":42.94,"y":134.05,"rotation":-130.33,"width":279,"height":144},"R_wing05":{"x":-8.83,"y":142.59,"rotation":-130.33,"width":251,"height":229},"R_wing06":{"x":-123.33,"y":111.22,"rotation":-130.33,"width":200,"height":366},"R_wing07":{"x":-40.17,"y":118.03,"rotation":-130.33,"width":200,"height":263},"R_wing08":{"x":48.01,"y":28.76,"rotation":-130.33,"width":234,"height":254},"R_wing09":{"x":128.1,"y":21.12,"rotation":-130.33,"width":248,"height":204}},"L_wing":{"L_wing01":{"x":129.21,"y":-45.49,"rotation":-83.7,"width":191,"height":256},"L_wing02":{"x":126.37,"y":-31.69,"rotation":-86.18,"width":179,"height":269},"L_wing03":{"x":110.26,"y":-90.89,"rotation":-86.18,"width":186,"height":207},"L_wing04":{"x":-61.61,"y":-83.26,"rotation":-86.18,"width":188,"height":135},"L_wing05":{"x":-90.01,"y":-78.14,"rotation":-86.18,"width":218,"height":213},"L_wing06":{"x":-143.76,"y":-83.71,"rotation":-86.18,"width":192,"height":331},"L_wing07":{"x":-133.04,"y":-33.89,"rotation":-86.18,"width":159,"height":255},"L_wing08":{"x":50.15,"y":-15.71,"rotation":-86.18,"width":164,"height":181},"L_wing09":{"x":85.94,"y":-11.32,"rotation":-86.18,"width":204,"height":167}},"head":{"head":{"x":76.68,"y":32.21,"rotation":-47.12,"width":296,"height":260}},"tail1":{"tail01":{"x":22.59,"y":-4.5,"rotation":163.85,"width":120,"height":153}},"tail2":{"tail02":{"x":18.11,"y":-1.75,"rotation":151.84,"width":95,"height":120}},"tail3":{"tail03":{"x":16.94,"y":-2,"rotation":150.04,"width":73,"height":92}},"tail4":{"tail04":{"x":15.34,"y":-2.17,"rotation":151.84,"width":56,"height":71}},"tail5":{"tail05":{"x":15.05,"y":-3.57,"rotation":155,"width":52,"height":59}},"tail6":{"tail06":{"x":28.02,"y":-16.83,"rotation":-175.44,"width":95,"height":68}},"back":{"back":{"x":35.84,"y":19.99,"rotation":-151.83,"width":190,"height":185}},"R_front_toe2":{"front_toeB":{"x":26.39,"y":1.16,"rotation":104.57,"width":56,"height":57}},"logo":{"logo":{"y":-176.72,"width":897,"height":92}},"R_front_thigh":{"R_front_thigh":{"x":35.28,"y":2.11,"rotation":130.33,"width":108,"height":108}},"R_rear_toe1":{"rear-toe":{"x":54.75,"y":-5.72,"rotation":134.79,"width":109,"height":77}},"R_rear_toe2":{"rear-toe":{"x":57.02,"y":-7.22,"rotation":134.42,"width":109,"height":77}},"R_rear_toe3":{"rear-toe":{"x":47.46,"y":-7.64,"rotation":134.34,"width":109,"height":77}},"chin":{"chin":{"x":66.55,"y":7.32,"rotation":30.01,"width":214,"height":146}}}},"animations":{"flying":{"slots":{"L_wing":{"attachment":[{"time":0,"name":"L_wing01"},{"time":0.0666,"name":"L_wing02"},{"time":0.1333,"name":"L_wing03"},{"time":0.2,"name":"L_wing04"},{"time":0.2666,"name":"L_wing05"},{"time":0.3333,"name":"L_wing06"},{"time":0.4,"name":"L_wing07"},{"time":0.4666,"name":"L_wing08"},{"time":0.5333,"name":"L_wing09"},{"time":0.6,"name":"L_wing01"},{"time":0.7333,"name":"L_wing02"},{"time":0.8,"name":"L_wing03"},{"time":0.8333,"name":"L_wing04"},{"time":0.8666,"name":"L_wing05"},{"time":0.9,"name":"L_wing06"},{"time":0.9333,"name":"L_wing07"},{"time":0.9666,"name":"L_wing08"},{"time":1,"name":"L_wing01"}]},"R_wing":{"attachment":[{"time":0,"name":"R_wing01"},{"time":0.0666,"name":"R_wing02"},{"time":0.1333,"name":"R_wing03"},{"time":0.2,"name":"R_wing04"},{"time":0.2666,"name":"R_wing05"},{"time":0.3333,"name":"R_wing06"},{"time":0.4,"name":"R_wing07"},{"time":0.4666,"name":"R_wing08"},{"time":0.5333,"name":"R_wing09"},{"time":0.6,"name":"R_wing01"},{"time":0.7333,"name":"R_wing02"},{"time":0.7666,"name":"R_wing02"},{"time":0.8,"name":"R_wing03"},{"time":0.8333,"name":"R_wing04"},{"time":0.8666,"name":"R_wing05"},{"time":0.9,"name":"R_wing06"},{"time":0.9333,"name":"R_wing07"},{"time":0.9666,"name":"R_wing08"},{"time":1,"name":"R_wing01"}]}},"bones":{"back":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":17.39},{"time":0.5,"angle":0},{"time":0.8333,"angle":7},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"neck":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-8.18},{"time":0.3333,"angle":-23.16},{"time":0.5,"angle":-18.01},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chest":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail1":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-2.42},{"time":0.3333,"angle":-26.2},{"time":0.5,"angle":-29.65},{"time":0.6666,"angle":-23.15},{"time":0.8333,"angle":-55.46},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_rear_thigh":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail2":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-1.12},{"time":0.3333,"angle":10.48},{"time":0.5,"angle":7.89},{"time":0.8333,"angle":-10.38},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail3":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":8.24},{"time":0.3333,"angle":15.21},{"time":0.5,"angle":14.84},{"time":0.8333,"angle":-18.9},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail4":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":17.46},{"time":0.3333,"angle":22.15},{"time":0.5,"angle":22.76},{"time":0.8333,"angle":-4.37},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail5":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":7.4},{"time":0.3333,"angle":28.5},{"time":0.5,"angle":21.33},{"time":0.8333,"angle":-1.27},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tail6":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":45.99},{"time":0.4,"angle":43.53},{"time":0.5,"angle":61.79},{"time":0.8333,"angle":13.28},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_rear_leg":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-14.21},{"time":0.5,"angle":47.17},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_rear_toe3":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-36.06},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_rear_toe2":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-20.32},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_rear_toe1":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-18.71},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"head":{"rotate":[{"time":0,"angle":0,"curve":[0.408,1.36,0.675,1.43]},{"time":0.5,"angle":1.03},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chin":{"rotate":[{"time":0,"angle":0,"curve":[0.416,1.15,0.494,1.27]},{"time":0.3333,"angle":-5.15},{"time":0.5,"angle":9.79},{"time":0.6666,"angle":18.94},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"L_front_thigh":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-19.18},{"time":0.3333,"angle":-32.02},{"time":0.5,"angle":-19.62},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_front_thigh":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-12.96},{"time":0.5,"angle":16.2},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"L_front_leg":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":37.77},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"L_front_toe1":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-16.08},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"L_front_toe2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.33,"y":1.029},{"time":1,"x":1,"y":1}]},"L_front_toe4":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":26.51},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.239,"y":0.993},{"time":1,"x":1,"y":1}]},"L_front_toe3":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":16.99},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.402,"y":1.007},{"time":1,"x":1,"y":1}]},"R_front_leg":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":26.07},{"time":0.5,"angle":-21.6},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"R_front_toe1":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":29.23},{"time":0.5,"angle":34.83},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.412,"y":1},{"time":1,"x":1,"y":1}]},"R_front_toe2":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":24.89},{"time":0.5,"angle":23.16},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.407,"y":1.057},{"time":1,"x":1,"y":1}]},"R_front_toe3":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":11.01},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1},{"time":0.5,"x":1.329,"y":1.181},{"time":1,"x":1,"y":1}]},"L_rear_leg":{"rotate":[{"time":0,"angle":0},{"time":0.3666,"angle":25.19},{"time":0.6666,"angle":-15.65},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1}]},"COG":{"rotate":[{"time":0,"angle":0,"curve":[0.456,0.2,0.422,1.06]},{"time":0.3333,"angle":23.93},{"time":0.6666,"angle":337.8,"curve":[0.41,0,0.887,0.75]},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":[0.33,1,0.816,1.33]},{"time":0.5,"x":0,"y":113.01,"curve":[0.396,0,0.709,2.03]},{"time":1,"x":0,"y":0}]}}}}} \ No newline at end of file +{ +"skeleton": { "hash": "9MKo2cmJTDc3IPV4B3LRJxWbl04", "spine": "3.3.07", "width": 897, "height": 716.31, "images": "./images/" }, +"bones": [ + { "name": "root", "y": -176.12 }, + { "name": "COG", "parent": "root", "y": 176.12 }, + { "name": "chest", "parent": "COG", "length": 31.24, "rotation": 161.7, "x": 52.52, "y": 15.34 }, + { "name": "L_front_thigh", "parent": "chest", "length": 67.42, "rotation": 138.94, "x": -45.58, "y": 7.92 }, + { "name": "L_front_leg", "parent": "L_front_thigh", "length": 51.57, "rotation": 43.36, "x": 67.42, "y": 0.02 }, + { "name": "L_front_toe1", "parent": "L_front_leg", "length": 51.44, "rotation": -98, "x": 45.53, "y": 2.43 }, + { "name": "L_front_toe2", "parent": "L_front_leg", "length": 61.97, "rotation": -55.26, "x": 51.57, "y": -0.12 }, + { "name": "L_front_toe3", "parent": "L_front_leg", "length": 45.65, "rotation": -11.13, "x": 54.19, "y": 0.6, "scaleX": 1.134 }, + { "name": "L_front_toe4", "parent": "L_front_leg", "length": 53.47, "rotation": 19.42, "x": 50.6, "y": 7.08, "scaleX": 1.134 }, + { "name": "back", "parent": "COG", "length": 115.37, "rotation": 151.83, "x": 16.03, "y": 27.94 }, + { "name": "R_rear_thigh", "parent": "back", "length": 123.46, "rotation": 104.87, "x": 65.31, "y": 59.89 }, + { "name": "L_rear_thigh", "parent": "R_rear_thigh", "length": 88.05, "rotation": 28.35, "x": -8.59, "y": 30.18 }, + { "name": "L_rear_leg", "parent": "L_rear_thigh", "length": 103.74, "rotation": -122.41, "x": 96.04, "y": -0.97 }, + { "name": "L_wing", "parent": "chest", "length": 301.12, "rotation": -75.51, "x": -7.24, "y": -24.65 }, + { "name": "R_front_thigh", "parent": "chest", "length": 81.63, "rotation": 67.96, "x": -10.89, "y": 28.25 }, + { "name": "R_front_leg", "parent": "R_front_thigh", "length": 66.52, "rotation": 92.7, "x": 83.04, "y": -0.3 }, + { "name": "R_front_toe1", "parent": "R_front_leg", "length": 46.65, "rotation": 8.59, "x": 70.03, "y": 5.31 }, + { "name": "R_front_toe2", "parent": "R_front_leg", "length": 53.66, "rotation": -35.02, "x": 66.52, "y": 0.33 }, + { "name": "R_front_toe3", "parent": "R_front_leg", "length": 58.38, "rotation": -74.67, "x": 62.1, "y": -0.79 }, + { "name": "R_rear_leg", "parent": "R_rear_thigh", "length": 91.06, "rotation": -129.04, "x": 123.46, "y": -0.26 }, + { "name": "R_rear_toe1", "parent": "R_rear_leg", "length": 94.99, "rotation": 141.98, "x": 90.06, "y": 2.12 }, + { "name": "R_rear_toe2", "parent": "R_rear_leg", "length": 99.29, "rotation": 125.32, "x": 89.6, "y": 1.52 }, + { "name": "R_rear_toe3", "parent": "R_rear_leg", "length": 103.45, "rotation": 112.26, "x": 91.06, "y": -0.35 }, + { "name": "neck", "parent": "COG", "length": 41.36, "rotation": 39.05, "x": 64.75, "y": 11.98 }, + { "name": "head", "parent": "neck", "length": 188.83, "rotation": 8.06, "x": 69.96, "y": 2.49 }, + { "name": "R_wing", "parent": "head", "length": 359.5, "rotation": 83.21, "x": -74.68, "y": 20.9 }, + { "name": "chin", "parent": "neck", "length": 153.15, "rotation": -69.07, "x": 64.62, "y": -6.99 }, + { "name": "tail1", "parent": "back", "length": 65.65, "rotation": 44.31, "x": 115.37, "y": -0.19 }, + { "name": "tail2", "parent": "tail1", "length": 54.5, "rotation": 12, "x": 65.65, "y": 0.22 }, + { "name": "tail3", "parent": "tail2", "length": 41.78, "rotation": 1.8, "x": 54.5, "y": 0.37 }, + { "name": "tail4", "parent": "tail3", "length": 34.19, "rotation": -1.8, "x": 41.78, "y": 0.16 }, + { "name": "tail5", "parent": "tail4", "length": 32.32, "rotation": -3.15, "x": 34.19, "y": -0.19 }, + { "name": "tail6", "parent": "tail5", "length": 80.08, "rotation": -29.55, "x": 32.32, "y": -0.23 } +], +"slots": [ + { "name": "L_rear_leg", "bone": "L_rear_leg", "attachment": "L_rear_leg" }, + { "name": "L_rear_thigh", "bone": "L_rear_thigh", "attachment": "L_rear_thigh" }, + { "name": "L_wing", "bone": "L_wing", "attachment": "L_wing01" }, + { "name": "tail6", "bone": "tail6", "attachment": "tail06" }, + { "name": "tail5", "bone": "tail5", "attachment": "tail05" }, + { "name": "tail4", "bone": "tail4", "attachment": "tail04" }, + { "name": "tail3", "bone": "tail3", "attachment": "tail03" }, + { "name": "tail2", "bone": "tail2", "attachment": "tail02" }, + { "name": "tail1", "bone": "tail1", "attachment": "tail01" }, + { "name": "back", "bone": "back", "attachment": "back" }, + { "name": "L_front_thigh", "bone": "L_front_thigh", "attachment": "L_front_thigh" }, + { "name": "L_front_leg", "bone": "L_front_leg", "attachment": "L_front_leg" }, + { "name": "L_front_toe1", "bone": "L_front_toe1", "attachment": "front_toeA" }, + { "name": "L_front_toe4", "bone": "L_front_toe4", "attachment": "front_toeB" }, + { "name": "L_front_toe3", "bone": "L_front_toe3", "attachment": "front_toeB" }, + { "name": "L_front_toe2", "bone": "L_front_toe2", "attachment": "front_toeB" }, + { "name": "chest", "bone": "chest", "attachment": "chest" }, + { "name": "R_rear_toe1", "bone": "R_rear_toe1", "attachment": "rear-toe" }, + { "name": "R_rear_toe2", "bone": "R_rear_toe2", "attachment": "rear-toe" }, + { "name": "R_rear_toe3", "bone": "R_rear_toe3", "attachment": "rear-toe" }, + { "name": "R_rear_leg", "bone": "R_rear_leg", "attachment": "R_rear_leg" }, + { "name": "R_rear_thigh", "bone": "R_rear_thigh", "attachment": "R_rear_thigh" }, + { "name": "R_front_toe1", "bone": "R_front_toe1", "attachment": "front_toeB" }, + { "name": "R_front_thigh", "bone": "R_front_thigh", "attachment": "R_front_thigh" }, + { "name": "R_front_leg", "bone": "R_front_leg", "attachment": "R_front_leg" }, + { "name": "R_front_toe2", "bone": "R_front_toe2", "attachment": "front_toeB" }, + { "name": "R_front_toe3", "bone": "R_front_toe3", "attachment": "front_toeB" }, + { "name": "chin", "bone": "chin", "attachment": "chin" }, + { "name": "R_wing", "bone": "R_wing", "attachment": "R_wing01" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "logo", "bone": "root", "attachment": "logo" } +], +"skins": { + "default": { + "L_front_leg": { + "L_front_leg": { "x": 14.68, "y": 0.48, "rotation": 15.99, "width": 84, "height": 57 } + }, + "L_front_thigh": { + "L_front_thigh": { "x": 27.66, "y": -11.58, "rotation": 58.66, "width": 84, "height": 72 } + }, + "L_front_toe1": { + "front_toeA": { "x": 31.92, "y": 0.61, "rotation": 109.55, "width": 29, "height": 50 } + }, + "L_front_toe2": { + "front_toeB": { "x": 26.83, "y": -4.94, "rotation": 109.51, "width": 56, "height": 57 } + }, + "L_front_toe3": { + "front_toeB": { "x": 18.21, "y": -7.21, "scaleX": 0.881, "scaleY": 0.94, "rotation": 99.71, "width": 56, "height": 57 } + }, + "L_front_toe4": { + "front_toeB": { "x": 23.21, "y": -11.68, "scaleX": 0.881, "rotation": 79.89, "width": 56, "height": 57 } + }, + "L_rear_leg": { + "L_rear_leg": { "x": 67.29, "y": 12.62, "rotation": -162.65, "width": 206, "height": 177 } + }, + "L_rear_thigh": { + "L_rear_thigh": { "x": 56.03, "y": 27.38, "rotation": 74.93, "width": 91, "height": 149 } + }, + "L_wing": { + "L_wing01": { "x": 129.21, "y": -45.49, "rotation": -83.7, "width": 191, "height": 256 }, + "L_wing02": { "x": 126.37, "y": -31.69, "rotation": -86.18, "width": 179, "height": 269 }, + "L_wing03": { "x": 110.26, "y": -90.89, "rotation": -86.18, "width": 186, "height": 207 }, + "L_wing04": { "x": -61.61, "y": -83.26, "rotation": -86.18, "width": 188, "height": 135 }, + "L_wing05": { "x": -90.01, "y": -78.14, "rotation": -86.18, "width": 218, "height": 213 }, + "L_wing06": { "x": -143.76, "y": -83.71, "rotation": -86.18, "width": 192, "height": 331 }, + "L_wing07": { "x": -133.04, "y": -33.89, "rotation": -86.18, "width": 159, "height": 255 }, + "L_wing08": { "x": 50.15, "y": -15.71, "rotation": -86.18, "width": 164, "height": 181 }, + "L_wing09": { "x": 85.94, "y": -11.32, "rotation": -86.18, "width": 204, "height": 167 } + }, + "R_front_leg": { + "R_front_leg": { "x": 17.79, "y": 4.22, "rotation": 37.62, "width": 101, "height": 89 } + }, + "R_front_thigh": { + "R_front_thigh": { "x": 35.28, "y": 2.11, "rotation": 130.33, "width": 108, "height": 108 } + }, + "R_front_toe1": { + "front_toeB": { "x": 24.49, "y": -2.61, "rotation": 104.18, "width": 56, "height": 57 } + }, + "R_front_toe2": { + "front_toeB": { "x": 26.39, "y": 1.16, "rotation": 104.57, "width": 56, "height": 57 } + }, + "R_front_toe3": { + "front_toeB": { "x": 30.66, "y": -0.06, "rotation": 112.29, "width": 56, "height": 57 } + }, + "R_rear_leg": { + "R_rear_leg": { "x": 60.87, "y": -5.72, "rotation": -127.66, "width": 116, "height": 100 } + }, + "R_rear_thigh": { + "R_rear_thigh": { "x": 53.25, "y": 12.58, "rotation": 103.29, "width": 91, "height": 149 } + }, + "R_rear_toe1": { + "rear-toe": { "x": 54.75, "y": -5.72, "rotation": 134.79, "width": 109, "height": 77 } + }, + "R_rear_toe2": { + "rear-toe": { "x": 57.02, "y": -7.22, "rotation": 134.42, "width": 109, "height": 77 } + }, + "R_rear_toe3": { + "rear-toe": { "x": 47.46, "y": -7.64, "rotation": 134.34, "width": 109, "height": 77 } + }, + "R_wing": { + "R_wing01": { "x": 170.08, "y": -23.67, "rotation": -130.33, "width": 219, "height": 310 }, + "R_wing02": { "x": 171.14, "y": -19.33, "rotation": -130.33, "width": 203, "height": 305 }, + "R_wing03": { "x": 166.46, "y": 29.23, "rotation": -130.33, "width": 272, "height": 247 }, + "R_wing04": { "x": 42.94, "y": 134.05, "rotation": -130.33, "width": 279, "height": 144 }, + "R_wing05": { "x": -8.83, "y": 142.59, "rotation": -130.33, "width": 251, "height": 229 }, + "R_wing06": { "x": -123.33, "y": 111.22, "rotation": -130.33, "width": 200, "height": 366 }, + "R_wing07": { "x": -40.17, "y": 118.03, "rotation": -130.33, "width": 200, "height": 263 }, + "R_wing08": { "x": 48.01, "y": 28.76, "rotation": -130.33, "width": 234, "height": 254 }, + "R_wing09": { "x": 128.1, "y": 21.12, "rotation": -130.33, "width": 248, "height": 204 } + }, + "back": { + "back": { "x": 35.84, "y": 19.99, "rotation": -151.83, "width": 190, "height": 185 } + }, + "chest": { + "chest": { "x": -14.6, "y": 24.78, "rotation": -161.7, "width": 136, "height": 122 } + }, + "chin": { + "chin": { "x": 66.55, "y": 7.32, "rotation": 30.01, "width": 214, "height": 146 } + }, + "head": { + "head": { "x": 76.68, "y": 32.21, "rotation": -47.12, "width": 296, "height": 260 } + }, + "logo": { + "logo": { "y": -176.72, "width": 897, "height": 92 } + }, + "tail1": { + "tail01": { "x": 22.59, "y": -4.5, "rotation": 163.85, "width": 120, "height": 153 } + }, + "tail2": { + "tail02": { "x": 18.11, "y": -1.75, "rotation": 151.84, "width": 95, "height": 120 } + }, + "tail3": { + "tail03": { "x": 16.94, "y": -2, "rotation": 150.04, "width": 73, "height": 92 } + }, + "tail4": { + "tail04": { "x": 15.34, "y": -2.17, "rotation": 151.84, "width": 56, "height": 71 } + }, + "tail5": { + "tail05": { "x": 15.05, "y": -3.57, "rotation": 155, "width": 52, "height": 59 } + }, + "tail6": { + "tail06": { "x": 28.02, "y": -16.83, "rotation": -175.44, "width": 95, "height": 68 } + } + } +}, +"animations": { + "flying": { + "slots": { + "L_wing": { + "attachment": [ + { "time": 0, "name": "L_wing01" }, + { "time": 0.0666, "name": "L_wing02" }, + { "time": 0.1333, "name": "L_wing03" }, + { "time": 0.2, "name": "L_wing04" }, + { "time": 0.2666, "name": "L_wing05" }, + { "time": 0.3333, "name": "L_wing06" }, + { "time": 0.4, "name": "L_wing07" }, + { "time": 0.4666, "name": "L_wing08" }, + { "time": 0.5333, "name": "L_wing09" }, + { "time": 0.6, "name": "L_wing01" }, + { "time": 0.7333, "name": "L_wing02" }, + { "time": 0.8, "name": "L_wing03" }, + { "time": 0.8333, "name": "L_wing04" }, + { "time": 0.8666, "name": "L_wing05" }, + { "time": 0.9, "name": "L_wing06" }, + { "time": 0.9333, "name": "L_wing07" }, + { "time": 0.9666, "name": "L_wing08" }, + { "time": 1, "name": "L_wing01" } + ] + }, + "R_wing": { + "attachment": [ + { "time": 0, "name": "R_wing01" }, + { "time": 0.0666, "name": "R_wing02" }, + { "time": 0.1333, "name": "R_wing03" }, + { "time": 0.2, "name": "R_wing04" }, + { "time": 0.2666, "name": "R_wing05" }, + { "time": 0.3333, "name": "R_wing06" }, + { "time": 0.4, "name": "R_wing07" }, + { "time": 0.4666, "name": "R_wing08" }, + { "time": 0.5333, "name": "R_wing09" }, + { "time": 0.6, "name": "R_wing01" }, + { "time": 0.7333, "name": "R_wing02" }, + { "time": 0.7666, "name": "R_wing02" }, + { "time": 0.8, "name": "R_wing03" }, + { "time": 0.8333, "name": "R_wing04" }, + { "time": 0.8666, "name": "R_wing05" }, + { "time": 0.9, "name": "R_wing06" }, + { "time": 0.9333, "name": "R_wing07" }, + { "time": 0.9666, "name": "R_wing08" }, + { "time": 1, "name": "R_wing01" } + ] + } + }, + "bones": { + "back": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 17.39 }, + { "time": 0.5, "angle": 0 }, + { "time": 0.8333, "angle": 7 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -8.18 }, + { "time": 0.3333, "angle": -23.16 }, + { "time": 0.5, "angle": -18.01 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "chest": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -2.42 }, + { "time": 0.3333, "angle": -26.2 }, + { "time": 0.5, "angle": -29.65 }, + { "time": 0.6666, "angle": -23.15 }, + { "time": 0.8333, "angle": -55.46 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_rear_thigh": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -1.12 }, + { "time": 0.3333, "angle": 10.48 }, + { "time": 0.5, "angle": 7.89 }, + { "time": 0.8333, "angle": -10.38 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 8.24 }, + { "time": 0.3333, "angle": 15.21 }, + { "time": 0.5, "angle": 14.84 }, + { "time": 0.8333, "angle": -18.9 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail4": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 17.46 }, + { "time": 0.3333, "angle": 22.15 }, + { "time": 0.5, "angle": 22.76 }, + { "time": 0.8333, "angle": -4.37 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail5": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 7.4 }, + { "time": 0.3333, "angle": 28.5 }, + { "time": 0.5, "angle": 21.33 }, + { "time": 0.8333, "angle": -1.27 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "tail6": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 45.99 }, + { "time": 0.4, "angle": 43.53 }, + { "time": 0.5, "angle": 61.79 }, + { "time": 0.8333, "angle": 13.28 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_rear_leg": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -14.21 }, + { "time": 0.5, "angle": 47.17 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_rear_toe3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5, "angle": -36.06 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_rear_toe2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5, "angle": -20.32 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_rear_toe1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5, "angle": -18.71 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "head": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.408, 1.36, 0.675, 1.43 ] + }, + { "time": 0.5, "angle": 1.03 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "chin": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.416, 1.15, 0.494, 1.27 ] + }, + { "time": 0.3333, "angle": -5.15 }, + { "time": 0.5, "angle": 9.79 }, + { "time": 0.6666, "angle": 18.94 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_thigh": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -19.18 }, + { "time": 0.3333, "angle": -32.02 }, + { "time": 0.5, "angle": -19.62 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_front_thigh": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -12.96 }, + { "time": 0.5, "angle": 16.2 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_leg": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 37.77 }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_toe1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": -16.08 }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_toe2": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.33, "y": 1.029 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_toe4": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5, "angle": 26.51 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.21, "y": 0.993 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_front_toe3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.5, "angle": 16.99 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.354, "y": 1.007 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_front_leg": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 26.07 }, + { "time": 0.5, "angle": -21.6 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_front_toe1": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 29.23 }, + { "time": 0.5, "angle": 34.83 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.412, "y": 1 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_front_toe2": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 24.89 }, + { "time": 0.5, "angle": 23.16 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.407, "y": 1.057 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "R_front_toe3": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1666, "angle": 11.01 }, + { "time": 0.5, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 }, + { "time": 0.5, "x": 1.329, "y": 1.181 }, + { "time": 1, "x": 1, "y": 1 } + ] + }, + "L_rear_leg": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.3666, "angle": 25.19 }, + { "time": 0.6666, "angle": -15.65 }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "COG": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.456, 0.2, 0.422, 1.06 ] + }, + { "time": 0.3333, "angle": 23.93 }, + { + "time": 0.6666, + "angle": 337.8, + "curve": [ 0.41, 0, 0.887, 0.75 ] + }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.33, 1, 0.816, 1.33 ] + }, + { + "time": 0.5, + "x": 0, + "y": 113.01, + "curve": [ 0.396, 0, 0.709, 2.03 ] + }, + { "time": 1, "x": 0, "y": 0 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta b/spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta index f9cb265ad..ba8fc7367 100644 --- a/spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta +++ b/spine-unity/Assets/Examples/Spine/Dragon/dragon.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 6bc52290ef03f2846ba38d67e2823598 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta b/spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta index dc6b74a26..77bf674b3 100644 --- a/spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta +++ b/spine-unity/Assets/Examples/Spine/Dragon/dragon2.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 12c126994123f12468cf4c5a2684078a -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon_Atlas.asset b/spine-unity/Assets/Examples/Spine/Dragon/dragon_Atlas.asset index b069c892c..de8ead202 100644 Binary files a/spine-unity/Assets/Examples/Spine/Dragon/dragon_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Dragon/dragon_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Dragon/dragon_SkeletonData.asset index 8f43b99b9..74028988b 100644 Binary files a/spine-unity/Assets/Examples/Spine/Dragon/dragon_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Dragon/dragon_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon.mat b/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon.mat index 2c6ce3a58..eff332981 100644 Binary files a/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon.mat and b/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon2.mat b/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon2.mat index a72a50d45..a4a54511a 100644 Binary files a/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon2.mat and b/spine-unity/Assets/Examples/Spine/Dragon/dragon_dragon2.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Eyes/eyes.json b/spine-unity/Assets/Examples/Spine/Eyes/eyes.json index c77c7b2fa..77ad79d18 100644 --- a/spine-unity/Assets/Examples/Spine/Eyes/eyes.json +++ b/spine-unity/Assets/Examples/Spine/Eyes/eyes.json @@ -1 +1,36 @@ -{"skeleton":{"hash":"LxkXoqW3SPQ5weFYd4V71R86WUk","spine":"2.0.20","width":868,"height":322},"bones":[{"name":"root"},{"name":"L_Eye","parent":"root","x":-223.18,"y":2.99},{"name":"R_Eye","parent":"root","x":237.32,"y":6.4}],"slots":[{"name":"EyeWhite","bone":"root","attachment":"EyeWhite"},{"name":"R_Eye","bone":"R_Eye","attachment":"R_Eye"},{"name":"L_Eye","bone":"L_Eye","attachment":"L_Eye"},{"name":"EyeLines","bone":"root","attachment":"EyeLines"}],"skins":{"default":{"EyeLines":{"EyeLines":{"y":28,"width":868,"height":322}},"EyeWhite":{"EyeWhite":{"x":3,"y":2,"width":700,"height":148}},"L_Eye":{"L_Eye":{"x":-0.82,"y":2,"width":148,"height":148}},"R_Eye":{"R_Eye":{"x":0.67,"y":-1.4,"width":148,"height":148}}}}} \ No newline at end of file +{ +"skeleton": { + "hash": "4JK7uGWbzO7qeQSyyuOyKLXQ5oI", + "spine": "3.3.07", + "width": 868, + "height": 322, + "images": "C:\\Users\\John Eric\\Desktop\\old exports" +}, +"bones": [ + { "name": "root" }, + { "name": "L_Eye", "parent": "root", "x": -223.18, "y": 2.99 }, + { "name": "R_Eye", "parent": "root", "x": 237.32, "y": 6.4 } +], +"slots": [ + { "name": "EyeWhite", "bone": "root", "attachment": "EyeWhite" }, + { "name": "R_Eye", "bone": "R_Eye", "attachment": "R_Eye" }, + { "name": "L_Eye", "bone": "L_Eye", "attachment": "L_Eye" }, + { "name": "EyeLines", "bone": "root", "attachment": "EyeLines" } +], +"skins": { + "default": { + "EyeLines": { + "EyeLines": { "y": 28, "width": 868, "height": 322 } + }, + "EyeWhite": { + "EyeWhite": { "x": 3, "y": 2, "width": 700, "height": 148 } + }, + "L_Eye": { + "L_Eye": { "x": -0.82, "y": 2, "width": 148, "height": 148 } + }, + "R_Eye": { + "R_Eye": { "x": 0.67, "y": -1.4, "width": 148, "height": 148 } + } + } +} +} \ No newline at end of file diff --git a/spine-unity/Assets/Examples/Spine/Eyes/eyes.png.meta b/spine-unity/Assets/Examples/Spine/Eyes/eyes.png.meta index fe8202451..83f497ebb 100644 --- a/spine-unity/Assets/Examples/Spine/Eyes/eyes.png.meta +++ b/spine-unity/Assets/Examples/Spine/Eyes/eyes.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 49441e5a1682e564694545bd9b509785 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Eyes/eyes_Atlas.asset b/spine-unity/Assets/Examples/Spine/Eyes/eyes_Atlas.asset index c8af918f3..ca81907ba 100644 Binary files a/spine-unity/Assets/Examples/Spine/Eyes/eyes_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Eyes/eyes_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Eyes/eyes_Material.mat b/spine-unity/Assets/Examples/Spine/Eyes/eyes_Material.mat index 171e3d9c2..fe0d105d8 100644 Binary files a/spine-unity/Assets/Examples/Spine/Eyes/eyes_Material.mat and b/spine-unity/Assets/Examples/Spine/Eyes/eyes_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Eyes/eyes_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Eyes/eyes_SkeletonData.asset index 77a24614b..9eae83c9c 100644 Binary files a/spine-unity/Assets/Examples/Spine/Eyes/eyes_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Eyes/eyes_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment.png.meta b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment.png.meta index b004dc955..281448493 100644 --- a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment.png.meta +++ b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: ddb89f63d0296cf4f8572b0448bb6b30 -timeCreated: 1455501337 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Atlas.asset b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Atlas.asset index 349de63b3..08a155189 100644 Binary files a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Atlas.asset and b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Material.mat b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Material.mat index f7c147560..6616e58c3 100644 Binary files a/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Material.mat and b/spine-unity/Assets/Examples/Spine/FootSoldier/Equipment/Equipment_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White.png.meta b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White.png.meta index 1790b7c3a..4da1dd337 100644 --- a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White.png.meta +++ b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 57b57f94df266f94ea0981915a4472e1 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Atlas.asset b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Atlas.asset index 63f6b3838..90776f83d 100644 Binary files a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Atlas.asset and b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Material.mat b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Material.mat index cf035f168..9dd8a7a3f 100644 Binary files a/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Material.mat and b/spine-unity/Assets/Examples/Spine/FootSoldier/FS_White_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier.json b/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier.json index 75e7be0bb..51e6d7e0c 100644 --- a/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier.json +++ b/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier.json @@ -1,18 +1,18 @@ { -"skeleton": { "hash": "uZfvh80BNvvngM3EGMfAkHebg00", "spine": "2.1.08", "width": 147.68, "height": 268.92, "images": "./images/" }, +"skeleton": { "hash": "Nxia9637znam+9FXwv6fILb3hpo", "spine": "3.3.07", "width": 0, "height": 0, "images": "./images/" }, "bones": [ { "name": "Root" }, { "name": "Hip", "parent": "Root", "x": -0.93, "y": 73.4 }, - { "name": "Body", "parent": "Hip", "length": 60.98, "x": 2.46, "y": -7.69, "rotation": 89.52 }, - { "name": "Leg", "parent": "Hip", "length": 31.39, "x": -20.32, "y": -13.85, "rotation": -105.82 }, - { "name": "Leg2", "parent": "Hip", "length": 31.09, "x": 22.48, "y": -12.01, "rotation": -74.17 }, - { "name": "Arm", "parent": "Body", "length": 51.63, "x": 49.91, "y": 37.35, "rotation": 166.67 }, - { "name": "Arm2", "parent": "Body", "length": 52.61, "x": 53.81, "y": -28.52, "rotation": -157.17 }, - { "name": "Feet", "parent": "Leg", "length": 15.4, "x": 39.56, "y": 1.59, "rotation": 14.56 }, - { "name": "Feet2", "parent": "Leg2", "length": 12.32, "x": 41.33, "y": 0.12, "rotation": -17.19 }, - { "name": "Head", "parent": "Body", "length": 65.29, "x": 73.6, "y": 1.09, "rotation": -88.23 }, - { "name": "Shield", "parent": "Arm", "x": 45.01, "y": -2.1, "rotation": 123.56 }, - { "name": "Weapon", "parent": "Arm2", "length": 137.65, "x": 48.2, "y": 12.78, "rotation": 92.5 } + { "name": "Body", "parent": "Hip", "length": 60.98, "rotation": 89.52, "x": 2.46, "y": -7.69 }, + { "name": "Arm", "parent": "Body", "length": 51.63, "rotation": 166.67, "x": 49.91, "y": 37.34 }, + { "name": "Arm2", "parent": "Body", "length": 52.61, "rotation": -157.17, "x": 53.81, "y": -28.52 }, + { "name": "Leg", "parent": "Hip", "length": 31.39, "rotation": -105.82, "x": -20.32, "y": -13.85 }, + { "name": "Feet", "parent": "Leg", "length": 15.4, "rotation": 14.56, "x": 39.56, "y": 1.59 }, + { "name": "Leg2", "parent": "Hip", "length": 31.09, "rotation": -74.17, "x": 22.48, "y": -12.01 }, + { "name": "Feet2", "parent": "Leg2", "length": 12.32, "rotation": -17.19, "x": 41.33, "y": 0.12 }, + { "name": "Head", "parent": "Body", "length": 65.29, "rotation": -88.23, "x": 73.6, "y": 1.09 }, + { "name": "Shield", "parent": "Arm", "rotation": 123.56, "x": 45.01, "y": -2.09 }, + { "name": "Weapon", "parent": "Arm2", "length": 137.64, "rotation": 92.5, "x": 48.2, "y": 12.78 } ], "slots": [ { "name": "Arm2", "bone": "Arm2", "attachment": "Arm2" }, @@ -61,7 +61,7 @@ "Leg": { "name": "leg", "path": "White/leg", "x": 16.86, "y": -4.3, "rotation": 104.82, "width": 48, "height": 55 } }, "Leg2": { - "Leg2": { "name": "leg 2", "path": "White/leg 2", "x": 16.44, "y": -2.11, "rotation": 74.17, "width": 50, "height": 58 } + "Leg2": { "name": "leg 2", "path": "White/leg 2", "x": 16.44, "y": -2.1, "rotation": 74.17, "width": 50, "height": 58 } }, "Mouth": { "Closed": { "path": "White/mouth", "x": 10.96, "y": 3.69, "rotation": -1.29, "width": 28, "height": 21 } @@ -239,11 +239,11 @@ "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.3333, "x": 4.5, "y": -0.72 }, - { "time": 0.4666, "x": -1.04, "y": -2.35, "curve": "stepped" }, + { "time": 0.4666, "x": -1.04, "y": -2.34, "curve": "stepped" }, { "time": 0.6, "x": -1.04, - "y": -2.35, + "y": -2.34, "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.8333, "x": 0, "y": 0 } @@ -345,7 +345,7 @@ "translate": [ { "time": 0, "x": 0, "y": 0 }, { "time": 0.2, "x": -50.02, "y": -6.59 }, - { "time": 0.3333, "x": -83.36, "y": -37.67 } + { "time": 0.3333, "x": -83.36, "y": -37.66 } ] }, "Body": { @@ -491,7 +491,7 @@ "y": 0, "curve": [ 0.25, 0, 0.758, 0.67 ] }, - { "time": 0.3333, "x": -4.47, "y": 3.29 } + { "time": 0.3333, "x": -4.46, "y": 3.29 } ] }, "Leg2": { @@ -686,7 +686,7 @@ }, { "time": 0.3666, - "angle": -2.34, + "angle": -2.33, "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.8666, "angle": 0 }, @@ -1518,17 +1518,17 @@ { "time": 0, "x": -0.84, - "y": -4.45, + "y": -4.44, "curve": [ 0.25, 0, 0.75, 1 ] }, - { "time": 0.2, "x": -1.03, "y": -4.7, "curve": "stepped" }, + { "time": 0.2, "x": -1.03, "y": -4.69, "curve": "stepped" }, { "time": 0.5333, "x": -1.03, - "y": -4.7, + "y": -4.69, "curve": [ 0.25, 0, 0.75, 1 ] }, - { "time": 0.6666, "x": -0.84, "y": -4.45 } + { "time": 0.6666, "x": -0.84, "y": -4.44 } ] }, "Feet2": { diff --git a/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier_SkeletonData.asset index 2328d3451..ae6627d97 100644 Binary files a/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/FootSoldier/FootSoldier_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Gauge/Gauge.json b/spine-unity/Assets/Examples/Spine/Gauge/Gauge.json index cad689354..8d2a118dc 100644 --- a/spine-unity/Assets/Examples/Spine/Gauge/Gauge.json +++ b/spine-unity/Assets/Examples/Spine/Gauge/Gauge.json @@ -1,5 +1,5 @@ { -"skeleton": { "hash": "IKLl/62j+Y1bsQ8rdHoVK9PDip8", "spine": "2.1.27", "width": 250, "height": 60, "images": "./images/" }, +"skeleton": { "hash": "C69Pg+RG3DYyHmt9bOPYVrESJBQ", "spine": "3.3.07", "width": 250, "height": 60, "images": "./images/" }, "bones": [ { "name": "root" }, { "name": "Bar", "parent": "root", "x": -112.29 } diff --git a/spine-unity/Assets/Examples/Spine/Gauge/Gauge.png.meta b/spine-unity/Assets/Examples/Spine/Gauge/Gauge.png.meta index e11ad370e..ed1534eb1 100644 --- a/spine-unity/Assets/Examples/Spine/Gauge/Gauge.png.meta +++ b/spine-unity/Assets/Examples/Spine/Gauge/Gauge.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: a11301aad15ed6b4995485a02a81b132 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Atlas.asset b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Atlas.asset index ae5d3ceab..9c786b0f6 100644 Binary files a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Material.mat b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Material.mat index ed5295511..90e6e82a8 100644 Binary files a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Material.mat and b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_SkeletonData.asset index 089e29b45..0db61a8dd 100644 Binary files a/spine-unity/Assets/Examples/Spine/Gauge/Gauge_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Gauge/Gauge_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt.meta deleted file mode 100644 index c785f9ff7..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 3586e5ccd2041c24eb20eb4764168abd -TextScriptImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json deleted file mode 100644 index e286f326b..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json +++ /dev/null @@ -1 +0,0 @@ -{"skeleton":{"hash":"z+KSUKNoVFCKmcUxpaNi+3NFJa8","spine":"Dev","width":266.89,"height":349.61},"bones":[{"name":"root"},{"name":"hip","parent":"root","x":0.64,"y":114.41},{"name":"left upper leg","parent":"hip","length":50.39,"x":14.45,"y":2.81,"rotation":-89.09},{"name":"pelvis","parent":"hip","x":1.41,"y":-6.57},{"name":"right upper leg","parent":"hip","length":42.45,"x":-20.07,"y":-6.83,"rotation":-97.49},{"name":"torso","parent":"hip","length":85.82,"x":-6.42,"y":1.97,"rotation":93.92},{"name":"left lower leg","parent":"left upper leg","length":49.89,"x":56.34,"y":0.98,"rotation":-16.65},{"name":"left shoulder","parent":"torso","length":35.43,"x":74.04,"y":-20.38,"rotation":-156.96},{"name":"neck","parent":"torso","length":18.38,"x":81.67,"y":-6.34,"rotation":-1.51},{"name":"right lower leg","parent":"right upper leg","length":58.52,"x":42.99,"y":-0.61,"rotation":-14.34},{"name":"right shoulder","parent":"torso","length":37.24,"x":76.02,"y":18.14,"rotation":133.88},{"name":"head","parent":"neck","length":68.28,"x":20.93,"y":11.59,"rotation":-13.92},{"name":"left arm","parent":"left shoulder","length":35.62,"x":37.85,"y":-2.34,"rotation":28.16},{"name":"left foot","parent":"left lower leg","length":46.5,"x":58.94,"y":-7.61,"rotation":102.43},{"name":"right arm","parent":"right shoulder","length":36.74,"x":37.6,"y":0.31,"rotation":36.32},{"name":"right foot","parent":"right lower leg","length":45.45,"x":64.88,"y":0.04,"rotation":110.3},{"name":"left hand","parent":"left arm","length":11.52,"x":35.62,"y":0.07,"rotation":2.7},{"name":"right hand","parent":"right arm","length":15.32,"x":36.9,"y":0.34,"rotation":2.35},{"name":"spear1","parent":"left hand","length":65.06,"x":0.48,"y":17.03,"rotation":102.43},{"name":"spear2","parent":"spear1","length":61.41,"x":65.05,"y":0.04,"rotation":0.9},{"name":"spear3","parent":"spear2","length":76.79,"x":61.88,"y":0.57,"rotation":-0.9}],"slots":[{"name":"left shoulder","bone":"left shoulder","attachment":"left shoulder"},{"name":"left arm","bone":"left arm","attachment":"left arm"},{"name":"left hand item","bone":"left hand","attachment":"spear"},{"name":"left hand","bone":"left hand","attachment":"left hand"},{"name":"left foot","bone":"left foot","attachment":"left foot"},{"name":"left lower leg","bone":"left lower leg","attachment":"left lower leg"},{"name":"left upper leg","bone":"left upper leg","attachment":"left upper leg"},{"name":"neck","bone":"neck","attachment":"neck"},{"name":"torso","bone":"torso","attachment":"torso"},{"name":"pelvis","bone":"pelvis","attachment":"pelvis"},{"name":"right foot","bone":"right foot","attachment":"right foot"},{"name":"right lower leg","bone":"right lower leg","attachment":"right lower leg"},{"name":"undie straps","bone":"pelvis","attachment":"undie straps"},{"name":"undies","bone":"pelvis","attachment":"undies"},{"name":"right upper leg","bone":"right upper leg","attachment":"right upper leg"},{"name":"head","bone":"head","attachment":"head"},{"name":"eyes","bone":"head"},{"name":"right shoulder","bone":"right shoulder","attachment":"right shoulder"},{"name":"right arm","bone":"right arm","attachment":"right arm"},{"name":"right hand thumb","bone":"right hand","attachment":"right hand thumb"},{"name":"right hand item","bone":"right hand","attachment":"dagger"},{"name":"right hand","bone":"right hand","attachment":"right hand"},{"name":"right hand item 2","bone":"right hand","attachment":"shield"}],"skins":{"default":{"left hand item":{"dagger":{"x":7.88,"y":-23.45,"rotation":10.47,"width":26,"height":108},"spear":{"type":"skinnedmesh","uvs":[1,0.11236,0.77096,0.13278,0.76608,0.21781,0.75642,0.386,0.74723,0.54607,0.72117,1,0.28838,1,0.24208,0.54327,0.22589,0.38361,0.2089,0.21605,0.20043,0.13242,0,0.11519,0.4527,0,0.58399,0],"triangles":[5,6,4,6,7,4,4,7,3,2,9,1,9,10,1,10,12,1,12,13,1,1,13,0,10,11,12,3,8,2,8,9,2,7,8,3],"vertices":[1,20,38.54,-10.88,1,1,20,30.97,-5.93,1,2,19,61.48,-5.58,0.5116,20,-0.31,-6.16,0.48839,2,18,64.73,-5.03,0.50272,19,-0.4,-5.06,0.49728,1,16,4.56,23.91,1,1,16,41.7,-138.95,1,1,16,32.42,-141.1,1,1,16,-6.49,22.4,1,2,18,65.48,6.64,0.50272,19,0.53,6.59,0.49728,2,19,62.18,6.66,0.5116,20,0.2,6.09,0.48839,1,20,30.96,6.61,1,1,20,37.26,11.09,1,1,20,79.75,1.59,1,1,20,79.78,-1.29,1],"hull":14}},"right hand item":{"dagger":{"type":"mesh","uvs":[0.78091,0.38453,1,0.38405,1,0.44881,0.73953,0.4687,0.74641,0.81344,0.34022,1,0.15434,1,0.11303,0.78858,0.23007,0.47367,0,0.45047,0,0.38621,0.22367,0.38573,0.24384,0,1,0],"triangles":[0,12,13,11,12,0,0,1,2,9,10,11,3,11,0,3,0,2,8,11,3,9,11,8,5,6,7,4,5,8,4,8,3,5,7,8],"vertices":[15.49,-12.82,21.13,-13.57,20.16,-20.49,13.15,-21.67,8.13,-58.56,-5.13,-77.04,-9.92,-76.36,-7.79,-53.6,-0.03,-20.36,-5.6,-17.04,-4.63,-10.17,1.12,-10.93,7.46,30.24,26.93,27.49],"hull":14}},"right hand item 2":{"shield":{"rotation":93.49,"width":70,"height":72}}},"goblin":{"eyes":{"eyes closed":{"name":"goblin/eyes-closed","x":29.19,"y":-24.89,"rotation":-88.92,"width":34,"height":12}},"head":{"head":{"name":"goblin/head","type":"mesh","uvs":[0,0.60494,0.14172,0.5145,0.24218,0.55229,0.32667,0.67806,0.37969,0.79352,0.53505,0.93014,0.86056,1,0.94071,0.94169,0.92098,0.69923,0.9888,0.65497,0.99003,0.51643,0.89632,0.43561,0.94487,0.41916,1,0.39713,1,0.2836,0.94017,0.27027,0.87906,0.25666,0.80754,0.16044,0.66698,0.01997,0.4734,0.01805,0.29215,0.19893,0.25392,0.31823,0.09117,0.324,0,0.44331,0.43271,0.69153,0.466,0.47794,0.35996,0.31246,0.73473,0.68593,0.72215,0.57425,0.88179,0.5583,0.80267,0.51015],"triangles":[5,27,6,7,27,8,7,6,27,4,24,5,5,24,27,4,3,24,27,29,8,8,29,9,24,28,27,24,25,28,24,3,25,29,28,30,29,27,28,25,2,26,25,3,2,9,29,10,0,23,1,28,25,30,29,11,10,29,30,11,2,21,26,2,1,21,23,22,1,1,22,21,30,16,11,30,17,16,30,25,17,17,26,18,18,26,19,26,17,25,11,15,12,11,16,15,12,15,13,15,14,13,21,20,26,26,20,19],"vertices":[14.56,50.42,23.12,35.47,17.46,26.36,11.57,16.86,3.74,11.71,-5.89,-3.91,-11.83,-37.23,-8.31,-45.63,7.75,-44.24,10.39,-51.33,19.52,-51.82,25.21,-43.15,26.12,-47.43,27.35,-53.16,34.84,-53.46,35.96,-47.33,37.11,-41.08,43.75,-33.97,53.58,-19.87,54.5,0.03,43.31,19.16,35.6,23.41,35.89,40.17,28.39,49.87,10.25,5.99,24.2,2,35.55,12.48,9.39,-25.1,16.8,-24.31,17.2,-40.65,20.68,-33.02],"hull":24}},"left arm":{"left arm":{"name":"goblin/left-arm","type":"mesh","uvs":[0.68992,0.29284,1,0.46364,1,0.74643,0.84089,1,0.66344,1,0.33765,0.64284,0,0.44124,0,0,0.34295,0],"triangles":[3,4,2,4,5,2,5,0,2,0,1,2,0,5,8,5,6,8,6,7,8],"vertices":[18.6,8.81,32.19,10.31,38.02,1.62,38.08,-9.63,32.31,-13.49,14.37,-9.62,-0.75,-10.78,-9.84,2.77,1.29,10.25],"hull":9}},"left foot":{"left foot":{"name":"goblin/left-foot","type":"mesh","uvs":[0.15733,0.31873,0.08195,0.78502,0.15884,0.99366,0.41633,0.96804,0.68822,0.97636,1,0.96388,0.99385,0.73501,0.85294,0.51862,0.61479,0.31056,0.46991,0,0.48032,0.75604,0.75994,0.77706],"triangles":[0,9,8,10,0,8,10,8,7,11,10,7,11,7,6,1,0,10,11,6,5,3,1,10,4,10,11,4,11,5,3,10,4,2,1,3],"vertices":[2.28,13.07,-1.76,-1.64,3.59,-7.8,20.25,-6.04,37.91,-5.27,58.12,-3.71,57.31,3.34,47.78,9.51,31.95,15.05,21.99,24.11,24.03,0.75,42.21,1.16],"hull":10}},"left hand":{"left hand":{"name":"goblin/left-hand","type":"mesh","uvs":[0.518,0.12578,1,0.16285,0.99788,0.50578,0.69745,1,0.37445,1,0,0.80051,0,0.42792,0.17601,0,0.43567,0],"triangles":[2,0,1,0,5,6,6,7,0,0,7,8,3,4,0,4,5,0,2,3,0],"vertices":[-3.11,15.42,10.83,22.27,15.5,14.55,18.35,-8.96,9.48,-14.32,-4.58,-14.3,-11.63,-2.63,-14.89,13.68,-7.75,17.99],"hull":9}},"left lower leg":{"left lower leg":{"name":"goblin/left-lower-leg","type":"mesh","uvs":[0.95508,0.20749,0.81927,0.65213,0.94754,0.77308,0.67842,0.97346,0.46463,1,0.26845,1,0.04963,0.90706,0.2106,0.60115,0.07478,0.40195,0.18545,0,0.28857,0],"triangles":[10,8,9,1,7,10,7,8,10,0,1,10,1,4,7,3,1,2,5,6,7,7,4,5,1,3,4],"vertices":[-0.19,6.82,30.97,10.96,37.97,17.33,53.88,12.6,57.58,6.31,59.34,0.08,55.04,-8.63,32.99,-9.33,20.79,-17.43,-7.27,-21.56,-8.19,-18.29],"hull":11}},"left shoulder":{"left shoulder":{"name":"goblin/left-shoulder","type":"mesh","uvs":[0.7377,0.40692,1,0.75237,1,1,0.62046,1,0.26184,0.56601,0,0.29783,0,0,0.44115,0],"triangles":[3,1,2,3,0,1,3,4,0,4,7,0,4,5,7,5,6,7],"vertices":[15.18,5.74,32.17,5.32,41.79,0.21,36.63,-9.5,14.88,-9.72,0.9,-10.89,-10.66,-4.74,-4.66,6.54],"hull":8}},"left upper leg":{"left upper leg":{"name":"goblin/left-upper-leg","type":"mesh","uvs":[1,0.12167,1,0.54873,0.91067,0.78907,0.76567,1,0.3087,0.9579,0,0.68777,0,0.219,0.51961,0,0.87552,0],"triangles":[7,8,0,5,6,7,0,1,7,4,5,7,1,4,7,2,4,1,3,4,2],"vertices":[2.33,13.06,33.5,12.57,51,9.34,66.32,4.31,63,-10.71,43.13,-20.58,8.91,-20.04,-6.79,-2.64,-6.61,9.1],"hull":9}},"neck":{"neck":{"name":"goblin/neck","type":"mesh","uvs":[0.81967,0.27365,0.92101,0.82048,0.47134,1,0.15679,0.9354,0,0.7556,0.19268,0.51833,0.15468,0.35706,0,0.21989,0.13568,0,0.68878,0,0.70145,0.53872],"triangles":[3,5,2,2,10,1,2,5,10,3,4,5,10,0,1,0,10,6,10,5,6,7,8,6,6,9,0,6,8,9],"vertices":[18.62,-11.65,-3.98,-13.85,-10.28,2.76,-6.91,13.89,0.8,19.05,10.06,11.51,16.74,12.45,22.71,17.64,31.4,12.19,30.12,-7.67,8.05,-6.71],"hull":10}},"pelvis":{"pelvis":{"name":"goblin/pelvis","type":"mesh","uvs":[1,1,0,1,0,0,1,0],"triangles":[1,2,3,1,3,0],"vertices":[25.38,-20.73,-36.61,-20.73,-36.61,22.26,25.38,22.26],"hull":4}},"right arm":{"right arm":{"name":"goblin/right-arm","type":"mesh","uvs":[1,0.09223,1,0.8501,0.72058,1,0.24384,1,0,0.86558,0.20822,0.10919,0.50903,0,0.85342,0],"triangles":[1,2,6,6,2,5,1,6,0,4,5,3,2,3,5,6,7,0],"vertices":[-4.75,8.89,33.03,11.74,40.99,5.89,41.81,-5.03,35.53,-11.13,-2.53,-9.2,-8.5,-2.71,-9.09,5.18],"hull":8}},"right foot":{"right foot":{"name":"goblin/right-foot","type":"mesh","uvs":[0.40851,0.0047,0.59087,0.33404,0.75959,0.48311,0.88907,0.59751,0.97532,0.89391,0.90385,1,0.6722,1,0.38633,1,0.08074,1,0,0.88921,0,0.65984,0,0.46577,0.0906,0.0988,0.305,0,0.47461,0.71257,0.715,0.74681],"triangles":[1,10,11,1,13,0,14,1,2,1,12,13,12,1,11,14,10,1,15,14,2,15,2,3,9,10,14,15,3,4,7,8,9,14,7,9,6,14,15,5,6,15,7,14,6,4,5,15],"vertices":[17.36,25.99,29.13,15.44,39.89,10.8,48.14,7.24,53.84,-2.38,49.43,-6,34.84,-6.39,16.84,-6.87,-2.4,-7.38,-7.58,-3.86,-7.78,3.7,-7.95,10.1,-2.57,22.36,10.84,25.97,22.14,2.75,37.31,2.03],"hull":14}},"right hand":{"right hand":{"name":"goblin/right-hand","type":"mesh","uvs":[0.17957,0,0,0.44772,0,0.79734,0.20057,0.94264,0.55057,1,0.8539,1,0.89823,0.82004,0.8259,0.74285,0.84223,0.49993,0.96356,0.34102,0.66023,0],"triangles":[8,10,9,0,10,1,8,2,1,8,1,10,7,3,8,3,2,8,4,3,7,5,7,6,4,7,5],"vertices":[-10.82,-9.45,5.95,-15.34,18.88,-14.9,24,-7.5,25.69,5.16,25.31,16.07,18.61,17.44,15.84,14.74,6.84,15.02,0.81,19.18,-11.41,7.83],"hull":11}},"right hand thumb":{"right hand thumb":{"name":"goblin/right-hand","type":"mesh","uvs":[0.88538,0.22262,0.76167,0.3594,0.75088,0.78308,0.95326,0.84981,1,0.60302],"triangles":[1,0,4,2,1,4,3,2,4],"vertices":[-2.82,15.97,2.4,11.71,18.08,11.9,20.27,19.27,11.09,20.62],"hull":5}},"right lower leg":{"right lower leg":{"name":"goblin/right-lower-leg","type":"mesh","uvs":[1,0.27261,0.81312,0.52592,0.79587,0.71795,0.95544,0.80988,0.85193,0.95493,0.47241,1,0.14033,1,0,0.8773,0.14896,0.67914,0.1619,0.30325,0.60611,0],"triangles":[1,10,0,9,10,1,8,9,1,2,8,1,4,2,3,6,7,8,5,6,8,2,5,8,4,5,2],"vertices":[6.26,8.46,23.32,8.04,37.1,12.89,41.45,20.82,53.07,21.46,61.33,10.06,65.77,-1.03,58.99,-9.19,43.02,-9.81,16.33,-20,-12.79,-9.26],"hull":11}},"right shoulder":{"right shoulder":{"name":"goblin/right-shoulder","type":"mesh","uvs":[0.62008,0.03708,0.92131,0.09048,1,0.38319,0.72049,0.6937,0.31656,1,0,1,0,0.75106,0.28233,0.49988],"triangles":[4,6,7,4,7,3,4,5,6,7,0,3,2,0,1,2,3,0],"vertices":[-3.17,-11.05,-9,-0.57,-1.01,10.33,16.69,11.17,37.41,8.2,45.45,-1.16,36.95,-8.46,21.2,-7.47],"hull":8}},"right upper leg":{"right upper leg":{"name":"goblin/right-upper-leg","type":"mesh","uvs":[0.27018,0,0.11618,0.18177,0,0.70688,0,0.89577,0.26668,1,0.48718,1,0.67618,0.83532,1,0.5161,1,0.25543,0.74618,0.0571],"triangles":[9,8,7,9,1,0,6,9,7,6,1,9,2,1,6,4,3,2,6,4,2,5,4,6],"vertices":[-9.85,-10.37,2.17,-14.07,35.49,-13.66,47.29,-12.11,52.61,-2.26,51.63,5.16,40.51,10.18,19.13,18.47,2.85,16.32,-8.4,6.14],"hull":10}},"torso":{"torso":{"name":"goblin/torso","type":"mesh","uvs":[0,0.33287,0.15945,0.46488,0.15761,0.60314,0.15502,0.79806,0.32807,0.93478,0.6875,1,0.80731,1,1,0.77763,1,0.66147,1,0.56703,0.93207,0.4771,0.86944,0.39416,0.83837,0.226,0.68085,0,0.14836,0,0,0.07199,0.78734,0.86249,0.43679,0.79649,0.76738,0.61733,0.44345,0.58747,0.54329,0.38316,0.77692,0.73446,0.66478,0.51012],"triangles":[5,16,6,6,16,7,4,17,5,5,17,16,4,3,17,17,21,16,16,21,7,3,2,17,21,19,18,21,17,19,17,2,19,21,8,7,21,18,8,18,9,8,19,22,18,18,10,9,18,22,10,2,1,19,19,20,22,19,1,20,22,11,10,22,20,11,20,1,14,20,12,11,1,0,14,20,13,12,20,14,13,0,15,14],"vertices":[56.93,27.95,43.37,18.23,30.16,19.5,11.53,21.28,-2.55,10.69,-10.89,-13.12,-11.59,-21.23,8.54,-36.12,19.65,-37.08,28.68,-37.86,37.68,-34,45.98,-30.44,56.4,-29.07,84.78,-20.92,87.9,15.15,81.88,25.79,1.67,-21.01,10.03,2.18,25.23,-18.25,29.98,0,48.54,-8.39,13.98,-21.36,35.9,-15.6],"hull":16}},"undie straps":{"undie straps":{"name":"goblin/undie-straps","type":"mesh","uvs":[0.36097,0.44959,0.66297,0.60591,1,0.19486,1,0.57117,0.75897,1,0.38697,1,0,0.26433,0,0,0.12497,0],"triangles":[6,7,8,6,8,0,3,1,2,5,0,1,6,0,5,4,1,3,5,1,4],"vertices":[-10.56,12.87,6.53,9.9,25.62,17.71,25.62,10.56,11.97,2.41,-9.09,2.41,-31,16.39,-31,21.41,-23.92,21.41],"hull":9}},"undies":{"undies":{"name":"goblin/undies","type":"mesh","uvs":[0,0.32029,0.14893,0.59457,0.22437,1,0.35909,1,0.50998,1,0.79559,0.58453,0.9842,0.28015,1,0.00588,0.46957,0.17646,0,0.03933,0.48843,0.59122,0.48114,0.43099],"triangles":[6,8,7,0,9,8,11,8,6,0,8,11,5,11,6,10,11,5,1,0,11,1,11,10,3,2,1,10,3,1,4,10,5,3,10,4],"vertices":[-13.22,5.56,-8,-2.47,-5.49,-14.27,-0.64,-14.36,4.78,-14.45,15.27,-2.59,22.22,6.11,22.92,14.05,3.75,9.44,-13.08,13.71,4.21,-2.59,4.03,2.05],"hull":10}}},"goblingirl":{"eyes":{"eyes closed":{"name":"goblingirl/eyes-closed","x":28,"y":-25.54,"rotation":-87.04,"width":37,"height":21}},"head":{"head":{"name":"goblingirl/head","x":27.71,"y":-4.32,"rotation":-85.58,"width":103,"height":81}},"left arm":{"left arm":{"name":"goblingirl/left-arm","x":19.64,"y":-2.42,"rotation":33.05,"width":37,"height":35}},"left foot":{"left foot":{"name":"goblingirl/left-foot","x":25.17,"y":7.92,"rotation":3.32,"width":65,"height":31}},"left hand":{"left hand":{"name":"goblingirl/left-hand","x":4.34,"y":2.39,"scaleX":0.896,"scaleY":0.896,"rotation":30.34,"width":35,"height":40}},"left lower leg":{"left lower leg":{"name":"goblingirl/left-lower-leg","x":25.02,"y":-0.6,"rotation":105.75,"width":33,"height":70}},"left shoulder":{"left shoulder":{"name":"goblingirl/left-shoulder","x":19.8,"y":-0.42,"rotation":61.21,"width":28,"height":46}},"left upper leg":{"left upper leg":{"name":"goblingirl/left-upper-leg","x":30.21,"y":-2.95,"rotation":89.09,"width":33,"height":70}},"neck":{"neck":{"name":"goblingirl/neck","x":6.16,"y":-3.14,"rotation":-98.86,"width":35,"height":41}},"pelvis":{"pelvis":{"name":"goblingirl/pelvis","x":-3.87,"y":3.18,"width":62,"height":43}},"right arm":{"right arm":{"name":"goblingirl/right-arm","x":16.85,"y":-0.66,"rotation":93.52,"width":28,"height":50}},"right foot":{"right foot":{"name":"goblingirl/right-foot","x":23.46,"y":9.66,"rotation":1.52,"width":63,"height":33}},"right hand":{"right hand":{"name":"goblingirl/right-hand","x":7.21,"y":3.43,"rotation":91.16,"width":36,"height":37}},"right hand thumb":{"right hand thumb":{"name":"goblingirl/right-hand","x":7.21,"y":3.43,"rotation":91.16,"width":36,"height":37}},"right lower leg":{"right lower leg":{"name":"goblingirl/right-lower-leg","x":26.15,"y":-3.27,"rotation":111.83,"width":36,"height":76}},"right shoulder":{"right shoulder":{"name":"goblingirl/right-shoulder","x":14.46,"y":0.45,"rotation":129.85,"width":39,"height":45}},"right upper leg":{"right upper leg":{"name":"goblingirl/right-upper-leg","x":19.69,"y":2.13,"rotation":97.49,"width":34,"height":63}},"torso":{"torso":{"name":"goblingirl/torso","x":36.28,"y":-5.14,"rotation":-95.74,"width":68,"height":96}},"undie straps":{"undie straps":{"name":"goblingirl/undie-straps","x":-1.51,"y":14.18,"width":55,"height":19}},"undies":{"undies":{"name":"goblingirl/undies","x":5.4,"y":1.7,"width":36,"height":29}}}},"animations":{"walk":{"slots":{"eyes":{"attachment":[{"time":0.7,"name":"eyes closed"},{"time":0.8,"name":null}]}},"bones":{"left upper leg":{"rotate":[{"time":0,"angle":-26.55},{"time":0.1333,"angle":-8.78},{"time":0.2333,"angle":9.51},{"time":0.3666,"angle":30.74},{"time":0.5,"angle":25.33},{"time":0.6333,"angle":26.11},{"time":0.7333,"angle":7.45},{"time":0.8666,"angle":-21.19},{"time":1,"angle":-26.55}],"translate":[{"time":0,"x":-1.32,"y":1.7},{"time":0.3666,"x":-0.06,"y":2.42},{"time":1,"x":-1.32,"y":1.7}]},"right upper leg":{"rotate":[{"time":0,"angle":42.45},{"time":0.1333,"angle":49.86,"curve":[0.414,0,0.705,0.99]},{"time":0.2333,"angle":22.51},{"time":0.5,"angle":-16.93},{"time":0.6333,"angle":1.89},{"time":0.7333,"angle":34.86,"curve":[0.462,0.11,1,1]},{"time":0.8666,"angle":58.68,"curve":[0.5,0.02,1,1]},{"time":1,"angle":42.45}],"translate":[{"time":0,"x":6.23,"y":0},{"time":0.2333,"x":2.14,"y":2.4},{"time":0.5,"x":2.44,"y":4.8},{"time":1,"x":6.23,"y":0}]},"left lower leg":{"rotate":[{"time":0,"angle":-18.05},{"time":0.1333,"angle":-63.5},{"time":0.2333,"angle":-83.01},{"time":0.5,"angle":5.11},{"time":0.6333,"angle":-28.29},{"time":0.7333,"angle":-27.52},{"time":0.8666,"angle":3.53},{"time":1,"angle":-18.05}],"translate":[{"time":0,"x":0,"y":0},{"time":0.2333,"x":2.55,"y":-0.47},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}]},"left foot":{"rotate":[{"time":0,"angle":-14.56},{"time":0.1333,"angle":-10.42},{"time":0.2333,"angle":-5.01},{"time":0.3,"angle":6.67},{"time":0.3666,"angle":3.87},{"time":0.5,"angle":-3.87},{"time":0.6333,"angle":2.78},{"time":0.7333,"angle":-11.99},{"time":0.8666,"angle":-12.45},{"time":1,"angle":-14.56}]},"right shoulder":{"rotate":[{"time":0,"angle":5.29,"curve":[0.264,0,0.75,1]},{"time":0.6333,"angle":6.65},{"time":1,"angle":5.29}]},"right arm":{"rotate":[{"time":0,"angle":-4.02,"curve":[0.267,0,0.804,0.99]},{"time":0.6333,"angle":19.78,"curve":[0.307,0,0.787,0.99]},{"time":1,"angle":-4.02}]},"right hand":{"rotate":[{"time":0,"angle":8.98},{"time":0.6333,"angle":0.51},{"time":1,"angle":8.98}]},"left shoulder":{"rotate":[{"time":0,"angle":6.25,"curve":[0.339,0,0.683,1]},{"time":0.5,"angle":-11.78,"curve":[0.281,0,0.686,0.99]},{"time":1,"angle":6.25}],"translate":[{"time":0,"x":1.15,"y":0.23}]},"left hand":{"rotate":[{"time":0,"angle":-21.23,"curve":[0.295,0,0.755,0.98]},{"time":0.5,"angle":-27.28,"curve":[0.241,0,0.75,0.97]},{"time":1,"angle":-21.23}]},"left arm":{"rotate":[{"time":0,"angle":28.37,"curve":[0.339,0,0.683,1]},{"time":0.5,"angle":60.09,"curve":[0.281,0,0.686,0.99]},{"time":1,"angle":28.37}]},"torso":{"rotate":[{"time":0,"angle":-10.28},{"time":0.1333,"angle":-15.38,"curve":[0.545,0,0.818,1]},{"time":0.3666,"angle":-9.78,"curve":[0.58,0.17,0.669,0.99]},{"time":0.6333,"angle":-15.75,"curve":[0.235,0.01,0.795,1]},{"time":0.8666,"angle":-7.06,"curve":[0.209,0,0.816,0.98]},{"time":1,"angle":-10.28}],"translate":[{"time":0,"x":-3.72,"y":-0.01}]},"right foot":{"rotate":[{"time":0,"angle":-5.25},{"time":0.2333,"angle":-17.76},{"time":0.3666,"angle":-20.09},{"time":0.5,"angle":-19.73},{"time":0.7333,"angle":-11.68},{"time":0.8,"angle":4.46},{"time":0.8666,"angle":0.46},{"time":1,"angle":-5.25}]},"right lower leg":{"rotate":[{"time":0,"angle":-3.39,"curve":[0.316,0.01,0.741,0.98]},{"time":0.1333,"angle":-43.21,"curve":[0.414,0,0.705,0.99]},{"time":0.2333,"angle":-25.98},{"time":0.5,"angle":-19.53},{"time":0.6333,"angle":-64.8},{"time":0.7333,"angle":-89.54,"curve":[0.557,0.18,1,1]},{"time":1,"angle":-3.39}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0},{"time":0.6333,"x":2.18,"y":0.21},{"time":1,"x":0,"y":0}]},"hip":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":-8.4},{"time":0.1333,"x":0,"y":-9.35,"curve":[0.326,0.05,0.674,0.93]},{"time":0.2333,"x":0,"y":-0.59,"curve":[0.325,0.39,0.643,0.7]},{"time":0.3666,"x":0,"y":-3.96},{"time":0.5,"x":0,"y":-8.4},{"time":0.6333,"x":0,"y":-10,"curve":[0.359,0.47,0.646,0.74]},{"time":0.7333,"x":0,"y":-5.29,"curve":[0.333,0.36,0.662,0.69]},{"time":0.8,"x":0,"y":-2.49,"curve":[0.322,0.35,0.651,0.68]},{"time":0.8666,"x":0,"y":-3.96},{"time":1,"x":0,"y":-8.4}]},"neck":{"rotate":[{"time":0,"angle":3.6},{"time":0.1333,"angle":17.49},{"time":0.2333,"angle":6.1},{"time":0.3666,"angle":3.45},{"time":0.5,"angle":5.17},{"time":0.6333,"angle":18.36},{"time":0.7333,"angle":6.09},{"time":0.8666,"angle":2.28},{"time":1,"angle":3.6}]},"head":{"rotate":[{"time":0,"angle":3.6,"curve":[0,0,0.704,1.17]},{"time":0.1333,"angle":-0.2},{"time":0.2333,"angle":6.1},{"time":0.3666,"angle":3.45},{"time":0.5,"angle":5.17,"curve":[0,0,0.704,1.61]},{"time":0.6666,"angle":1.1},{"time":0.7333,"angle":6.09},{"time":0.8666,"angle":2.28},{"time":1,"angle":3.6}]},"pelvis":{"rotate":[{"time":0,"angle":-1.33}],"translate":[{"time":0,"x":0.39,"y":-0.78}]},"spear1":{"rotate":[{"time":0,"angle":1.84},{"time":0.2,"angle":-5.38},{"time":0.5,"angle":2.95},{"time":0.7333,"angle":-3.67},{"time":1,"angle":1.84}]},"spear2":{"rotate":[{"time":0,"angle":1.84},{"time":0.2,"angle":-5.38},{"time":0.5,"angle":2.95},{"time":0.7333,"angle":-3.67},{"time":1,"angle":1.84}]},"spear3":{"rotate":[{"time":0,"angle":3.64},{"time":0.2,"angle":-3.59},{"time":0.5,"angle":4.74},{"time":0.7333,"angle":-1.87},{"time":1,"angle":3.64}]}},"ffd":{"default":{"left hand item":{"spear":[{"time":0}]},"right hand item":{"dagger":[{"time":0,"offset":26,"vertices":[2.34,0.14],"curve":[0.25,0,0.75,1]},{"time":0.5,"offset":8,"vertices":[-1.19,4.31,0.07,6.41,1.66,6.18,1.75,3.59],"curve":[0.25,0,0.75,1]},{"time":1,"offset":26,"vertices":[2.34,0.14]}]}},"goblin":{"head":{"head":[{"time":0,"curve":[0.632,0,0.75,1]},{"time":0.2,"vertices":[-10.97,-6.68,-4.68,-2.46,0,0,0,0,0,0,0,0,0,0,0,0,-1.08,0.08,-1.08,0.08,-1.08,0.08,0,0,-2.22,2.66,-4.83,2.7,-5.7,-0.51,-3.15,-1.61,0,0,0,0,0,0,0,0,0,0,0,0,-6.64,0.81,-11.82,-1.34,0,0,0,0,0,0,0,0,0,0,-1.08,0.08],"curve":[0.25,0,0.75,1]},{"time":0.3666,"vertices":[10.69,4.05,3.66,1.85,0,0,0,0,0,0,0,0,0,0,0,0,1.47,0.09,1.47,0.09,1.47,0.09,0,0,2.69,-0.22,3.77,0.11,3.68,1.55,2.49,1.65,0,0,0,0,0,0,0,0,0,0,0,0,4.45,-3.91,9.19,-1.66,0,0,0,0,0,0,0,0,0,0,1.47,0.09],"curve":[0.621,0,0.75,1]},{"time":0.7,"vertices":[-10.97,-6.68,-4.68,-2.46,0,0,0,0,0,0,0,0,0,0,0,0,-1.17,-0.17,-1.17,-0.17,-1.17,-0.17,0,0,-2.22,2.66,-4.83,2.7,-5.7,-0.51,-3.15,-1.61,0,0,0,0,0,0,0,0,0,0,0,0,-6.64,0.81,-11.82,-1.34,0,0,0,0,0,0,0,0,0,0,-1.17,-0.17],"curve":[0.25,0,0.75,1]},{"time":0.8666,"vertices":[10.69,4.05,3.66,1.85,0,0,0,0,0,0,0,0,0,0,0,0,0.38,0.08,0.38,0.08,0.38,0.08,0,0,2.69,-0.22,3.77,0.11,3.68,1.55,2.49,1.65,0,0,0,0,0,0,0,0,0,0,0,0,4.45,-3.91,9.19,-1.66,0,0,0,0,0,0,0,0,0,0,0.38,0.08],"curve":[0.25,0,0.75,1]},{"time":1}]},"left foot":{"left foot":[{"time":0,"offset":8,"vertices":[3.69,2.37,-7.16,18.79,-12.78,14.77,-12.75,6.5,-3.13,1.98,-0.44,0.36,0,0,-3.8,2.98]},{"time":0.1333},{"time":0.2333,"offset":8,"vertices":[-3.96,-2.34,-5.8,-12.47,-2.23,-12.99,2.02,-9.1,0,0,0,0,0,0,-1.35,-5.28]},{"time":0.3666,"offset":8,"vertices":[0.66,0.33,0.33,2.69,-0.48,2.54,-1.13,1.38,0,0,0,0,0,0,-0.11,0.79]},{"time":0.5,"curve":"stepped"},{"time":0.6333},{"time":0.7333,"offset":8,"vertices":[-2.97,9.4,-6.91,19.92,-10.55,18.41,-12.37,12.38,-4.72,6.3,0,0,-1.48,4.88,-7.06,10.7]},{"time":0.8333,"offset":6,"vertices":[1.05,1.56,-2.52,7.99,-5.52,17.14,-8.93,15.79,-10.73,10.22,-4.23,5.36,0,0,0,0,-5.83,8.55]},{"time":1,"offset":8,"vertices":[3.69,2.37,-7.16,18.79,-12.78,14.77,-12.75,6.5,-3.13,1.98,-0.44,0.36,0,0,-3.8,2.98]}]},"pelvis":{"pelvis":[{"time":0},{"time":0.1333,"offset":6,"vertices":[-0.68,-4.13]},{"time":0.3333,"offset":6,"vertices":[-1.04,-3.1]},{"time":0.7,"offset":6,"vertices":[-1.42,-6.3]},{"time":0.8666,"offset":6,"vertices":[-1.13,-1.79]},{"time":1}]},"right foot":{"right foot":[{"time":0},{"time":0.1333,"offset":2,"vertices":[-2.81,2.63,-2.35,3.89,-1.99,4.86,-0.93,5.57,-0.48,5.09,-0.34,3.42,-0.17,1.36,0,0,0,0,0,0,0,0,0,0,0,0,-1.31,1.91,-1.32,3.65]},{"time":0.2333,"offset":2,"vertices":[-6.39,6.41,-7.74,8.27,-7.02,11.35,-4.03,13.93,-2.5,12.62,-1.46,7.58,-0.17,1.36,0,0,0,0,0,0,0,0,0,0,0,0,-3.84,2.61,-4.53,7.92]},{"time":0.3,"offset":2,"vertices":[-8.27,6.68,-9.29,10.13,-8.62,14.71,-4.58,18.81,-2.2,17.1,-0.07,9.9,2.54,1.01,0,0,0,0,0,0,0,0,0,0,0,0,-2.94,2.38,-4.59,10.01]},{"time":0.3666,"offset":2,"vertices":[-10.47,9.44,-13.36,12.4,-14.32,16.94,-9.24,23.55,-5.51,21.51,-1.19,11.53,2.54,1.01,0,0,0,0,0,0,0,0,0,0,0,0,-4.14,2.29,-6.63,11.37]},{"time":0.5,"offset":2,"vertices":[-5.42,4.36,-10.59,7.04,-11.64,11.55,-6.19,20.12,-1.45,18.05,4.86,6.41,2.81,0.27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2.96,4.94]},{"time":0.6333},{"time":0.7333,"offset":4,"vertices":[1.31,-6.84,-0.87,-12.54,-5.98,-14.08,-7.15,-11.63,-5.67,-4.83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2.06,-6.93]},{"time":0.8,"offset":4,"vertices":[0.65,-3.42,-0.43,-6.27,-2.99,-7.04,-3.57,-5.81,-2.83,-2.41,0,0,0,0,0,0,0,0,0,0,2.79,-1.28,0,0,0,0,-1.03,-3.46]},{"time":0.8666}]},"right hand":{"right hand":[{"time":0,"offset":4,"vertices":[-1.48,0.34,0,0,1.31,0.08,1.6,0.09,0.13,0.15,0,0,0,0,-0.72,-0.04]},{"time":0.5},{"time":1,"offset":4,"vertices":[-1.48,0.34,0,0,1.31,0.08,1.6,0.09,0.13,0.15,0,0,0,0,-0.72,-0.04]}]},"right lower leg":{"right lower leg":[{"time":0},{"time":0.6,"offset":6,"vertices":[1.8,-1.56]},{"time":1}]},"right upper leg":{"right upper leg":[{"time":0,"vertices":[-6.03,-1.46,0,0,0,0,0,0,0,0,0,0,0,0,-0.34,-1.93,-1.86,-5.05,-2.5,-3.09]},{"time":0.3333},{"time":0.8666,"offset":14,"vertices":[0.13,-2.35,-1.33,-5.99,-1.35,-4.43]},{"time":1,"vertices":[-6.03,-1.46,0,0,0,0,0,0,0,0,0,0,0,0,-0.34,-1.93,-1.86,-5.05,-2.5,-3.09]}]},"torso":{"torso":[{"time":0,"offset":14,"vertices":[-1.48,-0.24,-2.72,-2.15,-0.51,-3.39,0,0,0,0,0,0,0,0,0,0,0,0,1.09,-2.61,0,0,0.57,-1.24,0,0,0,0,-2.11,-3.29]},{"time":0.1333,"offset":14,"vertices":[1.31,-0.59,-0.97,-1.62,0.74,-0.61,-1.44,1.97,0,0,0,0,0,0,0,0,0,0,2.65,-3.95,0,0,-1.46,-0.31,0,0,0,0,-3.31,-3.55,-2.56,0.29]},{"time":0.3,"offset":14,"vertices":[6.03,-3.13,7.55,-1.38,6.79,0.31,4.23,1.14,0,0,0,0,0,0,0,0,0,0,4.07,-5.16,0,0,4,0.27,0,0,0,0,3.43,-3.52]},{"time":0.5,"offset":14,"vertices":[2.25,-0.87,2.57,-0.56,3.17,-0.57,1.48,0.99,0,0,0,0,0,0,0,0,0,0,3.22,-4.43,0,0,1.48,0.01,0,0,0,0,0.31,-3.28,-1.53,0.17]},{"time":0.6333,"offset":14,"vertices":[0.75,-1.51,-0.97,-1.62,0.74,-0.61,-1.44,1.97,0,0,0,0,0,0,0,0,0,0,2.65,-3.95,0,0,-1.46,-0.31,0,0,0,0,-3.31,-3.55,-2.56,0.29]},{"time":0.8666,"offset":14,"vertices":[0.62,-1.26,0.38,-2.2,3.25,-0.5,2.41,2.39,0,0,0,0,0,0,0,0,0,0,1.66,-3.1,0,0,2.3,-1.15,0,0,0,0,-0.07,-3.63,-0.93,0.1]},{"time":1,"offset":14,"vertices":[-1.48,-0.24,-2.72,-2.15,-0.51,-3.39,0,0,0,0,0,0,0,0,0,0,0,0,1.09,-2.61,0,0,0.57,-1.24,0,0,0,0,-2.11,-3.29]}]},"undie straps":{"undie straps":[{"time":0,"offset":2,"vertices":[-1.77,0.54,-0.96,-1.03,-0.39,-0.24,-1.77,0.54]},{"time":0.1333,"offset":2,"vertices":[-2.25,-1.03,-1.49,-4.23,-0.74,-2.84,-1.9,0.54]},{"time":0.3333,"offset":2,"vertices":[-2.37,-0.05,-0.49,0.19,-0.9,1.16,-1.6,2.7,0.96,0.8]},{"time":0.7,"offset":2,"vertices":[-0.91,-2.76,-0.62,-3.63,-0.84,-2.26,-2.56,0.52]},{"time":0.8666,"offset":2,"vertices":[-2.56,0.52,-1.58,0.32,-1.38,0.32,-2.56,0.52]},{"time":1,"offset":2,"vertices":[-1.77,0.54,-0.8,0.53,-0.8,0.53,-1.77,0.54]}]},"undies":{"undies":[{"time":0,"vertices":[0.43,0.72,10.6,-0.11,2.29,0,2.29,0,2.29,0,0.58,0.24,-2.4,-0.65,-2.27,-0.77,2.29,0,0.58,-0.48,4.98,-0.11,6.5,-0.23]},{"time":0.1333,"vertices":[0.72,0.43,7.2,-0.16,1.37,0,1.37,0,1.37,0,1.25,0.04,-0.99,-2.95,-1.37,-3.07,1.37,0,0.35,-0.29,2.99,-0.07,3.9,-0.14]},{"time":0.3333,"vertices":[1.16,0,2.1,-0.23,0,0,0,0,0,0,2.24,-0.24,-0.43,0.6,-1.55,0.48]},{"time":0.5333,"vertices":[1.16,0,-0.23,-0.93,-2.92,0.35,0,0,0,0,0.49,-0.24,-0.64,-2.07,-0.64,-2.07]},{"time":0.7,"vertices":[1.86,-0.11,4.66,-0.09,-1.76,0.21,0,0,-0.56,0.32,-1.13,-1.15,-2.19,-3.47,-1.29,-3.47,0,0,0,0,1.58,-0.04,2.65,0.16]},{"time":0.8333,"vertices":[2.41,-0.2,8.58,0.58,-0.83,0.1,0,0,-1.02,0.59,-2.44,-1.87,-1.62,0,0,0,0,0,0,0,2.85,-0.08,4.78,0.3]},{"time":0.8666,"vertices":[2.01,-0.02,8.98,0.44,-0.2,0.08,0.45,0,-0.35,0.47,-1.84,-1.44,-0.79,1.26,0.53,1.23,0.45,0,0.11,-0.09,3.28,-0.09,5.13,0.19]},{"time":1,"vertices":[0.43,0.72,10.6,-0.11,2.29,0,2.29,0,2.29,0,0.58,0.24,-2.4,-0.65,-2.27,-0.77,2.29,0,0.58,-0.48,4.98,-0.11,6.5,-0.23]}]}}}}}} \ No newline at end of file diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json.meta deleted file mode 100644 index cc50a083e..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.json.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: f3a3248bc50115241ae81702fde448eb -TextScriptImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png deleted file mode 100644 index fc524c564..000000000 Binary files a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png and /dev/null differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset deleted file mode 100644 index cc334ce8e..000000000 Binary files a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset and /dev/null differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset.meta deleted file mode 100644 index 4f8499576..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Atlas.asset.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: df2c4ad0c6709fd4f9b1c19ab43878ae -NativeFormatImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat deleted file mode 100644 index c623d8ae6..000000000 Binary files a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat and /dev/null differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat.meta deleted file mode 100644 index 1c84b0c05..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_Material.mat.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 64a66fecd89237b478156e7cc4d2da4a -NativeFormatImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset deleted file mode 100644 index e443663b9..000000000 Binary files a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset and /dev/null differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset.meta deleted file mode 100644 index 4e8df5510..000000000 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh_SkeletonData.asset.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 066917a2cc5e8824b9b7e2944feee6f1 -NativeFormatImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt b/spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt similarity index 86% rename from spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt rename to spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt index d674db469..bcb327ec8 100644 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.atlas.txt +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt @@ -1,292 +1,292 @@ -goblins-mesh.png -size: 1024,128 +goblins.png +size: 795,142 format: RGBA8888 filter: Linear,Linear repeat: none dagger - rotate: true - xy: 372, 100 + rotate: false + xy: 1, 33 size: 26, 108 orig: 26, 108 offset: 0, 0 index: -1 goblin/eyes-closed rotate: false - xy: 2, 7 + xy: 760, 129 size: 34, 12 orig: 34, 12 offset: 0, 0 index: -1 goblin/head - rotate: false - xy: 107, 36 + rotate: true + xy: 110, 38 size: 103, 66 orig: 103, 66 offset: 0, 0 index: -1 goblin/left-arm - rotate: false - xy: 901, 56 + rotate: true + xy: 659, 7 size: 37, 35 orig: 37, 35 offset: 0, 0 index: -1 goblin/left-foot rotate: false - xy: 929, 95 + xy: 1, 1 size: 65, 31 orig: 65, 31 offset: 0, 0 index: -1 goblin/left-hand rotate: false - xy: 452, 2 + xy: 347, 3 size: 36, 41 orig: 36, 41 offset: 0, 0 index: -1 goblin/left-lower-leg - rotate: true - xy: 713, 93 + rotate: false + xy: 420, 71 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblin/left-shoulder - rotate: false - xy: 610, 44 + rotate: true + xy: 684, 48 size: 29, 44 orig: 29, 44 offset: 0, 0 index: -1 goblin/left-upper-leg - rotate: true - xy: 638, 93 + rotate: false + xy: 315, 68 size: 33, 73 orig: 33, 73 offset: 0, 0 index: -1 goblin/neck rotate: false - xy: 490, 2 + xy: 384, 3 size: 36, 41 orig: 36, 41 offset: 0, 0 index: -1 goblin/pelvis rotate: false - xy: 482, 45 + xy: 221, 1 size: 62, 43 orig: 62, 43 offset: 0, 0 index: -1 goblin/right-arm - rotate: true - xy: 690, 2 + rotate: false + xy: 732, 91 size: 23, 50 orig: 23, 50 offset: 0, 0 index: -1 goblin/right-foot - rotate: false - xy: 771, 58 + rotate: true + xy: 624, 78 size: 63, 33 orig: 63, 33 offset: 0, 0 index: -1 goblin/right-hand rotate: false - xy: 940, 56 + xy: 585, 7 size: 36, 37 orig: 36, 37 offset: 0, 0 index: -1 goblin/right-lower-leg rotate: true - xy: 482, 90 + xy: 67, 1 size: 36, 76 orig: 36, 76 offset: 0, 0 index: -1 goblin/right-shoulder rotate: true - xy: 602, 3 + xy: 493, 5 size: 39, 45 orig: 39, 45 offset: 0, 0 index: -1 goblin/right-upper-leg - rotate: true - xy: 641, 57 + rotate: false + xy: 554, 78 size: 34, 63 orig: 34, 63 offset: 0, 0 index: -1 goblin/torso - rotate: true - xy: 212, 34 + rotate: false + xy: 177, 45 size: 68, 96 orig: 68, 96 offset: 0, 0 index: -1 goblin/undie-straps - rotate: false - xy: 380, 5 + rotate: true + xy: 692, 86 size: 55, 19 orig: 55, 19 offset: 0, 0 index: -1 goblin/undies rotate: false - xy: 174, 5 + xy: 756, 99 size: 36, 29 orig: 36, 29 offset: 0, 0 index: -1 goblingirl/eyes-closed - rotate: false - xy: 269, 11 + rotate: true + xy: 729, 48 size: 37, 21 orig: 37, 21 offset: 0, 0 index: -1 goblingirl/head - rotate: false - xy: 2, 21 + rotate: true + xy: 28, 38 size: 103, 81 orig: 103, 81 offset: 0, 0 index: -1 goblingirl/left-arm rotate: true - xy: 978, 56 + xy: 724, 10 size: 37, 35 orig: 37, 35 offset: 0, 0 index: -1 goblingirl/left-foot - rotate: false - xy: 107, 3 + rotate: true + xy: 522, 76 size: 65, 31 orig: 65, 31 offset: 0, 0 index: -1 goblingirl/left-hand rotate: false - xy: 565, 2 + xy: 457, 4 size: 35, 40 orig: 35, 40 offset: 0, 0 index: -1 goblingirl/left-lower-leg - rotate: true - xy: 785, 93 + rotate: false + xy: 454, 71 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblingirl/left-shoulder - rotate: true - xy: 690, 27 + rotate: false + xy: 695, 1 size: 28, 46 orig: 28, 46 offset: 0, 0 index: -1 goblingirl/left-upper-leg - rotate: true - xy: 857, 93 + rotate: false + xy: 488, 71 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblingirl/neck rotate: false - xy: 528, 2 + xy: 421, 3 size: 35, 41 orig: 35, 41 offset: 0, 0 index: -1 goblingirl/pelvis rotate: false - xy: 546, 45 + xy: 284, 1 size: 62, 43 orig: 62, 43 offset: 0, 0 index: -1 goblingirl/right-arm rotate: false - xy: 452, 48 + xy: 756, 48 size: 28, 50 orig: 28, 50 offset: 0, 0 index: -1 goblingirl/right-foot - rotate: false - xy: 836, 58 + rotate: true + xy: 658, 78 size: 63, 33 orig: 63, 33 offset: 0, 0 index: -1 goblingirl/right-hand - rotate: true - xy: 771, 20 + rotate: false + xy: 622, 7 size: 36, 37 orig: 36, 37 offset: 0, 0 index: -1 goblingirl/right-lower-leg rotate: true - xy: 560, 90 + xy: 144, 1 size: 36, 76 orig: 36, 76 offset: 0, 0 index: -1 goblingirl/right-shoulder - rotate: false - xy: 649, 10 + rotate: true + xy: 539, 5 size: 39, 45 orig: 39, 45 offset: 0, 0 index: -1 goblingirl/right-upper-leg - rotate: true - xy: 706, 57 + rotate: false + xy: 589, 78 size: 34, 63 orig: 34, 63 offset: 0, 0 index: -1 goblingirl/torso rotate: false - xy: 310, 2 + xy: 246, 45 size: 68, 96 orig: 68, 96 offset: 0, 0 index: -1 goblingirl/undie-straps - rotate: false - xy: 212, 13 + rotate: true + xy: 712, 86 size: 55, 19 orig: 55, 19 offset: 0, 0 index: -1 goblingirl/undies - rotate: false - xy: 810, 27 + rotate: true + xy: 760, 11 size: 36, 29 orig: 36, 29 offset: 0, 0 index: -1 shield rotate: false - xy: 380, 26 + xy: 349, 69 size: 70, 72 orig: 70, 72 offset: 0, 0 index: -1 spear rotate: true - xy: 2, 104 + xy: 315, 45 size: 22, 368 orig: 22, 368 offset: 0, 0 diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt.meta new file mode 100644 index 000000000..6766dd993 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins.atlas.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 179f09b47e5402545a1aa69bf5cb2cba +timeCreated: 1467115504 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins.json b/spine-unity/Assets/Examples/Spine/Goblins/goblins.json new file mode 100644 index 000000000..9a0cadc22 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins.json @@ -0,0 +1,1060 @@ +{ +"skeleton": { + "hash": "JkhrYH1FWGINlDaz60K/E43JLYM", + "spine": "3.3.07", + "width": 266.99, + "height": 349.62, + "images": "C:/Program Files (x86)/Spine/examples/goblins/images/" +}, +"bones": [ + { "name": "root" }, + { "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 }, + { "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 }, + { "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 }, + { "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 }, + { "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 }, + { "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 }, + { "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 }, + { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 }, + { "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 }, + { "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 }, + { "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 }, + { "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 }, + { "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 }, + { "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 }, + { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 }, + { "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 }, + { "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 } +], +"slots": [ + { "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" }, + { "name": "left arm", "bone": "left arm", "attachment": "left arm" }, + { "name": "left hand item", "bone": "left hand", "attachment": "spear" }, + { "name": "left hand", "bone": "left hand", "attachment": "left hand" }, + { "name": "left foot", "bone": "left foot", "attachment": "left foot" }, + { "name": "left lower leg", "bone": "left lower leg", "attachment": "left lower leg" }, + { "name": "left upper leg", "bone": "left upper leg", "attachment": "left upper leg" }, + { "name": "neck", "bone": "neck", "attachment": "neck" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" }, + { "name": "right foot", "bone": "right foot", "attachment": "right foot" }, + { "name": "right lower leg", "bone": "right lower leg", "attachment": "right lower leg" }, + { "name": "undie straps", "bone": "pelvis", "attachment": "undie straps" }, + { "name": "undies", "bone": "pelvis", "attachment": "undies" }, + { "name": "right upper leg", "bone": "right upper leg", "attachment": "right upper leg" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "eyes", "bone": "head" }, + { "name": "right shoulder", "bone": "right shoulder", "attachment": "right shoulder" }, + { "name": "right arm", "bone": "right arm", "attachment": "right arm" }, + { "name": "right hand thumb", "bone": "right hand", "attachment": "right hand thumb" }, + { "name": "right hand item", "bone": "right hand", "attachment": "dagger" }, + { "name": "right hand", "bone": "right hand", "attachment": "right hand" }, + { "name": "right hand item 2", "bone": "right hand", "attachment": "shield" } +], +"skins": { + "default": { + "left hand item": { + "dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 }, + "spear": { + "type": "mesh", + "uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.72117, 1, 0.28838, 1, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ], + "triangles": [ 4, 5, 6, 1, 7, 0, 1, 3, 4, 6, 7, 1, 1, 4, 6, 2, 3, 1 ], + "vertices": [ -26.02, 180.65, -29.24, 172.19, 41.7, -138.95, 32.41999, -141.1, -41.49, 169.49, -47.22, 174.67, -47.08, 218.22, -44.27, 218.87 ], + "hull": 8, + "edges": [ 12, 10, 10, 8, 8, 6, 4, 6, 4, 2, 2, 0, 12, 14, 0, 14 ], + "width": 22, + "height": 368 + } + }, + "right hand item": { + "dagger": { + "type": "mesh", + "uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ], + "triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ], + "vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ], + "hull": 14, + "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], + "width": 26, + "height": 108 + } + }, + "right hand item 2": { + "shield": { "rotation": 93.49, "width": 70, "height": 72 } + } + }, + "goblin": { + "eyes": { + "eyes closed": { "name": "goblin/eyes-closed", "x": 29.19, "y": -24.89, "rotation": -88.92, "width": 34, "height": 12 } + }, + "head": { + "head": { + "name": "goblin/head", + "type": "mesh", + "uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ], + "triangles": [ 26, 20, 19, 21, 20, 26, 15, 14, 13, 12, 15, 13, 11, 16, 15, 11, 15, 12, 26, 17, 25, 18, 26, 19, 17, 26, 18, 30, 25, 17, 30, 17, 16, 30, 16, 11, 1, 22, 21, 23, 22, 1, 2, 1, 21, 2, 21, 26, 29, 30, 11, 29, 11, 10, 28, 25, 30, 0, 23, 1, 9, 29, 10, 25, 3, 2, 25, 2, 26, 29, 27, 28, 29, 28, 30, 24, 3, 25, 24, 25, 28, 24, 28, 27, 8, 29, 9, 27, 29, 8, 4, 3, 24, 5, 24, 27, 4, 24, 5, 7, 6, 27, 7, 27, 8, 5, 27, 6 ], + "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.45999, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.59999, 23.41, 35.89, 40.16999, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.79999, -24.31, 17.2, -40.65, 20.68, -33.02 ], + "hull": 24, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], + "width": 103, + "height": 66 + } + }, + "left arm": { + "left arm": { + "name": "goblin/left-arm", + "type": "mesh", + "uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ], + "triangles": [ 6, 7, 8, 5, 6, 8, 0, 5, 8, 0, 1, 2, 5, 0, 2, 4, 5, 2, 3, 4, 2 ], + "vertices": [ 18.6, 8.81, 32.18999, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], + "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], + "width": 37, + "height": 35 + } + }, + "left foot": { + "left foot": { + "name": "goblin/left-foot", + "type": "mesh", + "uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ], + "triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ], + "vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ], + "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], + "width": 65, + "height": 31 + } + }, + "left hand": { + "left hand": { + "name": "goblin/left-hand", + "type": "mesh", + "uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ], + "triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ], + "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.47999, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], + "hull": 9, + "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], + "width": 36, + "height": 41 + } + }, + "left lower leg": { + "left lower leg": { + "name": "goblin/left-lower-leg", + "type": "mesh", + "uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ], + "triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ], + "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.18999, -18.29 ], + "hull": 11, + "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], + "width": 33, + "height": 70 + } + }, + "left shoulder": { + "left shoulder": { + "name": "goblin/left-shoulder", + "type": "mesh", + "uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ], + "triangles": [ 5, 6, 7, 4, 5, 7, 4, 7, 0, 3, 4, 0, 3, 0, 1, 3, 1, 2 ], + "vertices": [ 15.18, 5.74, 32.16999, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.73999, -4.66, 6.54 ], + "hull": 8, + "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], + "width": 29, + "height": 44 + } + }, + "left upper leg": { + "left upper leg": { + "name": "goblin/left-upper-leg", + "type": "mesh", + "uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ], + "triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ], + "vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ], + "hull": 9, + "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], + "width": 33, + "height": 73 + } + }, + "neck": { + "neck": { + "name": "goblin/neck", + "type": "mesh", + "uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ], + "triangles": [ 6, 8, 9, 6, 9, 0, 7, 8, 6, 10, 5, 6, 0, 10, 6, 10, 0, 1, 3, 4, 5, 2, 5, 10, 2, 10, 1, 3, 5, 2 ], + "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.04999, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], + "hull": 10, + "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], + "width": 36, + "height": 41 + } + }, + "pelvis": { + "pelvis": { + "name": "goblin/pelvis", + "type": "mesh", + "uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ], + "triangles": [ 1, 2, 3, 1, 3, 0 ], + "vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ], + "hull": 4, + "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], + "width": 62, + "height": 43 + } + }, + "right arm": { + "right arm": { + "name": "goblin/right-arm", + "type": "mesh", + "uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ], + "triangles": [ 6, 7, 0, 2, 3, 5, 4, 5, 3, 1, 6, 0, 6, 2, 5, 1, 2, 6 ], + "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.17999 ], + "hull": 8, + "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], + "width": 23, + "height": 50 + } + }, + "right foot": { + "right foot": { + "name": "goblin/right-foot", + "type": "mesh", + "uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ], + "triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ], + "vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ], + "hull": 14, + "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], + "width": 63, + "height": 33 + } + }, + "right hand": { + "right hand": { + "name": "goblin/right-hand", + "type": "mesh", + "uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ], + "triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ], + "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.87999, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], + "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], + "width": 36, + "height": 37 + } + }, + "right hand thumb": { + "right hand thumb": { + "name": "goblin/right-hand", + "type": "mesh", + "uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ], + "triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ], + "vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ], + "hull": 5, + "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], + "width": 36, + "height": 37 + } + }, + "right lower leg": { + "right lower leg": { + "name": "goblin/right-lower-leg", + "type": "mesh", + "uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ], + "triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ], + "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.09999, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.76999, -1.03, 58.99, -9.18999, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], + "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], + "width": 36, + "height": 76 + } + }, + "right shoulder": { + "right shoulder": { + "name": "goblin/right-shoulder", + "type": "mesh", + "uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ], + "triangles": [ 2, 3, 0, 2, 0, 1, 7, 0, 3, 4, 5, 6, 4, 7, 3, 4, 6, 7 ], + "vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ], + "hull": 8, + "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], + "width": 39, + "height": 45 + } + }, + "right upper leg": { + "right upper leg": { + "name": "goblin/right-upper-leg", + "type": "mesh", + "uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ], + "triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ], + "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.50999, 10.18, 19.12999, 18.46999, 2.85, 16.32, -8.39999, 6.14 ], + "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], + "width": 34, + "height": 63 + } + }, + "torso": { + "torso": { + "name": "goblin/torso", + "type": "mesh", + "uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ], + "triangles": [ 0, 15, 14, 20, 14, 13, 20, 13, 12, 1, 0, 14, 20, 12, 11, 20, 1, 14, 22, 20, 11, 22, 11, 10, 19, 1, 20, 19, 20, 22, 2, 1, 19, 18, 22, 10, 18, 10, 9, 19, 22, 18, 18, 9, 8, 21, 18, 8, 21, 8, 7, 17, 2, 19, 21, 17, 19, 21, 19, 18, 3, 2, 17, 16, 21, 7, 17, 21, 16, 4, 3, 17, 5, 17, 16, 4, 17, 5, 6, 16, 7, 5, 16, 6 ], + "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.87999, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -21.69, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], + "hull": 16, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], + "width": 68, + "height": 96 + } + }, + "undie straps": { + "undie straps": { + "name": "goblin/undie-straps", + "type": "mesh", + "uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ], + "triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ], + "vertices": [ -10.56, 12.87, 6.53, 9.89999, 25.62, 17.70999, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], + "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], + "width": 55, + "height": 19 + } + }, + "undies": { + "undies": { + "name": "goblin/undies", + "type": "mesh", + "uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ], + "triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ], + "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.58999, 22.22, 6.11, 22.92, 14.05, 3.75, 9.43999, -13.08, 13.71, 4.21, -2.58999, 4.03, 2.05 ], + "hull": 10, + "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], + "width": 36, + "height": 29 + } + } + }, + "goblingirl": { + "eyes": { + "eyes closed": { "name": "goblingirl/eyes-closed", "x": 28, "y": -25.54, "rotation": -87.04, "width": 37, "height": 21 } + }, + "head": { + "head": { "name": "goblingirl/head", "x": 27.71, "y": -4.32, "rotation": -85.58, "width": 103, "height": 81 } + }, + "left arm": { + "left arm": { "name": "goblingirl/left-arm", "x": 19.64, "y": -2.42, "rotation": 33.05, "width": 37, "height": 35 } + }, + "left foot": { + "left foot": { "name": "goblingirl/left-foot", "type": "linkedmesh", "skin": "goblin", "parent": "left foot", "width": 65, "height": 31 } + }, + "left hand": { + "left hand": { + "name": "goblingirl/left-hand", + "x": 4.34, + "y": 2.39, + "scaleX": 0.896, + "scaleY": 0.896, + "rotation": 30.34, + "width": 35, + "height": 40 + } + }, + "left lower leg": { + "left lower leg": { "name": "goblingirl/left-lower-leg", "x": 25.02, "y": -0.6, "rotation": 105.75, "width": 33, "height": 70 } + }, + "left shoulder": { + "left shoulder": { "name": "goblingirl/left-shoulder", "x": 19.8, "y": -0.42, "rotation": 61.21, "width": 28, "height": 46 } + }, + "left upper leg": { + "left upper leg": { "name": "goblingirl/left-upper-leg", "x": 30.21, "y": -2.95, "rotation": 89.09, "width": 33, "height": 70 } + }, + "neck": { + "neck": { "name": "goblingirl/neck", "x": 6.16, "y": -3.14, "rotation": -98.86, "width": 35, "height": 41 } + }, + "pelvis": { + "pelvis": { "name": "goblingirl/pelvis", "type": "linkedmesh", "skin": "goblin", "parent": "pelvis", "width": 62, "height": 43 } + }, + "right arm": { + "right arm": { "name": "goblingirl/right-arm", "x": 16.85, "y": -0.66, "rotation": 93.52, "width": 28, "height": 50 } + }, + "right foot": { + "right foot": { "name": "goblingirl/right-foot", "type": "linkedmesh", "skin": "goblin", "parent": "right foot", "width": 63, "height": 33 } + }, + "right hand": { + "right hand": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 } + }, + "right hand thumb": { + "right hand thumb": { "name": "goblingirl/right-hand", "x": 7.21, "y": 3.43, "rotation": 91.16, "width": 36, "height": 37 } + }, + "right lower leg": { + "right lower leg": { "name": "goblingirl/right-lower-leg", "x": 26.15, "y": -3.27, "rotation": 111.83, "width": 36, "height": 76 } + }, + "right shoulder": { + "right shoulder": { "name": "goblingirl/right-shoulder", "x": 14.46, "y": 0.45, "rotation": 129.85, "width": 39, "height": 45 } + }, + "right upper leg": { + "right upper leg": { + "name": "goblingirl/right-upper-leg", + "type": "linkedmesh", + "skin": "goblin", + "parent": "right upper leg", + "width": 34, + "height": 63 + } + }, + "torso": { + "torso": { "name": "goblingirl/torso", "x": 36.28, "y": -5.14, "rotation": -95.74, "width": 68, "height": 96 } + }, + "undie straps": { + "undie straps": { "name": "goblingirl/undie-straps", "x": -1.51, "y": 14.18, "width": 55, "height": 19 } + }, + "undies": { + "undies": { "name": "goblingirl/undies", "x": 5.4, "y": 1.7, "width": 36, "height": 29 } + } + } +}, +"animations": { + "walk": { + "slots": { + "eyes": { + "attachment": [ + { "time": 0.7, "name": "eyes closed" }, + { "time": 0.8, "name": null } + ] + } + }, + "bones": { + "left upper leg": { + "rotate": [ + { "time": 0, "angle": -26.55 }, + { "time": 0.1333, "angle": -8.78 }, + { "time": 0.2333, "angle": 9.51 }, + { "time": 0.3666, "angle": 30.74 }, + { "time": 0.5, "angle": 25.33 }, + { "time": 0.6333, "angle": 26.11 }, + { "time": 0.7333, "angle": 7.45 }, + { "time": 0.8666, "angle": -21.19 }, + { "time": 1, "angle": -26.55 } + ], + "translate": [ + { "time": 0, "x": -1.32, "y": 1.7 }, + { "time": 0.3666, "x": -0.06, "y": 2.42 }, + { "time": 1, "x": -1.32, "y": 1.7 } + ] + }, + "right upper leg": { + "rotate": [ + { "time": 0, "angle": 42.45 }, + { + "time": 0.1333, + "angle": 49.86, + "curve": [ 0.414, 0, 0.705, 0.99 ] + }, + { "time": 0.2333, "angle": 22.51 }, + { "time": 0.5, "angle": -16.93 }, + { "time": 0.6333, "angle": 1.89 }, + { + "time": 0.7333, + "angle": 34.86, + "curve": [ 0.462, 0.11, 1, 1 ] + }, + { + "time": 0.8666, + "angle": 58.68, + "curve": [ 0.5, 0.02, 1, 1 ] + }, + { "time": 1, "angle": 42.45 } + ], + "translate": [ + { "time": 0, "x": 6.23, "y": 0 }, + { "time": 0.2333, "x": 2.14, "y": 2.4 }, + { "time": 0.5, "x": 2.44, "y": 4.8 }, + { "time": 1, "x": 6.23, "y": 0 } + ] + }, + "left lower leg": { + "rotate": [ + { "time": 0, "angle": -18.05 }, + { "time": 0.1333, "angle": -63.5 }, + { "time": 0.2333, "angle": -83.01 }, + { "time": 0.5, "angle": 5.11 }, + { "time": 0.6333, "angle": -28.29 }, + { "time": 0.7333, "angle": -27.52 }, + { "time": 0.8666, "angle": 3.53 }, + { "time": 1, "angle": -18.05 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.2333, "x": 2.55, "y": -0.47 }, + { "time": 0.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1, "x": 0, "y": 0 } + ] + }, + "left foot": { + "rotate": [ + { "time": 0, "angle": -14.56 }, + { "time": 0.1333, "angle": -10.42 }, + { "time": 0.2333, "angle": -5.01 }, + { "time": 0.3, "angle": 6.67 }, + { "time": 0.3666, "angle": 3.87 }, + { "time": 0.5, "angle": -3.87 }, + { "time": 0.6333, "angle": 2.78 }, + { "time": 0.7333, "angle": -11.99 }, + { "time": 0.8666, "angle": -12.45 }, + { "time": 1, "angle": -14.56 } + ] + }, + "right shoulder": { + "rotate": [ + { + "time": 0, + "angle": 5.29, + "curve": [ 0.264, 0, 0.75, 1 ] + }, + { "time": 0.6333, "angle": 6.65 }, + { "time": 1, "angle": 5.29 } + ] + }, + "right arm": { + "rotate": [ + { + "time": 0, + "angle": -4.02, + "curve": [ 0.267, 0, 0.804, 0.99 ] + }, + { + "time": 0.6333, + "angle": 19.78, + "curve": [ 0.307, 0, 0.787, 0.99 ] + }, + { "time": 1, "angle": -4.02 } + ] + }, + "right hand": { + "rotate": [ + { "time": 0, "angle": 8.98 }, + { "time": 0.6333, "angle": 0.51 }, + { "time": 1, "angle": 8.98 } + ] + }, + "left shoulder": { + "rotate": [ + { + "time": 0, + "angle": 6.25, + "curve": [ 0.339, 0, 0.683, 1 ] + }, + { + "time": 0.5, + "angle": -11.78, + "curve": [ 0.281, 0, 0.686, 0.99 ] + }, + { "time": 1, "angle": 6.25 } + ], + "translate": [ + { "time": 0, "x": 1.15, "y": 0.23 } + ] + }, + "left hand": { + "rotate": [ + { + "time": 0, + "angle": -21.23, + "curve": [ 0.295, 0, 0.755, 0.98 ] + }, + { + "time": 0.5, + "angle": -27.28, + "curve": [ 0.241, 0, 0.75, 0.97 ] + }, + { "time": 1, "angle": -21.23 } + ] + }, + "left arm": { + "rotate": [ + { + "time": 0, + "angle": 28.37, + "curve": [ 0.339, 0, 0.683, 1 ] + }, + { + "time": 0.5, + "angle": 60.09, + "curve": [ 0.281, 0, 0.686, 0.99 ] + }, + { "time": 1, "angle": 28.37 } + ] + }, + "torso": { + "rotate": [ + { "time": 0, "angle": -10.28 }, + { + "time": 0.1333, + "angle": -15.38, + "curve": [ 0.545, 0, 0.818, 1 ] + }, + { + "time": 0.3666, + "angle": -9.78, + "curve": [ 0.58, 0.17, 0.669, 0.99 ] + }, + { + "time": 0.6333, + "angle": -15.75, + "curve": [ 0.235, 0.01, 0.795, 1 ] + }, + { + "time": 0.8666, + "angle": -7.06, + "curve": [ 0.209, 0, 0.816, 0.98 ] + }, + { "time": 1, "angle": -10.28 } + ], + "translate": [ + { "time": 0, "x": -3.72, "y": -0.01 } + ] + }, + "right foot": { + "rotate": [ + { "time": 0, "angle": -5.25 }, + { "time": 0.2333, "angle": -17.76 }, + { "time": 0.3666, "angle": -20.09 }, + { "time": 0.5, "angle": -19.73 }, + { "time": 0.7333, "angle": -11.68 }, + { "time": 0.8, "angle": 4.46 }, + { "time": 0.8666, "angle": 0.46 }, + { "time": 1, "angle": -5.25 } + ] + }, + "right lower leg": { + "rotate": [ + { + "time": 0, + "angle": -3.39, + "curve": [ 0.316, 0.01, 0.741, 0.98 ] + }, + { + "time": 0.1333, + "angle": -43.21, + "curve": [ 0.414, 0, 0.705, 0.99 ] + }, + { "time": 0.2333, "angle": -25.98 }, + { "time": 0.5, "angle": -19.53 }, + { "time": 0.6333, "angle": -64.8 }, + { + "time": 0.7333, + "angle": -89.54, + "curve": [ 0.557, 0.18, 1, 1 ] + }, + { "time": 1, "angle": -3.39 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.5, "x": 0, "y": 0 }, + { "time": 0.6333, "x": 2.18, "y": 0.21 }, + { "time": 1, "x": 0, "y": 0 } + ] + }, + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 1, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": -8.4 }, + { + "time": 0.1333, + "x": 0, + "y": -9.35, + "curve": [ 0.326, 0.05, 0.674, 0.93 ] + }, + { + "time": 0.2333, + "x": 0, + "y": -0.59, + "curve": [ 0.325, 0.39, 0.643, 0.7 ] + }, + { "time": 0.3666, "x": 0, "y": -3.96 }, + { "time": 0.5, "x": 0, "y": -8.4 }, + { + "time": 0.6333, + "x": 0, + "y": -10, + "curve": [ 0.359, 0.47, 0.646, 0.74 ] + }, + { + "time": 0.7333, + "x": 0, + "y": -5.29, + "curve": [ 0.333, 0.36, 0.662, 0.69 ] + }, + { + "time": 0.8, + "x": 0, + "y": -2.49, + "curve": [ 0.322, 0.35, 0.651, 0.68 ] + }, + { "time": 0.8666, "x": 0, "y": -3.96 }, + { "time": 1, "x": 0, "y": -8.4 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 3.6 }, + { "time": 0.1333, "angle": 17.49 }, + { "time": 0.2333, "angle": 6.1 }, + { "time": 0.3666, "angle": 3.45 }, + { "time": 0.5, "angle": 5.17 }, + { "time": 0.6333, "angle": 18.36 }, + { "time": 0.7333, "angle": 6.09 }, + { "time": 0.8666, "angle": 2.28 }, + { "time": 1, "angle": 3.6 } + ] + }, + "head": { + "rotate": [ + { + "time": 0, + "angle": 3.6, + "curve": [ 0, 0, 0.704, 1.17 ] + }, + { "time": 0.1333, "angle": -0.2 }, + { "time": 0.2333, "angle": 6.1 }, + { "time": 0.3666, "angle": 3.45 }, + { + "time": 0.5, + "angle": 5.17, + "curve": [ 0, 0, 0.704, 1.61 ] + }, + { "time": 0.6666, "angle": 1.1 }, + { "time": 0.7333, "angle": 6.09 }, + { "time": 0.8666, "angle": 2.28 }, + { "time": 1, "angle": 3.6 } + ] + }, + "pelvis": { + "rotate": [ + { "time": 0, "angle": -1.33 } + ], + "translate": [ + { "time": 0, "x": 0.39, "y": -0.78 } + ] + } + }, + "deform": { + "default": { + "right hand item": { + "dagger": [ + { + "time": 0, + "offset": 26, + "vertices": [ 2.34754, 0.14469 ], + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.5, + "offset": 8, + "vertices": [ -1.19415, 4.31531, 0.07279, 6.41351, 1.66048, 6.18882, 1.75232, 3.59555 ], + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1, + "offset": 26, + "vertices": [ 2.34754, 0.14469 ] + } + ] + } + }, + "goblin": { + "head": { + "head": [ + { + "time": 0, + "curve": [ 0.632, 0, 0.75, 1 ] + }, + { + "time": 0.2, + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391, -1.08534, 0.08391, -1.08534, 0.08391, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391 ], + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.3666, + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017, 1.47305, 0.09017, 1.47305, 0.09017, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017 ], + "curve": [ 0.621, 0, 0.75, 1 ] + }, + { + "time": 0.7, + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183, -1.1755, -0.17182, -1.1755, -0.17183, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183 ], + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.8666, + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ], + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1 } + ] + }, + "left foot": { + "left foot": [ + { + "time": 0, + "offset": 8, + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] + }, + { "time": 0.1333 }, + { + "time": 0.2333, + "offset": 8, + "vertices": [ -3.96072, -2.34594, -5.80445, -12.47629, -2.23129, -12.99037, 2.02941, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ] + }, + { + "time": 0.3666, + "offset": 8, + "vertices": [ 0.66504, 0.33548, 0.33902, 2.69014, -0.4817, 2.54524, -1.13592, 1.38562, 0, 0, 0, 0, 0, 0, -0.11907, 0.79273 ] + }, + { "time": 0.5, "curve": "stepped" }, + { "time": 0.6333 }, + { + "time": 0.7333, + "offset": 8, + "vertices": [ -2.97737, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72606, 6.30798, 0, 0, -1.48902, 4.88944, -7.06773, 10.70101 ] + }, + { + "time": 0.8333, + "offset": 6, + "vertices": [ 1.05318, 1.56361, -2.52722, 7.9974, -5.5203, 17.14136, -8.93317, 15.79635, -10.73747, 10.22055, -4.23801, 5.36992, 0, 0, 0, 0, -5.83147, 8.55531 ] + }, + { + "time": 1, + "offset": 8, + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] + } + ] + }, + "pelvis": { + "pelvis": [ + { "time": 0 }, + { + "time": 0.1333, + "offset": 6, + "vertices": [ -0.68989, -4.13283 ] + }, + { + "time": 0.3333, + "offset": 6, + "vertices": [ -1.04945, -3.10476 ] + }, + { + "time": 0.7, + "offset": 6, + "vertices": [ -1.4245, -6.30616 ] + }, + { + "time": 0.8666, + "offset": 6, + "vertices": [ -1.13541, -1.79035 ] + }, + { "time": 1 } + ] + }, + "right foot": { + "right foot": [ + { "time": 0 }, + { + "time": 0.1333, + "offset": 2, + "vertices": [ -2.81258, 2.63114, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09854, -0.34812, 3.42912, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91371, -1.32986, 3.65703 ] + }, + { + "time": 0.2333, + "offset": 2, + "vertices": [ -6.39088, 6.41245, -7.74575, 8.27191, -7.02471, 11.35894, -4.0347, 13.93454, -2.50399, 12.62962, -1.46124, 7.58915, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84765, 2.61215, -4.53955, 7.92357 ] + }, + { + "time": 0.3, + "offset": 2, + "vertices": [ -8.27184, 6.68821, -9.29764, 10.13797, -8.62231, 14.71339, -4.58629, 18.81939, -2.20304, 17.10709, -0.07794, 9.9046, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94624, 2.38007, -4.59398, 10.01888 ] + }, + { + "time": 0.3666, + "offset": 2, + "vertices": [ -10.47683, 9.44175, -13.36882, 12.40982, -14.32568, 16.94392, -9.24462, 23.55674, -5.51711, 21.51377, -1.19581, 11.53192, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14847, 2.29389, -6.63418, 11.37127 ] + }, + { + "time": 0.5, + "offset": 2, + "vertices": [ -5.42473, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12805, -1.45497, 18.05411, 4.86619, 6.41678, 2.81462, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.94829 ] + }, + { "time": 0.6333 }, + { + "time": 0.7333, + "offset": 4, + "vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08367, -7.15892, -11.63193, -5.6792, -4.83544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06163, -6.93844 ] + }, + { + "time": 0.8, + "offset": 4, + "vertices": [ 0.65731, -3.42049, -0.43952, -6.27239, -2.99255, -7.04183, -3.57946, -5.81596, -2.83959, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79687, -1.2802, 0, 0, 0, 0, -1.03081, -3.46922 ] + }, + { "time": 0.8666 } + ] + }, + "right hand": { + "right hand": [ + { + "time": 0, + "offset": 4, + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] + }, + { "time": 0.5 }, + { + "time": 1, + "offset": 4, + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] + } + ] + }, + "right lower leg": { + "right lower leg": [ + { "time": 0 }, + { + "time": 0.6, + "offset": 6, + "vertices": [ 1.80396, -1.56552 ] + }, + { "time": 1 } + ] + }, + "right upper leg": { + "right upper leg": [ + { + "time": 0, + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] + }, + { "time": 0.3333 }, + { + "time": 0.8666, + "offset": 14, + "vertices": [ 0.13424, -2.35377, -1.33317, -5.99572, -1.35861, -4.43323 ] + }, + { + "time": 1, + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] + } + ] + }, + "torso": { + "torso": [ + { + "time": 0, + "offset": 14, + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] + }, + { + "time": 0.1333, + "offset": 14, + "vertices": [ 1.31318, -0.59727, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] + }, + { + "time": 0.3, + "offset": 14, + "vertices": [ 6.03761, -3.13561, 7.55475, -1.38111, 6.79747, 0.31171, 4.23503, 1.14012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07575, -5.16824, 0, 0, 4.0041, 0.27245, 0, 0, 0, 0, 3.4376, -3.52286 ] + }, + { + "time": 0.5, + "offset": 14, + "vertices": [ 2.25942, -0.87202, 2.575, -0.56861, 3.17112, -0.57003, 1.48704, 0.9924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22451, -4.43862, 0, 0, 1.48691, 0.01586, 0, 0, 0, 0, 0.31388, -3.28095, -1.53797, 0.17803 ] + }, + { + "time": 0.6333, + "offset": 14, + "vertices": [ 0.75002, -1.51701, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] + }, + { + "time": 0.8666, + "offset": 14, + "vertices": [ 0.62202, -1.26262, 0.38489, -2.20701, 3.25048, -0.50042, 2.41108, 2.39315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6639, -3.10099, 0, 0, 2.30655, -1.15196, 0, 0, 0, 0, -0.07676, -3.63497, -0.9321, 0.1079 ] + }, + { + "time": 1, + "offset": 14, + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] + } + ] + }, + "undie straps": { + "undie straps": [ + { + "time": 0, + "offset": 2, + "vertices": [ -1.77696, 0.54759, -0.96145, -1.03793, -0.39148, -0.24071, -1.77696, 0.54759 ] + }, + { + "time": 0.1333, + "offset": 2, + "vertices": [ -2.25683, -1.03177, -1.49719, -4.23861, -0.74469, -2.84906, -1.90072, 0.54477 ] + }, + { + "time": 0.3333, + "offset": 2, + "vertices": [ -2.37974, -0.05431, -0.49433, 0.19436, -0.90861, 1.16519, -1.60956, 2.70798, 0.96186, 0.80615 ] + }, + { + "time": 0.7, + "offset": 2, + "vertices": [ -0.91714, -2.76567, -0.62214, -3.63489, -0.8494, -2.26772, -2.56076, 0.5297 ] + }, + { + "time": 0.8666, + "offset": 2, + "vertices": [ -2.56076, 0.5297, -1.58064, 0.32031, -1.3847, 0.32476, -2.56076, 0.5297 ] + }, + { + "time": 1, + "offset": 2, + "vertices": [ -1.77696, 0.54759, -0.80128, 0.53413, -0.80128, 0.53413, -1.77696, 0.54759 ] + } + ] + }, + "undies": { + "undies": [ + { + "time": 0, + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] + }, + { + "time": 0.1333, + "vertices": [ 0.72659, 0.43319, 7.20416, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99861, -2.95085, -1.37542, -3.07404, 1.37759, 0, 0.35279, -0.29279, 2.99218, -0.07019, 3.90478, -0.14039 ] + }, + { + "time": 0.3333, + "vertices": [ 1.16999, 0, 2.10599, -0.234, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ] + }, + { + "time": 0.5333, + "vertices": [ 1.16999, 0, -0.234, -0.93599, -2.92499, 0.35099, 0, 0, 0, 0, 0.49999, -0.24999, -0.64078, -2.07914, -0.64078, -2.07914 ] + }, + { + "time": 0.7, + "vertices": [ 1.8627, -0.11514, 4.66326, -0.09099, -1.76428, 0.21171, 0, 0, -0.56832, 0.32832, -1.13833, -1.1511, -2.19996, -3.47068, -1.29718, -3.47068, 0, 0, 0, 0, 1.58785, -0.04642, 2.65941, 0.16714 ] + }, + { + "time": 0.8333, + "vertices": [ 2.41687, -0.20725, 8.58108, 0.585, -0.83571, 0.10028, 0, 0, -1.02299, 0.59098, -2.44899, -1.872, -1.62499, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08356, 4.78695, 0.30086 ] + }, + { + "time": 0.8666, + "vertices": [ 2.01969, -0.0214, 8.98545, 0.4446, -0.20937, 0.08022, 0.45919, 0, -0.35919, 0.47279, -1.84159, -1.4488, -0.79153, 1.2642, 0.53285, 1.23981, 0.45919, 0, 0.11759, -0.09759, 3.2839, -0.09025, 5.13115, 0.19388 ] + }, + { + "time": 1, + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] + } + ] + } + } + } + } +} +} \ No newline at end of file diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins.json.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins.json.meta new file mode 100644 index 000000000..50fbf3815 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins.json.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c3921acb20cbc25418859f1b213d3d3f +timeCreated: 1467115504 +licenseType: Free +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins.png b/spine-unity/Assets/Examples/Spine/Goblins/goblins.png new file mode 100644 index 000000000..2194a41fe Binary files /dev/null and b/spine-unity/Assets/Examples/Spine/Goblins/goblins.png differ diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins.png.meta similarity index 89% rename from spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png.meta rename to spine-unity/Assets/Examples/Spine/Goblins/goblins.png.meta index 300122cab..fddf32d99 100644 --- a/spine-unity/Assets/Examples/Spine/Goblins/goblins-mesh.png.meta +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 803c2e614a63081439fde6276d110661 -timeCreated: 1455501336 +guid: 5fb7efec30c79cb46a705e0d04debb04 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} @@ -30,15 +30,15 @@ TextureImporter: maxTextureSize: 2048 textureSettings: filterMode: -1 - aniso: -1 + aniso: 16 mipBias: -1 - wrapMode: -1 - nPOTScale: 1 + wrapMode: 1 + nPOTScale: 0 lightmap: 0 rGBM: 0 compressionQuality: 50 allowsAlphaSplitting: 0 - spriteMode: 0 + spriteMode: 1 spriteExtrude: 1 spriteMeshType: 1 alignment: 0 diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset new file mode 100644 index 000000000..6f377a39e --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6b194f808b1af6499c93410e504af42, type: 3} + m_Name: goblins_Atlas + m_EditorClassIdentifier: + atlasFile: {fileID: 4900000, guid: 179f09b47e5402545a1aa69bf5cb2cba, type: 3} + materials: + - {fileID: 2100000, guid: 54091ef934c41eb4192f72bfd8e3bcc9, type: 2} diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset.meta new file mode 100644 index 000000000..3d55a9d89 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Atlas.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bb54bdab69af2bb49b35577b80dcaad9 +timeCreated: 1467115504 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat new file mode 100644 index 000000000..21f52650d --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: goblins_Material + m_Shader: {fileID: 4800000, guid: 1e8a610c9e01c3648bac42585e5fc676, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 5 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + data: + first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 5fb7efec30c79cb46a705e0d04debb04, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + data: + first: + name: _Cutoff + second: 0.1 + m_Colors: {} diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat.meta new file mode 100644 index 000000000..d4e948ee9 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_Material.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54091ef934c41eb4192f72bfd8e3bcc9 +timeCreated: 1467115504 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset new file mode 100644 index 000000000..712993750 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f1b3b4b945939a54ea0b23d3396115fb, type: 3} + m_Name: goblins_SkeletonData + m_EditorClassIdentifier: + atlasAssets: + - {fileID: 11400000, guid: bb54bdab69af2bb49b35577b80dcaad9, type: 2} + skeletonJSON: {fileID: 4900000, guid: c3921acb20cbc25418859f1b213d3d3f, type: 3} + scale: 0.01 + fromAnimation: [] + toAnimation: [] + duration: [] + defaultMix: 0 + controller: {fileID: 0} diff --git a/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset.meta b/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset.meta new file mode 100644 index 000000000..0b2cc0155 --- /dev/null +++ b/spine-unity/Assets/Examples/Spine/Goblins/goblins_SkeletonData.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e4e11d4dd87d844a876d18c4d76a612 +timeCreated: 1467115504 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Examples/Spine/Hero.prefab b/spine-unity/Assets/Examples/Spine/Hero.prefab index 99198b958..a0f9c534f 100644 Binary files a/spine-unity/Assets/Examples/Spine/Hero.prefab and b/spine-unity/Assets/Examples/Spine/Hero.prefab differ diff --git a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.json b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.json index 1f36470ef..e0eaf0212 100644 --- a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.json +++ b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.json @@ -1,57 +1,37 @@ { -"skeleton": { "hash": "3UtVZW/AAMHoaYnvByba3GW2T4U", "spine": "3.0.10", "width": 318.7, "height": 333.72, "images": "./images/" }, +"skeleton": { "hash": "jh5t7Fe4HCCCAZkNH+TzeRV82i4", "spine": "3.3.07", "width": 318.75, "height": 333.69, "images": "./images/" }, "bones": [ { "name": "root" }, - { "name": "R_Ground", "parent": "root", "x": 28.11, "y": 0.26, "color": "ff0000ff" }, - { "name": "R_Ankle", "parent": "R_Ground", "y": 31.79, "color": "ff3f00ff" }, - { "name": "LookTarget", "parent": "root", "x": 112.83, "y": 218.2, "color": "8a009bff" }, - { "name": "LookConstraintGoal", "parent": "LookTarget", "y": -43.82, "color": "ff3f00ff" }, + { "name": "Hip", "parent": "root", "y": 94.88 }, { "name": "L_Ground", "parent": "root", "x": -31.28, "y": 0.26, "color": "00ff00ff" }, { "name": "L_Ankle", "parent": "L_Ground", "x": 0.26, "y": 33.05, "color": "ff3f00ff" }, - { "name": "Hip", "parent": "root", "y": 94.88 }, - { "name": "body", "parent": "Hip", "length": 60.79, "x": 4.09, "y": 3.17, "rotation": 96.39 }, - { "name": "mantles", "parent": "body", "x": 48.47, "y": -9, "rotation": -2.25 }, - { "name": "capeRoot", "parent": "mantles", "x": 19.61, "y": 14.01, "rotation": -90.45 }, - { "name": "cape1", "parent": "capeRoot", "length": 29.18, "x": -2.88, "y": -14.83, "rotation": -102.96 }, - { "name": "cape2", "parent": "cape1", "length": 30.14, "x": 29.18, "y": -0.06, "rotation": 2.27 }, - { "name": "cape3", "parent": "cape2", "length": 32.51, "x": 30.14, "y": 0.22, "rotation": 1.8 }, - { "name": "cape4", "parent": "cape3", "length": 33.02, "x": 32.51, "y": 0.06, "rotation": 4.95 }, - { "name": "head", "parent": "body", "length": 24.35, "x": 74.55, "y": -4.84, "rotation": -92.69 }, - { "name": "hair01", "parent": "head", "x": 60.52, "y": 86.71 }, + { "name": "LookTarget", "parent": "root", "x": 112.83, "y": 218.2, "color": "8a009bff" }, + { "name": "LookConstraintGoal", "parent": "LookTarget", "y": -43.82, "color": "ff3f00ff" }, + { "name": "R_Ground", "parent": "root", "x": 28.11, "y": 0.26, "color": "ff0000ff" }, + { "name": "R_Ankle", "parent": "R_Ground", "y": 31.79, "color": "ff3f00ff" }, + { "name": "body", "parent": "Hip", "length": 60.79, "rotation": 96.39, "x": 4.09, "y": 3.17 }, + { "name": "head", "parent": "body", "length": 24.35, "rotation": -92.69, "x": 74.55, "y": -4.84 }, { "name": "bone2", "parent": "head", "x": 12.91, "y": 110.65 }, - { "name": "thigh1", "parent": "Hip", "length": 23.94, "x": -17.51, "y": -5.22, "rotation": -107.07 }, - { "name": "shin1", "parent": "thigh1", "length": 28.23, "x": 29.76, "y": -0.91, "rotation": 10.26 }, - { "name": "foot1", "parent": "shin1", "length": 27.07, "x": 28.17, "y": -0.48, "rotation": -90.96, "inheritRotation": false }, - { "name": "thigh2", "parent": "Hip", "length": 23.65, "x": 21.85, "y": -5.86, "rotation": -85.46 }, - { "name": "shin2", "parent": "thigh2", "length": 25.35, "x": 31.99, "y": 2.96, "rotation": -2.25 }, - { "name": "foot2", "parent": "shin2", "length": 22.28, "x": 25.54, "y": 0.27, "rotation": -90.42, "inheritRotation": false }, - { "name": "upperarm1", "parent": "body", "length": 19.35, "x": 52.49, "y": 41.84, "rotation": 130.11 }, - { "name": "forearm1", "parent": "upperarm1", "length": 22.06, "x": 23.97, "y": 5.16, "rotation": 30.56 }, - { "name": "hand1", "parent": "forearm1", "length": 28.01, "x": 27.54, "y": 0.44, "rotation": 16.24 }, - { "name": "upperarm2", "parent": "body", "length": 25.98, "x": 57.94, "y": -38.93, "rotation": -178.95 }, - { "name": "forearm2", "parent": "upperarm2", "length": 15.3, "x": 28.74, "y": -0.9, "rotation": 6.79 }, - { "name": "hand2", "parent": "forearm2", "length": 23.76, "x": 22.8, "y": -0.21, "rotation": 1.35 }, - { "name": "weapon", "parent": "hand2", "length": 157.4, "x": 15.97, "y": 1.43, "rotation": 77.9 } -], -"ik": [ - { - "name": "L_Leg", - "bones": [ "thigh1", "shin1" ], - "target": "L_Ankle", - "bendPositive": false - }, - { - "name": "R_Leg", - "bones": [ "thigh2", "shin2" ], - "target": "R_Ankle", - "bendPositive": false - }, - { - "name": "LookConstraint", - "bones": [ "head" ], - "target": "LookConstraintGoal", - "mix": 0 - } + { "name": "mantles", "parent": "body", "rotation": -2.25, "x": 48.47, "y": -9 }, + { "name": "capeRoot", "parent": "mantles", "rotation": -90.45, "x": 19.61, "y": 14.01 }, + { "name": "cape1", "parent": "capeRoot", "length": 29.18, "rotation": -102.96, "x": -2.88, "y": -14.83 }, + { "name": "cape2", "parent": "cape1", "length": 30.14, "rotation": 2.27, "x": 29.18, "y": -0.06 }, + { "name": "cape3", "parent": "cape2", "length": 32.51, "rotation": 1.8, "x": 30.14, "y": 0.22 }, + { "name": "cape4", "parent": "cape3", "length": 33.02, "rotation": 4.95, "x": 32.51, "y": 0.06 }, + { "name": "thigh1", "parent": "Hip", "length": 23.94, "rotation": -107.07, "x": -17.51, "y": -5.22 }, + { "name": "shin1", "parent": "thigh1", "length": 28.23, "rotation": 10.26, "x": 29.76, "y": -0.91 }, + { "name": "foot1", "parent": "shin1", "length": 27.07, "rotation": -90.96, "x": 28.17, "y": -0.48, "inheritRotation": false }, + { "name": "thigh2", "parent": "Hip", "length": 23.65, "rotation": -85.46, "x": 21.85, "y": -5.86 }, + { "name": "shin2", "parent": "thigh2", "length": 25.35, "rotation": -2.25, "x": 31.99, "y": 2.96 }, + { "name": "foot2", "parent": "shin2", "length": 22.28, "rotation": -90.42, "x": 25.54, "y": 0.27, "inheritRotation": false }, + { "name": "upperarm1", "parent": "body", "length": 19.35, "rotation": 130.11, "x": 52.49, "y": 41.84 }, + { "name": "forearm1", "parent": "upperarm1", "length": 22.06, "rotation": 30.56, "x": 23.97, "y": 5.16 }, + { "name": "upperarm2", "parent": "body", "length": 25.98, "rotation": -178.95, "x": 57.94, "y": -38.93 }, + { "name": "forearm2", "parent": "upperarm2", "length": 15.3, "rotation": 6.79, "x": 28.74, "y": -0.9 }, + { "name": "hair01", "parent": "head", "x": 60.52, "y": 86.71 }, + { "name": "hand1", "parent": "forearm1", "length": 28.01, "rotation": 16.24, "x": 27.54, "y": 0.44 }, + { "name": "hand2", "parent": "forearm2", "length": 23.76, "rotation": 1.35, "x": 22.8, "y": -0.21 }, + { "name": "weapon", "parent": "hand2", "length": 157.4, "rotation": 77.9, "x": 15.97, "y": 1.43 } ], "slots": [ { "name": "cape", "bone": "capeRoot", "attachment": "cape" }, @@ -76,6 +56,26 @@ { "name": "forearm1", "bone": "forearm1", "attachment": "forearm1" }, { "name": "hand1", "bone": "hand1", "attachment": "hand1" } ], +"ik": [ + { + "name": "L_Leg", + "bones": [ "thigh1", "shin1" ], + "target": "L_Ankle", + "bendPositive": false + }, + { + "name": "LookConstraint", + "bones": [ "head" ], + "target": "LookConstraintGoal", + "mix": 0 + }, + { + "name": "R_Leg", + "bones": [ "thigh2", "shin2" ], + "target": "R_Ankle", + "bendPositive": false + } +], "skins": { "default": { "body": { @@ -92,10 +92,10 @@ }, "cape": { "cape": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.1298, 0.04145, 0.25, 0, 0.5, 0, 0.75, 0, 1, 0, 0.94074, 0.25, 0.90405, 0.5, 0.90969, 0.75259, 0.82336, 1, 0.55643, 1, 0.28104, 1, 0, 1, 0, 0.75518, 0.02821, 0.5, 0.05926, 0.25, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.5, 0.25, 0.5, 0.5, 0.5, 0.75, 0.75, 0.25, 0.75, 0.5, 0.75, 0.75 ], "triangles": [ 20, 22, 23, 23, 6, 7, 12, 13, 17, 11, 12, 17, 10, 17, 20, 11, 17, 10, 9, 20, 23, 10, 20, 9, 8, 23, 7, 9, 23, 8, 13, 16, 17, 17, 19, 20, 14, 15, 16, 13, 14, 16, 16, 18, 19, 19, 21, 22, 17, 16, 19, 20, 19, 22, 23, 22, 6, 0, 1, 15, 14, 0, 15, 15, 2, 18, 18, 3, 21, 16, 15, 18, 19, 18, 21, 6, 22, 21, 5, 6, 21, 15, 1, 2, 18, 2, 3, 5, 21, 3, 4, 5, 3 ], - "vertices": [ 2, 10, -71.4, 10.27, 0.46604, 11, -9.13, -72.39, 0.53394, 2, 10, -47.49, 12.58, 0.68358, 11, -16.73, -49.61, 0.31641, 1, 10, -10.99, 12.58, 1, 1, 10, 25.5, 12.58, 1, 1, 10, 62, 12.58, 1, 5, 10, 62, -27.16, 0.46827, 11, -2.49, 66, 0.34919, 12, -29.04, 67.26, 0.138, 13, -57.05, 68.86, 0.03802, 14, -83.3, 76.26, 0.0065, 5, 10, 62, -66.91, 0.10393, 11, 36.24, 74.89, 0.24994, 12, 10.01, 74.62, 0.32221, 13, -17.77, 74.99, 0.22166, 14, -43.64, 78.98, 0.10223, 5, 10, 62, -106.66, 0.00721, 11, 74.98, 83.79, 0.07037, 12, 49.07, 81.98, 0.23464, 13, 21.49, 81.11, 0.35566, 14, -3.99, 81.69, 0.3321, 4, 11, 121.89, 57.11, 6.8E-4, 12, 94.89, 53.47, 0.03735, 13, 66.39, 51.18, 0.18593, 14, 38.16, 48, 0.77602, 3, 12, 101.65, 17.6, 1.8E-4, 13, 72.01999, 15.11, 0.0066, 14, 40.65, 11.58, 0.9932, 2, 13, 77.64, -20.94, 0.05302, 14, 43.15, -24.82, 0.94697, 3, 12, 115.16, -54.13, 0.00351, 13, 83.26999, -57, 0.13964, 14, 45.65, -61.23, 0.85684, 4, 11, 107.65, -58.5, 0.02404, 12, 76.1, -61.49, 0.08882, 13, 43.99, -63.13, 0.31703, 14, 5.99, -63.95, 0.57009, 5, 10, -83.99, -66.91, 0.00248, 11, 68.91, -67.39, 0.18233, 12, 37.04, -68.85, 0.31987, 13, 4.71999, -69.26, 0.35134, 14, -33.66, -66.67, 0.14396, 5, 10, -80.23, -27.03, 0.05345, 11, 29.2, -72.66, 0.47788, 12, -2.84, -72.54, 0.33484, 13, -35.25999, -71.69, 0.12468, 14, -73.69999, -65.65, 0.00913, 5, 10, -47.49, -27.16, 0.04861, 11, 22, -40.71, 0.52446, 12, -8.77, -40.34, 0.34709, 13, -40.16999, -39.32, 0.07735, 14, -75.81, -32.98, 0.00247, 4, 11, 60.74, -31.82, 0.12714, 12, 30.28, -32.98, 0.45018, 13, -0.9, -33.18999, 0.37754, 14, -36.15, -30.26, 0.04511, 4, 11, 99.48, -22.92, 0.00851, 12, 69.33999, -25.62, 0.04332, 13, 38.37, -27.07, 0.37472, 14, 3.49, -27.54, 0.57342, 1, 11, 13.83, -5.14, 1, 2, 12, 23.52, 2.88, 0.74116, 13, -6.52, 2.86, 0.25883, 3, 12, 62.59, 10.24, 0.01792, 13, 32.74, 8.99, 0.48072, 14, 1, 8.87, 0.50133, 5, 10, 25.5, -27.16, 0.37653, 11, 5.66, 30.42, 0.49807, 12, -22.29, 31.39, 0.10748, 13, -51.42, 32.8, 0.01629, 14, -80.8, 39.84, 0.0016, 5, 10, 25.5, -66.91, 0.05159, 11, 44.41, 39.32, 0.2736, 12, 16.77, 38.75, 0.45121, 13, -12.15, 38.91999, 0.18086, 14, -41.15, 42.56, 0.0427, 5, 10, 25.5, -106.66, 1.7E-4, 11, 83.15, 48.21, 0.01708, 12, 55.83, 46.11, 0.12238, 13, 27.12, 45.05, 0.35747, 14, -1.49, 45.28, 0.50287 ], + "vertices": [ 2, 12, -71.4, 10.27, 0.46604, 13, -9.13, -72.39, 0.53394, 2, 12, -47.49, 12.58, 0.68358, 13, -16.73, -49.61, 0.31641, 1, 12, -10.99, 12.58, 1, 1, 12, 25.5, 12.58, 1, 1, 12, 62, 12.58, 1, 5, 12, 62, -27.16, 0.46827, 13, -2.49, 66, 0.34919, 14, -29.04, 67.26, 0.138, 15, -57.05, 68.86, 0.03802, 16, -83.3, 76.26, 0.0065, 5, 12, 62, -66.91, 0.10393, 13, 36.24, 74.89, 0.24994, 14, 10.01, 74.62, 0.32221, 15, -17.77, 74.99, 0.22166, 16, -43.64, 78.98, 0.10223, 5, 12, 62, -106.66, 0.00721, 13, 74.98, 83.79, 0.07037, 14, 49.07, 81.98, 0.23464, 15, 21.49, 81.11, 0.35566, 16, -3.99, 81.69, 0.3321, 4, 13, 121.89, 57.11, 6.8E-4, 14, 94.89, 53.47, 0.03735, 15, 66.39, 51.18, 0.18593, 16, 38.16, 48, 0.77602, 3, 14, 101.65, 17.6, 1.8E-4, 15, 72.01999, 15.11, 0.0066, 16, 40.65, 11.58, 0.9932, 2, 15, 77.64, -20.94, 0.05302, 16, 43.15, -24.82, 0.94697, 3, 14, 115.16, -54.13, 0.00351, 15, 83.26999, -57, 0.13964, 16, 45.65, -61.23, 0.85684, 4, 13, 107.65, -58.5, 0.02404, 14, 76.1, -61.49, 0.08882, 15, 43.99, -63.13, 0.31703, 16, 5.99, -63.95, 0.57009, 5, 12, -83.99, -66.91, 0.00248, 13, 68.91, -67.39, 0.18233, 14, 37.04, -68.85, 0.31987, 15, 4.71999, -69.26, 0.35134, 16, -33.66, -66.67, 0.14396, 5, 12, -80.23, -27.03, 0.05345, 13, 29.2, -72.66, 0.47788, 14, -2.84, -72.54, 0.33484, 15, -35.25999, -71.69, 0.12468, 16, -73.69999, -65.65, 0.00913, 5, 12, -47.49, -27.16, 0.04861, 13, 22, -40.71, 0.52446, 14, -8.77, -40.34, 0.34709, 15, -40.16999, -39.32, 0.07735, 16, -75.81, -32.98, 0.00247, 4, 13, 60.74, -31.82, 0.12714, 14, 30.28, -32.98, 0.45018, 15, -0.9, -33.18999, 0.37754, 16, -36.15, -30.26, 0.04511, 4, 13, 99.48, -22.92, 0.00851, 14, 69.33999, -25.62, 0.04332, 15, 38.37, -27.07, 0.37472, 16, 3.49, -27.54, 0.57342, 1, 13, 13.83, -5.14, 1, 2, 14, 23.52, 2.88, 0.74116, 15, -6.52, 2.86, 0.25883, 3, 14, 62.59, 10.24, 0.01792, 15, 32.74, 8.99, 0.48072, 16, 1, 8.87, 0.50133, 5, 12, 25.5, -27.16, 0.37653, 13, 5.66, 30.42, 0.49807, 14, -22.29, 31.39, 0.10748, 15, -51.42, 32.8, 0.01629, 16, -80.8, 39.84, 0.0016, 5, 12, 25.5, -66.91, 0.05159, 13, 44.41, 39.32, 0.2736, 14, 16.77, 38.75, 0.45121, 15, -12.15, 38.91999, 0.18086, 16, -41.15, 42.56, 0.0427, 5, 12, 25.5, -106.66, 1.7E-4, 13, 83.15, 48.21, 0.01708, 14, 55.83, 46.11, 0.12238, 15, 27.12, 45.05, 0.35747, 16, -1.49, 45.28, 0.50287 ], "hull": 15, "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 0, 14, 16 ], "width": 146, @@ -137,10 +137,10 @@ }, "head": { "head": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.89191, 0.07464, 1, 0.36671, 0.86524, 0.47125, 0.75952, 0.55326, 0.76614, 0.75424, 0.77423, 1, 0.52641, 1, 0.25139, 1, 0, 0.57054, 0.10296, 0.27407, 0.22999, 0.14511, 0.45598, 0.0454, 0.71272, 0, 0.6472, 0.42961, 0.39447, 0.39904, 0.22598, 0.42696, 0.75608, 0.33283, 0.60098, 0.22733, 0.43093, 0.21786, 0.52274, 0.41456, 0.52466, 0.72063, 0.24463, 0.56616, 0.28184, 0.73041, 0.67863, 0.75066 ], "triangles": [ 18, 10, 11, 17, 11, 12, 18, 11, 17, 9, 10, 18, 0, 17, 12, 18, 15, 9, 19, 18, 17, 16, 13, 17, 16, 17, 0, 16, 0, 1, 2, 16, 1, 2, 3, 16, 13, 19, 17, 14, 18, 19, 14, 15, 18, 3, 13, 16, 21, 15, 14, 8, 9, 15, 8, 15, 21, 20, 19, 13, 20, 13, 3, 21, 20, 22, 14, 20, 21, 19, 20, 14, 23, 20, 3, 23, 3, 4, 22, 8, 21, 7, 8, 22, 6, 20, 23, 22, 20, 6, 7, 22, 6, 5, 6, 23, 5, 23, 4 ], - "vertices": [ 2, 16, 16.16, 58.77, 0.65472, 17, 63.77, 34.83, 0.34527, 2, 16, 36.03, 1.92, 1.00135, 17, 83.64, -22.01, -0.00135, 2, 15, 72.24, 76.12, 0.00643, 16, 11.72, -10.58, 0.99356, 1, 15, 54.09, 62.63, 1, 1, 15, 55.3, 27.87, 1, 1, 15, 56.78, -14.64, 1, 1, 15, 14.16, -14.73, 1, 1, 15, -33.14, -14.83, 1, 1, 15, -76.53, 59.37, 1, 2, 15, -58.93, 110.69, 0.14022, 17, -71.83999, 0.04, 0.85977, 2, 15, -37.13, 133.05, 0.05322, 17, -50.04, 22.4, 0.94677, 3, 15, 1.69, 150.38, 0, 16, -58.82, 63.67, 0.03085, 17, -11.21, 39.73, 0.96913, 2, 16, -14.68, 71.62, 0.38932, 17, 32.93, 47.68, 0.61066, 1, 15, 34.72, 83.98, 1, 1, 15, -8.75, 89.18, 1, 1, 15, -37.72, 84.29, 1, 3, 15, 53.42, 100.64, 0.00656, 16, -7.1, 13.93, 0.75552, 17, 40.50999, -10, 0.23791, 2, 16, -33.81, 32.21, 0.17777, 17, 13.79, 8.27, 0.82222, 2, 15, -2.54, 120.54, 0.02356, 17, -15.45, 9.89, 0.97643, 1, 15, 13.31, 86.54, 1, 1, 15, 13.75, 33.59, 1, 1, 15, -34.46, 60.21, 1, 1, 15, -28, 31.81, 1, 1, 15, 40.25, 28.45, 1 ], + "vertices": [ 2, 27, 16.16, 58.77, 0.65472, 10, 63.77, 34.83, 0.34527, 2, 27, 36.03, 1.92, 1.00135, 10, 83.64, -22.01, -0.00135, 2, 9, 72.24, 76.12, 0.00643, 27, 11.72, -10.58, 0.99356, 1, 9, 54.09, 62.63, 1, 1, 9, 55.3, 27.87, 1, 1, 9, 56.78, -14.64, 1, 1, 9, 14.16, -14.73, 1, 1, 9, -33.14, -14.83, 1, 1, 9, -76.53, 59.37, 1, 2, 9, -58.93, 110.69, 0.14022, 10, -71.83999, 0.04, 0.85977, 2, 9, -37.13, 133.05, 0.05322, 10, -50.04, 22.4, 0.94677, 3, 9, 1.69, 150.38, 0, 27, -58.82, 63.67, 0.03085, 10, -11.21, 39.73, 0.96913, 2, 27, -14.68, 71.62, 0.38932, 10, 32.93, 47.68, 0.61066, 1, 9, 34.72, 83.98, 1, 1, 9, -8.75, 89.18, 1, 1, 9, -37.72, 84.29, 1, 3, 9, 53.42, 100.64, 0.00656, 27, -7.1, 13.93, 0.75552, 10, 40.50999, -10, 0.23791, 2, 27, -33.81, 32.21, 0.17777, 10, 13.79, 8.27, 0.82222, 2, 9, -2.54, 120.54, 0.02356, 10, -15.45, 9.89, 0.97643, 1, 9, 13.31, 86.54, 1, 1, 9, 13.75, 33.59, 1, 1, 9, -34.46, 60.21, 1, 1, 9, -28, 31.81, 1, 1, 9, 40.25, 28.45, 1 ], "hull": 13, "edges": [ 0, 24, 24, 22, 22, 20, 20, 18, 16, 18, 16, 14, 6, 26, 28, 30, 30, 16, 0, 2, 2, 4, 4, 6, 4, 32, 32, 34, 34, 36, 36, 18, 10, 12, 12, 14, 26, 38, 38, 28, 38, 34, 34, 24, 12, 40, 40, 38, 6, 8, 8, 10 ], "width": 172, @@ -517,7 +517,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ @@ -926,7 +926,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ @@ -1884,7 +1884,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ @@ -2449,7 +2449,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ @@ -3298,7 +3298,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ @@ -3841,7 +3841,7 @@ ] } }, - "ffd": { + "deform": { "default": { "body": { "body": [ diff --git a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.png.meta b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.png.meta index f03267cea..cf416725c 100644 --- a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.png.meta +++ b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 8d970daea81f33648ae2d84ab59c88d4 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Atlas.asset b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Atlas.asset index 185ea4c70..dc4bd66b2 100644 Binary files a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Material.mat b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Material.mat index b344b46dd..28302dc4c 100644 Binary files a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Material.mat and b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_SkeletonData.asset index eb82e98aa..2d6cadebd 100644 Binary files a/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Hero/hero-mesh_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy.prefab b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy.prefab index 3828cb89e..cc2ea39d4 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy.prefab and b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy.prefab differ diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.json b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.json index 41815f4bb..95c560d29 100644 --- a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.json +++ b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.json @@ -1,22 +1,22 @@ { -"skeleton": { "hash": "VwRlHLlX3k1oQzXmdPiYJ828MGo", "spine": "2.1.27", "width": 157.46, "height": 364.95, "images": "" }, +"skeleton": { "hash": "FFV4kkOez2yiP1Fs81cfDffboO0", "spine": "3.3.07", "width": 157.46, "height": 364.91, "images": "" }, "bones": [ { "name": "root" }, { "name": "hip", "parent": "root", "x": -0.79, "y": 91.41 }, - { "name": "L-thigh", "parent": "hip", "length": 29.76, "x": 17.31, "y": -5.19, "rotation": -81.94 }, - { "name": "R-thigh", "parent": "hip", "length": 29.49, "x": -18.18, "y": -6.06, "rotation": -93.15 }, - { "name": "abdomen", "parent": "hip", "length": 33.49, "y": -0.1, "rotation": 89.54 }, - { "name": "L-foot", "parent": "L-thigh", "length": 37.25, "x": 37.35, "y": -1.78, "rotation": -6.29 }, - { "name": "R-foot", "parent": "R-thigh", "length": 39.98, "x": 36.41, "y": 0.27, "rotation": -1.8 }, + { "name": "abdomen", "parent": "hip", "length": 33.49, "rotation": 89.54, "y": -0.1 }, { "name": "chest", "parent": "abdomen", "length": 29.58, "x": 38.07, "y": 0.72 }, - { "name": "L-arm", "parent": "chest", "length": 32.67, "x": 24.63, "y": -16.69, "rotation": -121.22 }, - { "name": "R-arm", "parent": "chest", "length": 36.76, "x": 26, "y": 13.63, "rotation": 133.37 }, - { "name": "head", "parent": "chest", "length": 94.23, "x": 41.01, "y": -0.1, "rotation": -2.25 }, - { "name": "L-forearm", "parent": "L-arm", "length": 33.69, "x": 39.09, "y": -2.34, "rotation": -12.09 }, - { "name": "R-forearm", "parent": "R-arm", "length": 36.13, "x": 41.65, "y": 0.28, "rotation": 2.72 }, - { "name": "scalp", "parent": "head", "length": 31.94, "x": 129.34, "y": 15.1, "rotation": -29.89 }, - { "name": "hair1", "parent": "scalp", "length": 23, "x": 36.51, "y": 4.12, "rotation": 68.48 }, - { "name": "hair2", "parent": "hair1", "length": 23.49, "x": 29.03, "y": 1.58, "rotation": 59.55 } + { "name": "L-arm", "parent": "chest", "length": 32.66, "rotation": -121.22, "x": 24.63, "y": -16.69 }, + { "name": "L-thigh", "parent": "hip", "length": 29.76, "rotation": -81.94, "x": 17.31, "y": -5.19 }, + { "name": "L-foot", "parent": "L-thigh", "length": 37.25, "rotation": -6.29, "x": 37.34, "y": -1.78 }, + { "name": "L-forearm", "parent": "L-arm", "length": 33.68, "rotation": -12.09, "x": 39.09, "y": -2.33 }, + { "name": "R-arm", "parent": "chest", "length": 36.75, "rotation": 133.37, "x": 26, "y": 13.63 }, + { "name": "R-thigh", "parent": "hip", "length": 29.49, "rotation": -93.15, "x": -18.18, "y": -6.06 }, + { "name": "R-foot", "parent": "R-thigh", "length": 39.98, "rotation": -1.8, "x": 36.41, "y": 0.27 }, + { "name": "R-forearm", "parent": "R-arm", "length": 36.13, "rotation": 2.72, "x": 41.65, "y": 0.28 }, + { "name": "head", "parent": "chest", "length": 94.23, "rotation": -2.25, "x": 41.01, "y": -0.1 }, + { "name": "scalp", "parent": "head", "length": 31.94, "rotation": -29.89, "x": 129.34, "y": 15.1 }, + { "name": "hair1", "parent": "scalp", "length": 23, "rotation": 68.48, "x": 36.5, "y": 4.12 }, + { "name": "hair2", "parent": "hair1", "length": 23.49, "rotation": 59.55, "x": 29.03, "y": 1.58 } ], "slots": [ { "name": "R-arm", "bone": "R-arm", "attachment": "arm" }, @@ -30,10 +30,10 @@ "default": { "L-arm": { "arm": { - "type": "skinnedmesh", - "uvs": [ 1, 0.16417, 0.90367, 0.30177, 0.80735, 0.43937, 0.75345, 0.50663, 0.71536, 0.55416, 0.6656, 0.61625, 0.63233, 0.65777, 0.59417, 0.7054, 0.45366, 0.8527, 0.31315, 1, 0.15657, 1, 0, 1, 0, 0.71457, 0.13235, 0.59073, 0.2647, 0.46689, 0.34675, 0.39836, 0.39153, 0.36096, 0.43007, 0.32876, 0.4689, 0.29633, 0.52302, 0.25112, 0.59417, 0.19169, 0.72983, 0.09584, 0.86549, 0, 1, 0, 0.15702, 0.83582, 0.46721, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.38429 ], + "type": "mesh", + "uvs": [ 1, 0.16417, 0.90367, 0.30177, 0.80735, 0.43937, 0.75345, 0.50663, 0.71536, 0.55416, 0.6656, 0.61624, 0.63233, 0.65777, 0.59416, 0.7054, 0.45366, 0.8527, 0.31314, 1, 0.15657, 1, 0, 1, 0, 0.71457, 0.13235, 0.59073, 0.2647, 0.46689, 0.34675, 0.39836, 0.39153, 0.36096, 0.43007, 0.32876, 0.4689, 0.29633, 0.52302, 0.25112, 0.59416, 0.19169, 0.72983, 0.09584, 0.86549, 0, 1, 0, 0.15702, 0.83582, 0.46721, 0.5156, 0.78995, 0.22527, 0.34029, 0.70958, 0.62888, 0.38429 ], "triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 27, 14, 7, 25, 6, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 1, 26, 0, 20, 21, 26, 26, 22, 0, 26, 21, 22, 22, 23, 0, 25, 14, 15 ], - "vertices": [ 1, 8, -11.38, 11.4, 1, 1, 8, 0.99, 11.79, 1, 1, 8, 13.36, 12.17, 1, 1, 8, 19.69, 11.97, 1, 2, 8, 24.16, 11.82, 0.91747, 11, -17.57, 10.72, 0.08252, 2, 8, 30, 11.63, 0.75238, 11, -11.82, 11.76, 0.24761, 2, 8, 33.91, 11.5, 0.44551, 11, -7.97, 12.46, 0.55448, 2, 8, 38.39, 11.36, 0.2127, 11, -3.56, 13.25, 0.78729, 2, 8, 53.17, 9.6, 0.07308, 11, 11.25, 14.64, 0.92691, 2, 8, 67.94999, 7.85, 0.00873, 11, 26.07, 16.03, 0.99126, 1, 11, 34.25, 8.51, 1, 1, 11, 42.44, 0.99, 1, 1, 11, 27.96, -14.77, 1, 2, 8, 50.32, -20.36, 0.05493, 11, 14.75, -15.25, 0.94506, 2, 8, 37.31, -18.06, 0.23231, 11, 1.55, -15.73, 0.76768, 2, 8, 29.75, -16.27, 0.47867, 11, -6.21, -15.58, 0.52132, 2, 8, 25.63, -15.3, 0.71242, 11, -10.43999, -15.49, 0.28757, 2, 8, 22.07, -14.47, 0.81875, 11, -14.09, -15.42, 0.18124, 2, 8, 18.5, -13.62, 0.9506, 11, -17.77, -15.34, 0.04939, 2, 8, 13.51, -12.45, 0.97879, 11, -22.89, -15.24, 0.0212, 2, 8, 6.95, -10.9, 0.99703, 11, -29.63, -15.11, 0.00296, 1, 8, -4.46999, -7.2, 1, 1, 8, -15.9, -3.49, 1, 1, 8, -21.42, 4.29, 1, 1, 11, 25.9, -0.52999, 1, 2, 8, 31.98, -4.21, 0.80128, 11, -6.55, -3.32, 0.19871, 1, 8, 0.97, 1.89, 1, 1, 11, 9.91, 1.29, 1, 1, 8, 17.31, -0.54, 1 ], + "vertices": [ 1, 4, -11.38, 11.4, 1, 1, 4, 0.99, 11.79, 1, 1, 4, 13.36, 12.17, 1, 1, 4, 19.69, 11.97, 1, 2, 4, 24.16, 11.82, 0.91747, 7, -17.57, 10.72, 0.08252, 2, 4, 30, 11.63, 0.75238, 7, -11.82, 11.76, 0.24761, 2, 4, 33.91, 11.5, 0.44551, 7, -7.97, 12.46, 0.55448, 2, 4, 38.39, 11.36, 0.2127, 7, -3.56, 13.25, 0.78729, 2, 4, 53.17, 9.6, 0.07308, 7, 11.25, 14.64, 0.92691, 2, 4, 67.94, 7.85, 0.00873, 7, 26.07, 16.03, 0.99126, 1, 7, 34.25, 8.51, 1, 1, 7, 42.44, 0.99, 1, 1, 7, 27.96, -14.77, 1, 2, 4, 50.32, -20.36, 0.05493, 7, 14.75, -15.25, 0.94506, 2, 4, 37.31, -18.06, 0.23231, 7, 1.55, -15.73, 0.76768, 2, 4, 29.75, -16.27, 0.47867, 7, -6.21, -15.58, 0.52132, 2, 4, 25.63, -15.3, 0.71242, 7, -10.43, -15.49, 0.28757, 2, 4, 22.07, -14.47, 0.81875, 7, -14.09, -15.42, 0.18124, 2, 4, 18.5, -13.62, 0.9506, 7, -17.77, -15.34, 0.04939, 2, 4, 13.51, -12.45, 0.97879, 7, -22.89, -15.24, 0.0212, 2, 4, 6.95, -10.9, 0.99703, 7, -29.63, -15.11, 0.00296, 1, 4, -4.46, -7.2, 1, 1, 4, -15.9, -3.49, 1, 1, 4, -21.42, 4.29, 1, 1, 7, 25.9, -0.52, 1, 2, 4, 31.98, -4.21, 0.80128, 7, -6.55, -3.32, 0.19871, 1, 4, 0.97, 1.89, 1, 1, 7, 9.91, 1.29, 1, 1, 4, 17.31, -0.54, 1 ], "hull": 24, "edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ], "width": 71, @@ -42,10 +42,10 @@ }, "L-leg": { "leg": { - "type": "skinnedmesh", - "uvs": [ 1, 0.23128, 1, 0.29497, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65975, 1, 0.71765, 1, 0.87399, 0.73923, 1, 0.2297, 1, 0, 0.89715, 0, 0.64817, 0.01978, 0.59915, 0.08516, 0.43711, 0.10541, 0.38693, 0.13057, 0.32458, 0.15317, 0.26858, 0.17799, 0.20706, 0.26155, 0, 1, 0, 0.61185, 0.12127, 0.51631, 0.54395 ], + "type": "mesh", + "uvs": [ 1, 0.23128, 1, 0.29497, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65975, 1, 0.71765, 1, 0.87399, 0.73923, 1, 0.2297, 1, 0, 0.89715, 0, 0.64817, 0.01978, 0.59915, 0.08516, 0.43711, 0.10541, 0.38693, 0.13056, 0.32458, 0.15317, 0.26857, 0.17799, 0.20706, 0.26155, 0, 1, 0, 0.61185, 0.12127, 0.5163, 0.54395 ], "triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ], - "vertices": [ 1, 2, 11.02, 15.14, 1, 1, 2, 17.31, 14.75, 1, 2, 2, 24.75, 14.29, 0.95576, 5, -14.28, 14.6, 0.04423, 2, 2, 32.18999, 13.82, 0.71873, 5, -6.84, 14.95, 0.28126, 2, 2, 38.48, 13.43, 0.37176, 5, -0.54, 15.25, 0.62822, 2, 2, 53.36, 12.51, 0.00735, 5, 14.34, 15.96, 0.99264, 1, 5, 20.06, 16.23, 1, 1, 5, 35.52, 16.96999, 1, 1, 5, 48.43, 8.18, 1, 1, 5, 49.3, -10.13, 1, 1, 5, 39.52, -18.87, 1, 2, 2, 49.98, -23.34, 0.00312, 5, 14.9, -20.04, 0.99687, 2, 2, 45.18, -22.33, 0.02542, 5, 10.02, -19.56, 0.97457, 2, 2, 29.31, -18.99, 0.4709, 5, -6.1, -17.98, 0.52909, 2, 2, 24.4, -17.95, 0.69967, 5, -11.1, -17.48, 0.30032, 2, 2, 18.29, -16.66, 0.89625, 5, -17.31, -16.87, 0.10374, 2, 2, 12.81, -15.51, 0.97789, 5, -22.89, -16.32, 0.0221, 1, 2, 6.79, -14.24, 1, 1, 2, -13.48, -9.96, 1, 1, 2, -11.83, 16.56, 1, 1, 2, -0.71, 1.87, 1, 1, 5, 3.71, -1.97, 1 ], + "vertices": [ 1, 5, 11.02, 15.14, 1, 1, 5, 17.31, 14.75, 1, 2, 5, 24.75, 14.29, 0.95576, 6, -14.28, 14.6, 0.04423, 2, 5, 32.18, 13.82, 0.71873, 6, -6.84, 14.95, 0.28126, 2, 5, 38.48, 13.43, 0.37176, 6, -0.54, 15.25, 0.62822, 2, 5, 53.36, 12.51, 0.00735, 6, 14.34, 15.96, 0.99264, 1, 6, 20.06, 16.23, 1, 1, 6, 35.52, 16.95999, 1, 1, 6, 48.43, 8.18, 1, 1, 6, 49.3, -10.13, 1, 1, 6, 39.52, -18.87, 1, 2, 5, 49.98, -23.34, 0.00312, 6, 14.9, -20.04, 0.99687, 2, 5, 45.18, -22.33, 0.02542, 6, 10.02, -19.56, 0.97457, 2, 5, 29.31, -18.99, 0.4709, 6, -6.1, -17.98, 0.52909, 2, 5, 24.4, -17.95, 0.69967, 6, -11.1, -17.48, 0.30032, 2, 5, 18.29, -16.66, 0.89625, 6, -17.31, -16.87, 0.10374, 2, 5, 12.81, -15.51, 0.97789, 6, -22.89, -16.32, 0.0221, 1, 5, 6.79, -14.24, 1, 1, 5, -13.48, -9.96, 1, 1, 5, -11.83, 16.56, 1, 1, 5, -0.71, 1.87, 1, 1, 6, 3.71, -1.97, 1 ], "hull": 20, "edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ], "width": 36, @@ -54,10 +54,10 @@ }, "R-arm": { "arm": { - "type": "skinnedmesh", - "uvs": [ 1, 0.16417, 0.90367, 0.30177, 0.80735, 0.43937, 0.75345, 0.50663, 0.71536, 0.55416, 0.6656, 0.61625, 0.63233, 0.65777, 0.59417, 0.7054, 0.45366, 0.8527, 0.31315, 1, 0.15657, 1, 0, 1, 0, 0.71457, 0.13235, 0.59073, 0.2647, 0.46689, 0.34675, 0.39836, 0.39153, 0.36096, 0.43007, 0.32876, 0.4689, 0.29633, 0.52302, 0.25112, 0.59417, 0.19169, 0.72983, 0.09584, 0.86549, 0, 1, 0, 0.15702, 0.83582, 0.46721, 0.51561, 0.78995, 0.22527, 0.34029, 0.70958, 0.62889, 0.38429 ], + "type": "mesh", + "uvs": [ 1, 0.16417, 0.90367, 0.30177, 0.80735, 0.43937, 0.75345, 0.50663, 0.71536, 0.55416, 0.6656, 0.61624, 0.63233, 0.65777, 0.59416, 0.7054, 0.45366, 0.8527, 0.31314, 1, 0.15657, 1, 0, 1, 0, 0.71457, 0.13235, 0.59073, 0.2647, 0.46689, 0.34675, 0.39836, 0.39153, 0.36096, 0.43007, 0.32876, 0.4689, 0.29633, 0.52302, 0.25112, 0.59416, 0.19169, 0.72983, 0.09584, 0.86549, 0, 1, 0, 0.15702, 0.83582, 0.46721, 0.5156, 0.78995, 0.22527, 0.34029, 0.70958, 0.62888, 0.38429 ], "triangles": [ 10, 24, 9, 9, 27, 8, 9, 24, 27, 10, 11, 24, 11, 12, 24, 8, 27, 7, 12, 13, 24, 24, 13, 27, 13, 14, 27, 27, 25, 7, 25, 14, 15, 25, 27, 14, 7, 25, 6, 22, 23, 0, 26, 22, 0, 1, 26, 0, 6, 25, 5, 18, 4, 17, 28, 4, 18, 4, 28, 3, 15, 16, 25, 16, 17, 25, 25, 17, 5, 17, 4, 5, 3, 28, 2, 28, 26, 2, 2, 26, 1, 18, 19, 28, 19, 20, 28, 28, 20, 26, 20, 21, 26, 26, 21, 22 ], - "vertices": [ 1, 9, -6.97, 5.02, 1, 1, 9, 5.06, 7.92, 1, 1, 9, 17.09, 10.82, 1, 2, 9, 23.33, 11.91, 0.99563, 12, -17.74, 12.48, 0.00436, 2, 9, 27.74, 12.68, 0.95467, 12, -13.3, 13.04, 0.04532, 2, 9, 33.5, 13.68, 0.75827, 12, -7.5, 13.77, 0.24172, 2, 9, 37.34999, 14.35, 0.53963, 12, -3.63, 14.26, 0.46036, 2, 9, 41.75999, 15.12, 0.29362, 12, 0.81, 14.82, 0.70637, 2, 9, 56.59, 16.42, 3.9E-4, 12, 15.69, 15.4, 0.9996, 1, 12, 30.56, 15.99, 1, 1, 12, 38.33, 8.04, 1, 1, 12, 46.1, 0.1, 1, 1, 12, 30.79, -14.86, 1, 2, 9, 59.92, -13.5, 4.7E-4, 12, 17.58, -14.63, 0.99952, 2, 9, 46.71, -13.9, 0.17384, 12, 4.37, -14.41, 0.82615, 2, 9, 38.93999, -13.69, 0.56829, 12, -3.36, -13.83, 0.4317, 2, 9, 34.71, -13.58, 0.79613, 12, -7.59, -13.52, 0.20386, 2, 9, 31.06, -13.49, 0.92361, 12, -11.23, -13.25, 0.07638, 2, 9, 27.38, -13.39, 0.98277, 12, -14.9, -12.98, 0.01722, 1, 9, 22.26, -13.26, 1, 1, 9, 15.53, -13.08, 1, 1, 9, 3.58, -11.78, 1, 1, 9, -8.35999, -10.49, 1, 1, 9, -15.36, -3.99, 1, 1, 12, 29.5, -0.52999, 1, 2, 9, 38.66999, -1.43, 0.57762, 12, -3.06, -1.57, 0.42237, 1, 9, 7.06, -1.77, 1, 1, 12, 13.64, 2.15, 1, 1, 9, 23.56, -0.82, 1 ], + "vertices": [ 1, 8, -6.97, 5.02, 1, 1, 8, 5.06, 7.92, 1, 1, 8, 17.09, 10.82, 1, 2, 8, 23.33, 11.91, 0.99563, 11, -17.74, 12.48, 0.00436, 2, 8, 27.74, 12.68, 0.95467, 11, -13.3, 13.04, 0.04532, 2, 8, 33.5, 13.68, 0.75827, 11, -7.5, 13.77, 0.24172, 2, 8, 37.34, 14.35, 0.53963, 11, -3.63, 14.26, 0.46036, 2, 8, 41.75, 15.12, 0.29362, 11, 0.81, 14.82, 0.70637, 2, 8, 56.59, 16.42, 3.9E-4, 11, 15.69, 15.4, 0.9996, 1, 11, 30.56, 15.99, 1, 1, 11, 38.33, 8.04, 1, 1, 11, 46.1, 0.1, 1, 1, 11, 30.79, -14.86, 1, 2, 8, 59.92, -13.5, 4.7E-4, 11, 17.58, -14.63, 0.99952, 2, 8, 46.71, -13.9, 0.17384, 11, 4.37, -14.41, 0.82615, 2, 8, 38.93, -13.69, 0.56829, 11, -3.36, -13.83, 0.4317, 2, 8, 34.71, -13.58, 0.79613, 11, -7.59, -13.52, 0.20386, 2, 8, 31.06, -13.49, 0.92361, 11, -11.23, -13.25, 0.07638, 2, 8, 27.38, -13.39, 0.98277, 11, -14.9, -12.98, 0.01722, 1, 8, 22.26, -13.26, 1, 1, 8, 15.53, -13.08, 1, 1, 8, 3.58, -11.78, 1, 1, 8, -8.35, -10.49, 1, 1, 8, -15.36, -3.99, 1, 1, 11, 29.5, -0.52, 1, 2, 8, 38.66, -1.43, 0.57762, 11, -3.06, -1.57, 0.42237, 1, 8, 7.06, -1.77, 1, 1, 11, 13.64, 2.15, 1, 1, 8, 23.56, -0.82, 1 ], "hull": 24, "edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 38, 40, 40, 42, 42, 44, 44, 46, 46, 0, 10, 34, 30, 32, 32, 34, 10, 12, 12, 14, 6, 8, 8, 10, 34, 36, 36, 38, 8, 36 ], "width": 71, @@ -66,10 +66,10 @@ }, "R-leg": { "leg": { - "type": "skinnedmesh", - "uvs": [ 1, 0.23128, 1, 0.29497, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65975, 1, 0.71765, 1, 0.87399, 0.73923, 1, 0.2297, 1, 0, 0.89715, 0, 0.64817, 0.01978, 0.59915, 0.08516, 0.43711, 0.10541, 0.38693, 0.13057, 0.32458, 0.15317, 0.26858, 0.17799, 0.20706, 0.26155, 0, 1, 0, 0.61185, 0.12127, 0.51631, 0.54395 ], + "type": "mesh", + "uvs": [ 1, 0.23128, 1, 0.29497, 1, 0.37025, 1, 0.44552, 1, 0.50921, 1, 0.65975, 1, 0.71765, 1, 0.87399, 0.73923, 1, 0.2297, 1, 0, 0.89715, 0, 0.64817, 0.01978, 0.59915, 0.08516, 0.43711, 0.10541, 0.38693, 0.13056, 0.32458, 0.15317, 0.26857, 0.17799, 0.20706, 0.26155, 0, 1, 0, 0.61185, 0.12127, 0.5163, 0.54395 ], "triangles": [ 21, 13, 4, 21, 4, 5, 12, 13, 21, 12, 21, 5, 12, 5, 6, 11, 12, 6, 9, 10, 11, 11, 6, 9, 6, 8, 9, 7, 8, 6, 20, 18, 19, 20, 19, 0, 17, 18, 20, 17, 20, 0, 17, 0, 1, 16, 17, 1, 16, 1, 2, 15, 16, 2, 15, 2, 3, 14, 15, 3, 14, 3, 4, 13, 14, 4 ], - "vertices": [ 1, 3, 7.41, 14.89, 1, 2, 3, 13.7, 15.23, 0.99431, 6, -23.16, 14.24, 0.00568, 2, 3, 21.14, 15.64, 0.9183, 6, -15.74, 14.88, 0.08169, 2, 3, 28.58, 16.04999, 0.65731, 6, -8.31, 15.53, 0.34268, 2, 3, 34.88, 16.4, 0.33128, 6, -2.03, 16.07, 0.66871, 2, 3, 49.76, 17.21999, 0.004, 6, 12.81, 17.36, 0.99598, 1, 6, 18.52, 17.85, 1, 2, 3, 70.94, 18.39, 0, 6, 33.93999, 19.19, 0.99999, 2, 3, 83.91, 9.7, 0, 6, 47.18, 10.92, 0.99999, 2, 3, 84.92, -8.60999, 0, 6, 48.76, -7.35, 1, 2, 3, 75.21, -17.42, 0, 6, 39.33, -16.46999, 1, 2, 3, 50.6, -18.78, 0.01347, 6, 14.78, -18.6, 0.98652, 2, 3, 45.71, -18.34, 0.05686, 6, 9.88, -18.31, 0.94313, 2, 3, 29.56, -16.87, 0.66681, 6, -6.3, -17.35, 0.33318, 2, 3, 24.56, -16.41, 0.86313, 6, -11.31, -17.04999, 0.13686, 2, 3, 18.35, -15.85, 0.97672, 6, -17.54, -16.68, 0.02327, 2, 3, 12.77, -15.34, 0.99935, 6, -23.13, -16.35, 6.4E-4, 1, 3, 6.64, -14.78, 1, 2, 3, -13.98, -12.91, 0.99999, 6, -49.96, -14.76, 0, 2, 3, -15.45, 13.63, 0.99999, 6, -52.25, 11.72, 0, 2, 3, -2.69, 0.33, 0.99999, 6, -39.09, -1.16, 0, 2, 3, 39.27, -0.79, 0.02734, 6, 2.89, -0.97, 0.97265 ], + "vertices": [ 1, 9, 7.41, 14.89, 1, 2, 9, 13.7, 15.23, 0.99431, 10, -23.16, 14.24, 0.00568, 2, 9, 21.14, 15.64, 0.9183, 10, -15.74, 14.88, 0.08169, 2, 9, 28.58, 16.04, 0.65731, 10, -8.31, 15.53, 0.34268, 2, 9, 34.88, 16.4, 0.33128, 10, -2.03, 16.07, 0.66871, 2, 9, 49.76, 17.20999, 0.004, 10, 12.81, 17.36, 0.99598, 1, 10, 18.52, 17.85, 1, 1, 10, 33.93, 19.19, 0.99999, 1, 10, 47.18, 10.92, 0.99999, 1, 10, 48.76, -7.35, 1, 1, 10, 39.33, -16.45999, 1, 2, 9, 50.6, -18.78, 0.01347, 10, 14.78, -18.6, 0.98652, 2, 9, 45.71, -18.34, 0.05686, 10, 9.88, -18.31, 0.94313, 2, 9, 29.56, -16.87, 0.66681, 10, -6.3, -17.35, 0.33318, 2, 9, 24.56, -16.41, 0.86313, 10, -11.31, -17.04, 0.13686, 2, 9, 18.35, -15.85, 0.97672, 10, -17.54, -16.68, 0.02327, 2, 9, 12.77, -15.34, 0.99935, 10, -23.13, -16.35, 6.4E-4, 1, 9, 6.64, -14.78, 1, 1, 9, -13.98, -12.91, 0.99999, 1, 9, -15.45, 13.63, 0.99999, 1, 9, -2.69, 0.33, 0.99999, 2, 9, 39.27, -0.79, 0.02734, 10, 2.89, -0.97, 0.97265 ], "hull": 20, "edges": [ 36, 38, 20, 22, 18, 20, 16, 18, 16, 14, 22, 24, 24, 10, 10, 12, 12, 14, 12, 22, 24, 26, 10, 8, 26, 8, 8, 6, 26, 28, 6, 28, 28, 30, 6, 4, 30, 4, 4, 2, 30, 32, 2, 32, 32, 34, 34, 36, 2, 0, 0, 38, 34, 0 ], "width": 36, @@ -78,10 +78,10 @@ }, "head": { "head": { - "type": "skinnedmesh", - "uvs": [ 0.60755, 0.01863, 0.64145, 0.03354, 0.70226, 0.06028, 0.76687, 0.08869, 0.80695, 0.14523, 0.84157, 0.19407, 1, 0.41294, 1, 0.78561, 0.67348, 1, 0.38213, 1, 0.13934, 0.8937, 0.07948, 0.78807, 0.05898, 0.75189, 0, 0.6478, 0, 0.40213, 0.15055, 0.27783, 0.25631, 0.21733, 0.28424, 0.20136, 0.31116, 0.18596, 0.32033, 0.16739, 0.32984, 0.14813, 0.3317, 0.12797, 0.33358, 0.1076, 0.29622, 0.08869, 0.21778, 0.06977, 0.2514, 0.03194, 0.32658, 0.01699, 0.3752, 0.00732, 0.41202, 0, 0.45684, 0, 0.49046, 0, 0.53154, 0, 0.56516, 0, 0.55022, 0.1049, 0.46057, 0.06437, 0.38587, 0.05086, 0.31116, 0.04815, 0.54649, 0.17515, 0.35972, 0.28864, 0.14308, 0.41294, 0.13187, 0.57777, 0.24766, 0.43185, 0.43816, 0.37511, 0.59878, 0.3616, 0.78181, 0.43726, 0.8976, 0.53994, 0.87616, 0.37786 ], - "triangles": [ 36, 25, 26, 35, 27, 28, 23, 25, 36, 24, 25, 23, 26, 35, 36, 35, 26, 27, 22, 36, 35, 23, 36, 22, 28, 29, 34, 35, 28, 34, 21, 35, 34, 35, 21, 22, 34, 29, 30, 33, 31, 32, 33, 32, 0, 31, 34, 30, 34, 20, 21, 31, 33, 34, 37, 34, 33, 1, 33, 0, 2, 33, 1, 33, 2, 37, 37, 20, 34, 37, 38, 20, 19, 20, 38, 18, 19, 38, 17, 18, 38, 2, 4, 37, 4, 2, 3, 43, 4, 5, 43, 37, 4, 42, 38, 37, 43, 42, 37, 6, 46, 5, 44, 43, 5, 39, 14, 15, 41, 15, 16, 39, 15, 41, 16, 17, 38, 41, 16, 38, 41, 38, 42, 46, 44, 5, 45, 46, 6, 44, 46, 45, 40, 14, 39, 40, 39, 41, 13, 14, 40, 12, 13, 40, 45, 6, 7, 11, 12, 40, 9, 10, 40, 11, 40, 10, 9, 41, 42, 9, 40, 41, 8, 9, 42, 42, 43, 8, 44, 8, 43, 8, 44, 45, 8, 45, 7 ], - "vertices": [ 1, 14, 17.03, -22.65, 1, 3, 10, 187.59, -11.93, 0.00181, 13, 63.97, 5.58, 0.0238, 14, 11.42, -25.01, 0.97437, 2, 10, 182.37, -21.52, 0.62993, 14, 1.35, -29.25, 0.37005, 3, 10, 176.82, -31.71, 0.82289, 13, 64.49, -16.93, 0.07936, 14, -9.33, -33.75, 0.09774, 3, 10, 165.13, -38.41999, 0.8635, 13, 57.69, -28.57, 0.08155, 14, -22.66, -31.7, 0.05493, 3, 10, 155.03, -44.22, 0.89858, 13, 51.83, -38.63, 0.08345, 14, -34.16999, -29.93, 0.01796, 1, 10, 109.8, -70.69999, 1, 1, 10, 30.83, -74.44, 1, 1, 10, -16.95999, -26.54, 1, 1, 10, -19.08, 18.11, 1, 1, 10, 1.67, 56.39, 1, 1, 10, 23.62, 66.62999, 1, 1, 10, 31.14, 70.12999, 1, 1, 10, 52.77, 80.22, 1, 2, 10, 104.83, 82.69, 0.99073, 13, -54.92, 46.39, 0.00926, 3, 10, 132.26, 60.86, 0.88784, 13, -20.26, 41.13, 0.11168, 15, 48.07, 46.13, 4.7E-4, 4, 10, 145.85, 45.25, 0.85196, 13, -0.71, 34.37, 0.12365, 14, 14.48, 45.72, 0.00832, 15, 30.69, 34.9, 0.01603, 4, 10, 149.43, 41.13, 0.84249, 13, 4.44999, 32.58, 0.12681, 14, 14.71, 40.25999, 0.01053, 15, 26.1, 31.93, 0.02015, 4, 10, 152.89, 37.16, 0.83335, 13, 9.43, 30.86, 0.12986, 14, 14.94, 35, 0.01265, 15, 21.68, 29.07, 0.02412, 4, 10, 156.9, 35.93999, 0.60487, 13, 13.5, 31.8, 0.21602, 14, 17.31, 31.55, 0.05833, 15, 19.9, 25.28, 0.12076, 4, 10, 161.05, 34.68, 0.368, 13, 17.73, 32.77, 0.30535, 14, 19.76, 27.97, 0.10568, 15, 18.06, 21.35, 0.22096, 4, 10, 165.33, 34.59999, 0.18496, 13, 21.49, 34.83, 0.23674, 14, 23.06, 25.23, 0.12789, 15, 17.37, 17.12, 0.45039, 3, 13, 25.28, 36.91999, 0.1674, 14, 26.39, 22.46, 0.15034, 15, 16.67, 12.85, 0.68225, 3, 13, 25.58, 43.91, 0.03309, 14, 33, 24.76, 0.02128, 15, 21.99, 8.31, 0.94562, 1, 15, 33.59999, 3.17, 1, 1, 15, 27.7, -4.32, 1, 1, 15, 15.91, -6.38, 1, 1, 15, 8.29, -7.71, 1, 1, 15, 2.51, -8.72, 1, 2, 14, 33.79, -6.23, 0.33703, 15, -4.32, -8.06, 0.66296, 2, 14, 30.77, -10.41, 0.58777, 15, -9.46, -7.57, 0.41222, 2, 14, 27.07, -15.52, 0.81446, 15, -15.74, -6.97, 0.18553, 2, 14, 24.05, -19.7, 0.97838, 15, -20.87, -6.48, 0.02161, 1, 14, 7.36, -4.8, 1, 1, 14, 22.39, 1.29999, 1, 1, 15, 7.54, 1.63, 1, 3, 13, 34.06, 46.61, 0.01617, 14, 38.62, 17.86, 0.00459, 15, 18.89, -0.02, 0.97922, 1, 13, 30.81, 1.67, 1, 3, 10, 131.49, 28.69, 0.99827, 14, -7.07, 41.73, 7.0E-5, 15, 16.33, 51.46, 0.00165, 1, 10, 103.58, 60.65, 1, 1, 10, 68.57, 60.71, 1, 1, 10, 100.33, 44.43, 1, 1, 10, 113.74, 15.79, 1, 1, 10, 117.77, -8.68, 1, 1, 10, 103.06, -37.5, 1, 1, 10, 82.15, -56.28, 1, 3, 10, 116.33, -51.36, 0.97904, 13, 21.84, -64.11, 0.01724, 14, -68.86, -11.37, 0.00371 ], + "type": "mesh", + "uvs": [ 0.60755, 0.01863, 0.64145, 0.03354, 0.70226, 0.06028, 0.76687, 0.08869, 0.80695, 0.14523, 0.84157, 0.19407, 1, 0.41294, 1, 0.78561, 0.67348, 1, 0.38213, 1, 0.13934, 0.8937, 0.07948, 0.78807, 0.05898, 0.75189, 0, 0.6478, 0, 0.40213, 0.15054, 0.27783, 0.2563, 0.21733, 0.28424, 0.20136, 0.31116, 0.18596, 0.32033, 0.16739, 0.32984, 0.14813, 0.3317, 0.12797, 0.33358, 0.1076, 0.29622, 0.08869, 0.21778, 0.06977, 0.2514, 0.03193, 0.32657, 0.01699, 0.3752, 0.00732, 0.41202, 0, 0.45684, 0, 0.49046, 0, 0.53153, 0, 0.56515, 0, 0.55022, 0.1049, 0.46057, 0.06437, 0.38587, 0.05086, 0.31116, 0.04815, 0.54649, 0.17515, 0.35972, 0.28864, 0.14308, 0.41294, 0.13187, 0.57777, 0.24766, 0.43185, 0.43816, 0.37511, 0.59877, 0.3616, 0.78181, 0.43726, 0.8976, 0.53994, 0.87616, 0.37786 ], + "triangles": [ 36, 25, 26, 35, 27, 28, 23, 25, 36, 24, 25, 23, 26, 35, 36, 35, 26, 27, 22, 36, 35, 23, 36, 22, 28, 29, 34, 35, 28, 34, 21, 35, 34, 35, 21, 22, 37, 20, 34, 37, 38, 20, 19, 20, 38, 18, 19, 38, 17, 18, 38, 2, 4, 37, 4, 2, 3, 43, 4, 5, 43, 37, 4, 42, 38, 37, 43, 42, 37, 6, 46, 5, 44, 43, 5, 39, 14, 15, 41, 15, 16, 39, 15, 41, 16, 17, 38, 41, 16, 38, 41, 38, 42, 46, 44, 5, 45, 46, 6, 44, 46, 45, 40, 14, 39, 40, 39, 41, 13, 14, 40, 12, 13, 40, 45, 6, 7, 11, 12, 40, 9, 10, 40, 11, 40, 10, 9, 41, 42, 9, 40, 41, 8, 9, 42, 42, 43, 8, 44, 8, 43, 8, 44, 45, 8, 45, 7, 34, 29, 30, 33, 31, 32, 33, 32, 0, 31, 34, 30, 34, 20, 21, 31, 33, 34, 37, 34, 33, 1, 33, 0, 2, 33, 1, 33, 2, 37 ], + "vertices": [ 1, 14, 17.03, -22.65, 1, 3, 14, 11.42, -25.01, 0.97437, 12, 187.59, -11.93, 0.00181, 13, 63.97, 5.58, 0.0238, 2, 14, 1.35, -29.25, 0.37005, 12, 182.37, -21.52, 0.62993, 3, 14, -9.33, -33.75, 0.09774, 12, 176.82, -31.71, 0.82289, 13, 64.49, -16.93, 0.07936, 3, 14, -22.66, -31.7, 0.05493, 12, 165.13, -38.41, 0.8635, 13, 57.69, -28.57, 0.08155, 3, 14, -34.16, -29.93, 0.01796, 12, 155.03, -44.22, 0.89858, 13, 51.83, -38.63, 0.08345, 1, 12, 109.8, -70.69, 1, 1, 12, 30.83, -74.44, 1, 1, 12, -16.95, -26.54, 1, 1, 12, -19.08, 18.11, 1, 1, 12, 1.67, 56.39, 1, 1, 12, 23.62, 66.62, 1, 1, 12, 31.14, 70.12, 1, 1, 12, 52.77, 80.22, 1, 2, 12, 104.83, 82.69, 0.99073, 13, -54.92, 46.39, 0.00926, 3, 12, 132.25, 60.86, 0.88784, 13, -20.26, 41.13, 0.11168, 15, 48.07, 46.13, 4.7E-4, 4, 14, 14.48, 45.72, 0.00832, 12, 145.85, 45.25, 0.85196, 13, -0.71, 34.37, 0.12365, 15, 30.69, 34.9, 0.01603, 4, 14, 14.71, 40.25, 0.01053, 12, 149.42, 41.13, 0.84249, 13, 4.44, 32.58, 0.12681, 15, 26.1, 31.93, 0.02015, 4, 14, 14.94, 35, 0.01265, 12, 152.89, 37.16, 0.83335, 13, 9.43, 30.86, 0.12986, 15, 21.68, 29.07, 0.02412, 4, 14, 17.31, 31.55, 0.05833, 12, 156.89, 35.93, 0.60487, 13, 13.5, 31.8, 0.21602, 15, 19.9, 25.28, 0.12076, 4, 14, 19.76, 27.97, 0.10568, 12, 161.05, 34.68, 0.368, 13, 17.73, 32.77, 0.30535, 15, 18.06, 21.35, 0.22096, 4, 14, 23.06, 25.23, 0.12789, 12, 165.33, 34.59, 0.18496, 13, 21.49, 34.83, 0.23674, 15, 17.37, 17.12, 0.45039, 3, 14, 26.39, 22.46, 0.15034, 13, 25.28, 36.91, 0.1674, 15, 16.67, 12.85, 0.68225, 3, 14, 33, 24.76, 0.02128, 13, 25.58, 43.91, 0.03309, 15, 21.99, 8.31, 0.94562, 1, 15, 33.59, 3.17, 1, 1, 15, 27.7, -4.32, 1, 1, 15, 15.91, -6.38, 1, 1, 15, 8.29, -7.71, 1, 1, 15, 2.51, -8.72, 1, 2, 14, 33.79, -6.23, 0.33703, 15, -4.32, -8.06, 0.66296, 2, 14, 30.77, -10.41, 0.58777, 15, -9.46, -7.57, 0.41222, 2, 14, 27.07, -15.52, 0.81446, 15, -15.74, -6.97, 0.18553, 2, 14, 24.05, -19.7, 0.97838, 15, -20.87, -6.48, 0.02161, 1, 14, 7.36, -4.8, 1, 1, 14, 22.39, 1.29, 1, 1, 15, 7.54, 1.63, 1, 3, 14, 38.62, 17.86, 0.00459, 13, 34.06, 46.61, 0.01617, 15, 18.89, -0.02, 0.97922, 1, 13, 30.81, 1.67, 1, 3, 14, -7.07, 41.73, 7.0E-5, 12, 131.49, 28.69, 0.99827, 15, 16.33, 51.46, 0.00165, 1, 12, 103.58, 60.65, 1, 1, 12, 68.57, 60.71, 1, 1, 12, 100.33, 44.43, 1, 1, 12, 113.74, 15.79, 1, 1, 12, 117.77, -8.68, 1, 1, 12, 103.06, -37.5, 1, 1, 12, 82.15, -56.28, 1, 3, 14, -68.86, -11.37, 0.00371, 12, 116.33, -51.36, 0.97904, 13, 21.84, -64.11, 0.01724 ], "hull": 33, "edges": [ 16, 14, 16, 18, 18, 20, 26, 28, 28, 30, 44, 46, 46, 48, 48, 50, 14, 12, 10, 12, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62, 62, 64, 2, 0, 0, 64, 2, 4, 4, 6, 20, 22, 22, 24, 24, 26, 80, 82, 82, 84, 84, 86, 86, 88, 88, 90, 90, 12, 80, 26, 34, 36, 30, 32, 32, 34, 36, 38, 38, 40, 40, 42, 42, 44, 12, 92, 6, 8, 8, 10 ], "width": 136, @@ -89,19 +89,21 @@ }, "ragdoll": { "type": "boundingbox", - "vertices": [ -14.19607, -1.49276, -7.91528, -29.96175, 23.08404, -59.72487, 60.33676, -65.35634, 95.9493, -71.06551, 150.43092, -41.36028, 163.83543, 5.30173, 162.47502, 34.00399, 115.66124, 67.94895, 85.4782, 80.49074, 48.92517, 71.36101, 11.9019, 54.81194, -9.19035, 31.6207 ] + "vertexCount": 13, + "vertices": [ -14.19, -1.49, -7.91, -29.96, 23.08, -59.72, 60.33, -65.35, 95.94, -71.06, 150.43, -41.36, 163.83, 5.3, 162.47, 34, 115.66, 67.94, 85.47, 80.49, 48.92, 71.36, 11.9, 54.81, -9.18999, 31.62 ] } }, "torso": { "ragdoll": { "type": "boundingbox", - "vertices": [ 0.62625, -28.95774, 35.77471, -25.70054, 37.14599, 27.3694, 1.96002, 28.88128 ] + "vertexCount": 4, + "vertices": [ 0.62, -28.95, 35.77, -25.7, 37.14, 27.36, 1.96, 28.88 ] }, "torso": { - "type": "skinnedmesh", - "uvs": [ 0.87097, 0.13351, 1, 0.26702, 1, 0.45027, 1, 0.63351, 1, 0.81675, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.72402, 0, 0.44804, 0.09822, 0.22402, 0.19645, 0, 0.4692, 0, 0.74194, 0, 0.58868, 0.13131, 0.40099, 0.46062, 0.83539, 0.50155, 0.42394, 0.26749, 0.36228, 0.63165, 0.58838, 0.76773, 0.71972, 0.25772, 0.84057, 0.76485, 0.57726, 0.50305, 0.24069, 0.44015, 0.19158, 0.80079, 0.29694, 0.12288, 0.37842, 0.84005, 0.71037, 0.63432, 0.15888, 0.60895 ], - "triangles": [ 8, 26, 28, 8, 28, 7, 9, 26, 8, 9, 10, 26, 23, 4, 5, 6, 23, 5, 7, 21, 6, 6, 21, 23, 23, 3, 4, 22, 19, 16, 22, 0, 1, 19, 14, 16, 19, 27, 14, 22, 15, 0, 22, 16, 15, 12, 13, 27, 16, 14, 15, 27, 13, 14, 22, 24, 19, 1, 18, 22, 25, 27, 19, 25, 12, 27, 17, 19, 24, 24, 22, 18, 17, 25, 19, 7, 28, 21, 26, 20, 28, 28, 20, 21, 10, 30, 26, 26, 30, 20, 20, 24, 21, 21, 29, 23, 21, 24, 29, 29, 18, 23, 23, 18, 3, 10, 11, 30, 29, 24, 18, 18, 2, 3, 30, 25, 20, 20, 17, 24, 20, 25, 17, 30, 11, 25, 2, 18, 1, 11, 12, 25 ], - "vertices": [ 1, 7, 31.68, -23.15, 1, 2, 4, 57.14, -30.52, 0.39506, 7, 19.06, -31.25, 0.60493, 2, 4, 39.73, -30.66, 0.60493, 7, 1.66, -31.38, 0.39506, 2, 4, 22.33, -30.79, 0.79012, 7, -15.74, -31.52, 0.20987, 1, 2, -7.76, 14.88, 1, 1, 2, 9.47, 12.45, 1, 1, 2, 7.3, -2.89, 1, 2, 2, 5.13, -18.24, 0.488, 3, 5.76, 18.5, 0.51199, 2, 2, 2.96, -33.59, 0.16266, 3, 6.61, 3.02, 0.83733, 3, 4, -12.97, 30.92, 0.26337, 7, -51.04, 30.19, 0.06995, 3, 7.46, -12.45, 0.66666, 1, 3, -18.70999, -13.88, 1, 2, 4, 39.46, 31.33, 0.60493, 7, 1.38, 30.6, 0.39506, 2, 4, 60.79, 25.41, 0.39506, 7, 22.71, 24.68, 0.60493, 1, 7, 44.04, 18.76, 1, 1, 7, 44.17, 1.85, 1, 1, 7, 44.3, -15.05, 1, 1, 7, 31.75, -5.65, 1, 2, 4, 38.46, 6.46, 0.55198, 7, 0.38, 5.73, 0.448, 2, 4, 34.78, -20.49, 0.55198, 7, -3.29, -21.22, 0.448, 1, 7, 18.74, 4.46, 1, 1, 4, 22.19, 8.72999, 1, 2, 4, 9.37, -5.38, 0.52, 2, -15.94, -9.72, 0.48, 1, 7, 19.81, -13.86, 1, 2, 4, 9.77, -21.01, 0.52, 2, -14.02, 5.79, 0.48, 2, 4, 34.50999, -4.48999, 0.55198, 7, -3.55, -5.21999, 0.448, 2, 4, 40.32, 16.42, 0.55198, 7, 2.25, 15.69, 0.448, 2, 4, 6.04, 19.19, 0.584, 3, -12.08, -1.62, 0.41599, 1, 7, 32.41, 12.44, 1, 2, 4, 2.4, 7.58, 0.584, 3, -8.99, 10.14, 0.41599, 1, 4, 22.11, -12.84, 1, 1, 4, 24.25, 21.36, 1 ], + "type": "mesh", + "uvs": [ 0.87097, 0.1335, 1, 0.26701, 1, 0.45027, 1, 0.63351, 1, 0.81675, 1, 1, 0.75, 1, 0.5, 1, 0.25, 1, 0, 1, 0, 0.72402, 0, 0.44804, 0.09822, 0.22402, 0.19645, 0, 0.4692, 0, 0.74194, 0, 0.58868, 0.13131, 0.40099, 0.46062, 0.83539, 0.50155, 0.42394, 0.26749, 0.36228, 0.63164, 0.58837, 0.76773, 0.71972, 0.25772, 0.84057, 0.76485, 0.57726, 0.50305, 0.24069, 0.44015, 0.19158, 0.80079, 0.29694, 0.12288, 0.37842, 0.84005, 0.71037, 0.63432, 0.15888, 0.60895 ], + "triangles": [ 8, 26, 28, 8, 28, 7, 9, 26, 8, 9, 10, 26, 23, 4, 5, 6, 23, 5, 7, 21, 6, 6, 21, 23, 23, 3, 4, 7, 28, 21, 26, 20, 28, 28, 20, 21, 10, 30, 26, 26, 30, 20, 20, 24, 21, 21, 29, 23, 21, 24, 29, 29, 18, 23, 23, 18, 3, 10, 11, 30, 29, 24, 18, 18, 2, 3, 30, 25, 20, 20, 17, 24, 20, 25, 17, 30, 11, 25, 2, 18, 1, 11, 12, 25, 22, 19, 16, 22, 0, 1, 19, 14, 16, 19, 27, 14, 22, 15, 0, 22, 16, 15, 12, 13, 27, 16, 14, 15, 27, 13, 14, 22, 24, 19, 1, 18, 22, 25, 27, 19, 25, 12, 27, 17, 19, 24, 24, 22, 18, 17, 25, 19 ], + "vertices": [ 1, 3, 31.68, -23.15, 1, 2, 3, 19.06, -31.25, 0.60493, 2, 57.14, -30.52, 0.39506, 2, 3, 1.66, -31.38, 0.39506, 2, 39.73, -30.66, 0.60493, 2, 3, -15.74, -31.52, 0.20987, 2, 22.33, -30.79, 0.79012, 1, 5, -7.76, 14.88, 1, 1, 5, 9.47, 12.45, 1, 1, 5, 7.3, -2.89, 1, 2, 5, 5.13, -18.24, 0.488, 9, 5.76, 18.5, 0.51199, 2, 5, 2.96, -33.59, 0.16266, 9, 6.61, 3.02, 0.83733, 3, 3, -51.04, 30.19, 0.06995, 2, -12.97, 30.92, 0.26337, 9, 7.46, -12.45, 0.66666, 1, 9, -18.7, -13.88, 1, 2, 3, 1.38, 30.6, 0.39506, 2, 39.46, 31.33, 0.60493, 2, 3, 22.71, 24.68, 0.60493, 2, 60.79, 25.41, 0.39506, 1, 3, 44.04, 18.76, 1, 1, 3, 44.17, 1.85, 1, 1, 3, 44.3, -15.05, 1, 1, 3, 31.75, -5.65, 1, 2, 3, 0.38, 5.73, 0.448, 2, 38.46, 6.46, 0.55198, 2, 3, -3.29, -21.22, 0.448, 2, 34.78, -20.49, 0.55198, 1, 3, 18.74, 4.46, 1, 1, 2, 22.19, 8.72, 1, 2, 2, 9.37, -5.38, 0.52, 5, -15.94, -9.72, 0.48, 1, 3, 19.81, -13.86, 1, 2, 2, 9.77, -21.01, 0.52, 5, -14.02, 5.79, 0.48, 2, 3, -3.55, -5.21, 0.448, 2, 34.5, -4.48, 0.55198, 2, 3, 2.25, 15.69, 0.448, 2, 40.32, 16.42, 0.55198, 2, 2, 6.04, 19.19, 0.584, 9, -12.08, -1.62, 0.41599, 1, 3, 32.41, 12.44, 1, 2, 2, 2.4, 7.58, 0.584, 9, -8.99, 10.14, 0.41599, 1, 2, 22.11, -12.84, 1, 1, 2, 24.25, 21.36, 1 ], "hull": 16, "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, 30, 30, 0 ], "width": 62, @@ -306,7 +308,7 @@ }, { "time": 0.2666, - "angle": -17.96, + "angle": -17.95, "curve": [ 0.25, 0, 0.535, 1 ] }, { @@ -325,7 +327,7 @@ { "time": 0, "angle": 0 } ], "translate": [ - { "time": 0, "x": -0.59, "y": 0 } + { "time": 0, "x": -0.58, "y": 0 } ] }, "R-foot": { diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.png.meta b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.png.meta index 34eb2f4ab..55778136c 100644 --- a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.png.meta +++ b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: b29bbacbc2368c94a9c942d176ac6f59 -timeCreated: 1455501337 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Atlas.asset b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Atlas.asset index 336bb6976..a5a928852 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Material.mat b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Material.mat index a544beb03..de4d9e87e 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Material.mat and b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_SkeletonData.asset index 31e9c71fa..ec588e4af 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Raggedy Spineboy/Raggedy Spineboy_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Raptor/raptor.json b/spine-unity/Assets/Examples/Spine/Raptor/raptor.json index cf761a65a..c70f7b21f 100644 --- a/spine-unity/Assets/Examples/Spine/Raptor/raptor.json +++ b/spine-unity/Assets/Examples/Spine/Raptor/raptor.json @@ -1,48 +1,92 @@ { -"skeleton": { "hash": "qxmcEk0SYRCDt0lM83+xmNjO6rA", "spine": "3.0.01", "width": 1223.71, "height": 1052.13, "images": "./images/" }, +"skeleton": { + "hash": "TWhM3jMRTJdDA0rvXsx/iqdbWpQ", + "spine": "3.3.07", + "width": 1223.75, + "height": 1053.54, + "images": "C:/Program Files (x86)/Spine/examples/raptor/images/" +}, "bones": [ { "name": "root" }, - { "name": "rear_foot_goal", "parent": "root", "x": 33.43, "y": 30.81, "color": "ff0000ff" }, - { "name": "rear_leg_goal", "parent": "rear_foot_goal", "x": -127.51, "y": 75.99, "color": "ff0000ff" }, - { "name": "hip", "parent": "root", "x": -136.78, "y": 415.47, "rotation": 3.15, "color": "fbff00ff" }, - { "name": "rear_leg1", "parent": "hip", "length": 226.27, "x": 55.19, "y": -71.25, "rotation": -54.76, "color": "e07800ff" }, - { "name": "rear_leg2", "parent": "rear_leg1", "length": 172.58, "x": 226.32, "y": 0.23, "rotation": -92.25, "color": "e07800ff" }, - { "name": "rear_leg3", "parent": "rear_leg2", "length": 103.05, "x": 172.31, "y": 2.21, "rotation": 82.81, "color": "e07800ff" }, - { "name": "rear_foot1", "parent": "rear_leg3", "length": 84.51, "x": 102.37, "y": -0.02, "rotation": 75.43, "color": "e07800ff" }, + { "name": "hip", "parent": "root", "rotation": 3.15, "x": -136.78, "y": 415.47, "color": "fbff00ff" }, + { "name": "torso1", "parent": "hip", "length": 126.25, "rotation": -4.97, "x": 30.03, "y": -0.4, "color": "eaff00ff" }, + { "name": "saddle", "parent": "torso1", "length": 50.91, "rotation": 91.8, "x": 4.56, "y": 71.86, "color": "ff7300ff" }, + { "name": "spineboy_hip", "parent": "saddle", "length": 0.52, "rotation": 90.01, "x": 81.88, "y": 2.68, "color": "ffffffff" }, { - "name": "rear_foot2", - "parent": "rear_foot1", - "length": 102.31, - "x": 84.49, - "y": -0.34, - "rotation": -6.13, - "inheritRotation": false, - "color": "e07800ff" + "name": "spineboy_torso", + "parent": "spineboy_hip", + "length": 122.45, + "rotation": -75.85, + "x": 1.05, + "y": -2.1, + "color": "ffffffff" }, - { "name": "front_foot_goal", "parent": "root", "x": -45.79, "y": -28.67, "rotation": -0.94, "color": "ff0000ff" }, + { "name": "torso2", "parent": "torso1", "length": 121.2, "rotation": 39.84, "x": 126.25, "y": -0.37, "color": "eaff00ff" }, + { "name": "neck", "parent": "torso2", "length": 70.59, "rotation": 41.37, "x": 121.19, "y": 0.34, "color": "eaff00ff" }, + { "name": "head", "parent": "neck", "length": 105.5, "rotation": 9.82, "x": 70.59, "y": 0.03, "color": "eaff00ff" }, + { "name": "horn_rear", "parent": "head", "length": 73.78, "rotation": 44.31, "x": 99.27, "y": -226.79, "color": "e07800ff" }, + { "name": "rear_arm_target", "parent": "horn_rear", "rotation": -133.55, "x": 232.68, "y": 245.84, "color": "e07800ff" }, + { + "name": "back_arm", + "parent": "spineboy_torso", + "length": 67.21, + "rotation": -120.89, + "x": 96.33, + "y": -38.46, + "color": "ffffffff" + }, + { "name": "back_bracer", "parent": "back_arm", "length": 43.68, "rotation": 17.48, "x": 67.21, "y": -0.31, "color": "ffffffff" }, + { + "name": "back_hand", + "parent": "back_bracer", + "length": 41.97, + "rotation": 9.2, + "x": 43.68, + "y": 0.06, + "inheritRotation": false, + "color": "ffffffff" + }, + { "name": "spineboy_rear_arm_goal", "parent": "saddle", "x": -30.43, "y": -100.08, "color": "ff0001ff" }, + { "name": "back_thigh", "parent": "spineboy_hip", "length": 71.15, "rotation": 160.75, "x": -9.57, "y": 2.31, "color": "ffffffff" }, + { "name": "back_knee", "parent": "back_thigh", "length": 97.17, "rotation": -54.97, "x": 71.15, "y": -0.28, "color": "ffffffff" }, + { "name": "horn_front", "parent": "head", "length": 87.48, "rotation": 49.36, "x": 82.09, "y": -221.36, "color": "15ff00ff" }, + { "name": "front_arm_target", "parent": "horn_front", "rotation": -138.59, "x": 294.58, "y": 234.17, "color": "15ff00ff" }, + { + "name": "front_arm", + "parent": "spineboy_torso", + "length": 74.51, + "rotation": -118.16, + "x": 101.37, + "y": 9.78, + "color": "ffffffff" + }, + { "name": "front_bracer", "parent": "front_arm", "length": 39.85, "rotation": 20.3, "x": 74.52, "y": -0.41, "color": "ffffffff" }, + { "name": "front_arm1", "parent": "torso2", "length": 109.99, "rotation": 224.54, "x": 46.37, "y": -84.61, "color": "15ff00ff" }, + { "name": "front_arm2", "parent": "front_arm1", "length": 86.33, "rotation": 105.23, "x": 109.99, "y": 0.2, "color": "15ff00ff" }, + { "name": "front_foot_goal", "parent": "root", "rotation": -0.94, "x": -45.79, "y": -28.67, "color": "ff0000ff" }, { "name": "front_leg_goal", "parent": "front_foot_goal", "x": -106.06, "y": 115.58, "color": "ff0000ff" }, - { "name": "front_leg1", "parent": "hip", "length": 251.74, "x": 27.36, "y": -28.27, "rotation": -51.5, "color": "15ff00ff" }, - { "name": "front_leg2", "parent": "front_leg1", "length": 208.54, "x": 251.03, "y": 0.16, "rotation": 261.93, "color": "15ff00ff" }, - { "name": "front_leg3", "parent": "front_leg2", "length": 118.18, "x": 208.5, "y": -1.63, "rotation": 85.46, "color": "15ff00ff" }, + { "name": "front_leg1", "parent": "hip", "length": 251.74, "rotation": -51.5, "x": 27.36, "y": -28.27, "color": "15ff00ff" }, + { "name": "front_leg2", "parent": "front_leg1", "length": 208.54, "rotation": 261.93, "x": 251.03, "y": 0.16, "color": "15ff00ff" }, + { "name": "front_leg3", "parent": "front_leg2", "length": 118.18, "rotation": 85.46, "x": 208.5, "y": -1.63, "color": "15ff00ff" }, { "name": "front_foot1", "parent": "front_leg3", "length": 57.79, + "rotation": 54.46, "x": 118.19, "y": -0.79, "scaleX": 1.126, - "rotation": 54.46, "color": "15ff00ff" }, { "name": "front_foot2", "parent": "front_foot1", "length": 56.19, + "rotation": -0.46, "x": 57.78, "y": -0.02, "scaleX": 0.73, "scaleY": 0.823, - "rotation": -0.46, "inheritRotation": false, "color": "15ff00ff" }, @@ -50,67 +94,102 @@ "name": "front_foot3", "parent": "front_foot2", "length": 129.88, + "rotation": -3.16, "x": 49.71, "y": 20.65, "scaleX": 1.154, - "rotation": -3.16, "inheritRotation": false, "color": "15ff00ff" }, - { "name": "tail1", "parent": "hip", "length": 162.53, "x": -20.86, "y": 6.87, "rotation": 162.92, "color": "eaff00ff" }, - { "name": "tail2", "parent": "tail1", "length": 130.02, "x": 162.53, "y": -0.82, "rotation": 30.3, "color": "eaff00ff" }, - { "name": "tail3", "parent": "tail2", "length": 141.06, "x": 130.02, "y": 0.1, "rotation": 6.88, "color": "eaff00ff" }, - { "name": "tail4", "parent": "tail3", "length": 126.25, "x": 141.05, "y": 0.64, "rotation": -18.86, "color": "eaff00ff" }, - { "name": "tail5", "parent": "tail4", "length": 91.06, "x": 126.25, "y": -0.47, "rotation": -22.34, "color": "eaff00ff" }, - { "name": "torso1", "parent": "hip", "length": 126.25, "x": 30.03, "y": -0.4, "rotation": -4.97, "color": "eaff00ff" }, - { "name": "saddle", "parent": "torso1", "length": 50.91, "x": 4.56, "y": 71.86, "rotation": 91.8, "color": "ff7300ff" }, - { "name": "stirrup", "parent": "saddle", "length": 78.17, "x": -81.94, "y": -103.38, "rotation": -68.85, "color": "ff7300ff" }, - { "name": "stirrup_strap1", "parent": "saddle", "length": 43.69, "x": -20.38, "y": -29.37, "rotation": -135, "color": "ff7300ff" }, - { "name": "stirrup_strap2", "parent": "stirrup_strap1", "length": 51.62, "x": 43.7, "rotation": 9.38, "color": "ff7300ff" }, - { "name": "spineboy_rear_arm_goal", "parent": "saddle", "x": -30.43, "y": -100.08, "color": "ff0001ff" }, - { "name": "spineboy_hip", "parent": "saddle", "length": 0.52, "x": 81.88, "y": 2.68, "rotation": 90.01, "color": "ffffffff" }, + { "name": "front_hand", "parent": "front_arm2", "length": 47.55, "rotation": -56.83, "x": 86.33, "y": 0.06, "color": "15ff00ff" }, { - "name": "spineboy_torso", - "parent": "spineboy_hip", - "length": 122.45, - "x": 1.05, - "y": -2.1, - "rotation": -75.85, + "name": "front_hand2", + "parent": "front_bracer", + "length": 58.18, + "rotation": 13.89, + "x": 39.98, + "y": -0.89, + "inheritRotation": false, "color": "ffffffff" }, - { "name": "neck2", "parent": "spineboy_torso", "length": 32.04, "x": 113.44, "y": -15.21, "rotation": -45.22, "color": "ffffffff" }, - { "name": "head2", "parent": "neck2", "length": 249.64, "x": 23.01, "y": 3.47, "rotation": 11.65, "color": "ffffffff" }, - { - "name": "gun", - "parent": "spineboy_hip", - "length": 181.35, - "x": 16.86, - "y": -7.89, - "scaleX": 0.816, - "scaleY": 0.816, - "rotation": 107.11, - "color": "ffffffff" - }, - { "name": "back_thigh", "parent": "spineboy_hip", "length": 71.15, "x": -9.57, "y": 2.31, "rotation": 160.75, "color": "ffffffff" }, - { "name": "back_knee", "parent": "back_thigh", "length": 97.17, "x": 71.15, "y": -0.28, "rotation": -54.97, "color": "ffffffff" }, { "name": "spineboy_front_arm_goal", "parent": "saddle", "x": -50.7, "y": -96.93, "color": "ff0004ff" }, { "name": "front_thigh", "parent": "spineboy_hip", "length": 77.79, + "rotation": 163.34, "x": 15.51, "y": 17.01, - "rotation": 163.34, "color": "ffffffff" }, - { "name": "lower_leg", "parent": "front_thigh", "length": 111.5, "x": 77.92, "y": -0.1, "rotation": -49.62, "color": "ffffffff" }, + { "name": "lower_leg", "parent": "front_thigh", "length": 111.5, "rotation": -49.62, "x": 77.92, "y": -0.1, "color": "ffffffff" }, + { + "name": "gun", + "parent": "spineboy_hip", + "length": 181.35, + "rotation": 107.11, + "x": 16.86, + "y": -7.89, + "scaleX": 0.816, + "scaleY": 0.816, + "color": "ffffffff" + }, + { "name": "neck2", "parent": "spineboy_torso", "length": 32.04, "rotation": -45.22, "x": 113.44, "y": -15.21, "color": "ffffffff" }, + { "name": "head2", "parent": "neck2", "length": 249.64, "rotation": 11.65, "x": 23.01, "y": 3.47, "color": "ffffffff" }, + { + "name": "jaw", + "parent": "head", + "length": 203.76, + "rotation": -140.14, + "x": 29.36, + "y": -40.15, + "inheritScale": false, + "color": "ffff00ff" + }, + { "name": "rear_arm1", "parent": "torso2", "length": 109.56, "rotation": -124.71, "x": 57.05, "y": -95.38, "color": "e07800ff" }, + { "name": "rear_arm2", "parent": "rear_arm1", "length": 85.8, "rotation": 123.56, "x": 109.56, "color": "e07800ff" }, + { "name": "rear_foot_goal", "parent": "root", "x": 33.43, "y": 30.81, "color": "ff0000ff" }, + { "name": "rear_leg_goal", "parent": "rear_foot_goal", "x": -127.51, "y": 75.99, "color": "ff0000ff" }, + { "name": "rear_leg1", "parent": "hip", "length": 226.27, "rotation": -54.76, "x": 55.19, "y": -71.25, "color": "e07800ff" }, + { "name": "rear_leg2", "parent": "rear_leg1", "length": 172.58, "rotation": -92.25, "x": 226.32, "y": 0.23, "color": "e07800ff" }, + { "name": "rear_leg3", "parent": "rear_leg2", "length": 103.05, "rotation": 82.81, "x": 172.31, "y": 2.21, "color": "e07800ff" }, + { "name": "rear_foot1", "parent": "rear_leg3", "length": 84.51, "rotation": 75.43, "x": 102.37, "y": -0.02, "color": "e07800ff" }, + { + "name": "rear_foot2", + "parent": "rear_foot1", + "length": 102.31, + "rotation": -6.13, + "x": 84.49, + "y": -0.34, + "inheritRotation": false, + "color": "e07800ff" + }, + { "name": "rear_hand", "parent": "rear_arm2", "length": 45.8, "rotation": -76.28, "x": 85.8, "y": 0.1, "color": "e07800ff" }, + { + "name": "saddle_strap_front1", + "parent": "saddle", + "length": 97.27, + "rotation": -148.11, + "x": -27.36, + "y": -73.38, + "color": "ff7300ff" + }, + { + "name": "saddle_strap_front2", + "parent": "saddle_strap_front1", + "length": 102.74, + "rotation": -11.13, + "x": 97.29, + "y": 0.3, + "color": "ff7300ff" + }, { "name": "saddle_strap_rear1", "parent": "saddle", "length": 38.62, + "rotation": 151.13, "x": -33.34, "y": 87.32, - "rotation": 151.13, "color": "ff7300ff" }, { "name": "saddle_strap_rear2", "parent": "saddle_strap_rear1", "length": 54.36, "x": 38.63, "y": -0.02, "color": "ff7300ff" }, @@ -118,146 +197,22 @@ "name": "saddle_strap_rear3", "parent": "saddle_strap_rear2", "length": 44.04, + "rotation": 3.63, "x": 54.86, "y": 0.19, - "rotation": 3.63, "color": "ff7300ff" }, - { - "name": "saddle_strap_front1", - "parent": "saddle", - "length": 97.27, - "x": -27.36, - "y": -73.38, - "rotation": -148.11, - "color": "ff7300ff" - }, - { - "name": "saddle_strap_front2", - "parent": "saddle_strap_front1", - "length": 102.74, - "x": 97.29, - "y": 0.3, - "rotation": -11.13, - "color": "ff7300ff" - }, - { "name": "torso2", "parent": "torso1", "length": 121.2, "x": 126.25, "y": -0.37, "rotation": 39.84, "color": "eaff00ff" }, - { "name": "rear_arm1", "parent": "torso2", "length": 109.56, "x": 57.05, "y": -95.38, "rotation": -124.71, "color": "e07800ff" }, - { "name": "rear_arm2", "parent": "rear_arm1", "length": 85.8, "x": 109.56, "rotation": 123.56, "color": "e07800ff" }, - { "name": "rear_hand", "parent": "rear_arm2", "length": 45.8, "x": 85.8, "y": 0.1, "rotation": -76.28, "color": "e07800ff" }, - { "name": "neck", "parent": "torso2", "length": 70.59, "x": 121.19, "y": 0.34, "rotation": 41.37, "color": "eaff00ff" }, - { "name": "head", "parent": "neck", "length": 105.5, "x": 70.59, "y": 0.03, "rotation": 9.82, "color": "eaff00ff" }, - { "name": "tongue1", "parent": "head", "length": 55.11, "x": 20.81, "y": -104.75, "rotation": -129.04, "color": "ffff00ff" }, - { "name": "tongue2", "parent": "tongue1", "length": 44.66, "x": 55.59, "y": 0.93, "rotation": 8.93, "color": "fff200ff" }, - { "name": "tongue3", "parent": "tongue2", "length": 43.64, "x": 44.26, "y": -0.2, "rotation": 12.86, "color": "fff200ff" }, - { - "name": "jaw", - "parent": "head", - "length": 203.76, - "x": 29.36, - "y": -40.15, - "rotation": -140.14, - "inheritScale": false, - "color": "ffff00ff" - }, - { "name": "horn_rear", "parent": "head", "length": 73.78, "x": 99.27, "y": -226.79, "rotation": 44.31, "color": "e07800ff" }, - { "name": "rear_arm_target", "parent": "horn_rear", "x": 232.68, "y": 245.84, "rotation": -133.55, "color": "e07800ff" }, - { - "name": "back_arm", - "parent": "spineboy_torso", - "length": 67.21, - "x": 96.33, - "y": -38.46, - "rotation": -120.89, - "color": "ffffffff" - }, - { "name": "back_bracer", "parent": "back_arm", "length": 43.68, "x": 67.21, "y": -0.31, "rotation": 17.48, "color": "ffffffff" }, - { - "name": "back_hand", - "parent": "back_bracer", - "length": 41.97, - "x": 43.68, - "y": 0.06, - "rotation": 9.2, - "inheritRotation": false, - "color": "ffffffff" - }, - { "name": "horn_front", "parent": "head", "length": 87.48, "x": 82.09, "y": -221.36, "rotation": 49.36, "color": "15ff00ff" }, - { "name": "front_arm_target", "parent": "horn_front", "x": 294.58, "y": 234.17, "rotation": -138.59, "color": "15ff00ff" }, - { - "name": "front_arm", - "parent": "spineboy_torso", - "length": 74.51, - "x": 101.37, - "y": 9.78, - "rotation": -118.16, - "color": "ffffffff" - }, - { "name": "front_bracer", "parent": "front_arm", "length": 39.85, "x": 74.52, "y": -0.41, "rotation": 20.3, "color": "ffffffff" }, - { - "name": "front_hand2", - "parent": "front_bracer", - "length": 58.18, - "x": 39.98, - "y": -0.89, - "rotation": 13.89, - "inheritRotation": false, - "color": "ffffffff" - }, - { "name": "front_arm1", "parent": "torso2", "length": 109.99, "x": 46.37, "y": -84.61, "rotation": 224.54, "color": "15ff00ff" }, - { "name": "front_arm2", "parent": "front_arm1", "length": 86.33, "x": 109.99, "y": 0.2, "rotation": 105.23, "color": "15ff00ff" }, - { "name": "front_hand", "parent": "front_arm2", "length": 47.55, "x": 86.33, "y": 0.06, "rotation": -56.83, "color": "15ff00ff" } -], -"ik": [ - { - "name": "front_leg_goal", - "bones": [ "front_leg1", "front_leg2" ], - "target": "front_leg_goal", - "bendPositive": false - }, - { - "name": "rear_leg_goal", - "bones": [ "rear_leg1", "rear_leg2" ], - "target": "rear_leg_goal", - "bendPositive": false - }, - { - "name": "front_foot_goal", - "bones": [ "front_leg3", "front_foot1" ], - "target": "front_foot_goal" - }, - { - "name": "rear_foot_goal", - "bones": [ "rear_leg3", "rear_foot1" ], - "target": "rear_foot_goal" - }, - { - "name": "stirrup", - "bones": [ "stirrup_strap1", "stirrup_strap2" ], - "target": "stirrup" - }, - { - "name": "spineboy_front_leg_goal", - "bones": [ "front_thigh", "lower_leg" ], - "target": "spineboy_front_arm_goal", - "bendPositive": false - }, - { - "name": "spineboy_rear_leg_goal", - "bones": [ "back_thigh", "back_knee" ], - "target": "spineboy_rear_arm_goal", - "bendPositive": false - }, - { - "name": "front_arm_goal", - "bones": [ "front_arm", "front_bracer" ], - "target": "front_arm_target" - }, - { - "name": "rear_arm_goal", - "bones": [ "back_arm", "back_bracer" ], - "target": "rear_arm_target" - } + { "name": "stirrup", "parent": "saddle", "length": 78.17, "rotation": -68.85, "x": -81.94, "y": -103.38, "color": "ff7300ff" }, + { "name": "stirrup_strap1", "parent": "saddle", "length": 43.69, "rotation": -135, "x": -20.38, "y": -29.37, "color": "ff7300ff" }, + { "name": "stirrup_strap2", "parent": "stirrup_strap1", "length": 51.62, "rotation": 9.38, "x": 43.7, "color": "ff7300ff" }, + { "name": "tail1", "parent": "hip", "length": 162.53, "rotation": 162.92, "x": -20.86, "y": 6.87, "color": "eaff00ff" }, + { "name": "tail2", "parent": "tail1", "length": 130.02, "rotation": 30.3, "x": 162.53, "y": -0.82, "color": "eaff00ff" }, + { "name": "tail3", "parent": "tail2", "length": 141.06, "rotation": 6.88, "x": 130.02, "y": 0.1, "color": "eaff00ff" }, + { "name": "tail4", "parent": "tail3", "length": 126.25, "rotation": -18.86, "x": 141.05, "y": 0.64, "color": "eaff00ff" }, + { "name": "tail5", "parent": "tail4", "length": 91.06, "rotation": -22.34, "x": 126.25, "y": -0.47, "color": "eaff00ff" }, + { "name": "tongue1", "parent": "head", "length": 55.11, "rotation": -129.04, "x": 20.81, "y": -104.75, "color": "ffff00ff" }, + { "name": "tongue2", "parent": "tongue1", "length": 44.66, "rotation": 8.93, "x": 55.59, "y": 0.93, "color": "fff200ff" }, + { "name": "tongue3", "parent": "tongue2", "length": 43.64, "rotation": 12.86, "x": 44.26, "y": -0.2, "color": "fff200ff" } ], "slots": [ { "name": "back_hand", "bone": "back_hand", "attachment": "back_hand" }, @@ -294,6 +249,57 @@ { "name": "front_bracer", "bone": "front_bracer", "attachment": "front_bracer" }, { "name": "front_hand", "bone": "front_hand2", "attachment": "front_hand" } ], +"ik": [ + { + "name": "front_arm_goal", + "bones": [ "front_arm", "front_bracer" ], + "target": "front_arm_target" + }, + { + "name": "front_foot_goal", + "bones": [ "front_leg3", "front_foot1" ], + "target": "front_foot_goal" + }, + { + "name": "front_leg_goal", + "bones": [ "front_leg1", "front_leg2" ], + "target": "front_leg_goal", + "bendPositive": false + }, + { + "name": "rear_arm_goal", + "bones": [ "back_arm", "back_bracer" ], + "target": "rear_arm_target" + }, + { + "name": "rear_foot_goal", + "bones": [ "rear_leg3", "rear_foot1" ], + "target": "rear_foot_goal" + }, + { + "name": "rear_leg_goal", + "bones": [ "rear_leg1", "rear_leg2" ], + "target": "rear_leg_goal", + "bendPositive": false + }, + { + "name": "spineboy_front_leg_goal", + "bones": [ "front_thigh", "lower_leg" ], + "target": "spineboy_front_arm_goal", + "bendPositive": false + }, + { + "name": "spineboy_rear_leg_goal", + "bones": [ "back_thigh", "back_knee" ], + "target": "spineboy_rear_arm_goal", + "bendPositive": false + }, + { + "name": "stirrup", + "bones": [ "stirrup_strap1", "stirrup_strap2" ], + "target": "stirrup" + } +], "skins": { "default": { "back_arm": { @@ -354,10 +360,10 @@ }, "raptor_arm_back": { "raptor_arm_back": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.38711, 0.29362, 0.31382, 0.46513, 0.29242, 0.51521, 0.32475, 0.4931, 0.57587, 0.32138, 0.63254, 0.28263, 0.71632, 0.34507, 0.94948, 0.51888, 0.94947, 0.60129, 1, 0.65257, 1, 0.90624, 0.95462, 0.99934, 0.88957, 0.83204, 0.80294, 0.99998, 0.75236, 0.75696, 0.6654, 0.713, 0.62288, 0.63242, 0.58194, 0.65031, 0.22478, 0.80641, 0.07791, 0.73315, 0.07825, 0.66549, 0.07984, 0.34306, 0, 0.29728, 0, 0, 0.32334, 0 ], "triangles": [ 6, 15, 16, 5, 6, 16, 5, 16, 4, 6, 7, 15, 16, 17, 4, 8, 15, 7, 14, 15, 8, 12, 14, 8, 12, 8, 9, 12, 9, 10, 11, 12, 10, 13, 14, 12, 17, 3, 4, 19, 20, 2, 18, 19, 2, 18, 2, 3, 18, 3, 17, 21, 22, 23, 24, 21, 23, 0, 21, 24, 1, 21, 0, 1, 20, 21, 2, 20, 1 ], - "vertices": [ 2, 44, 36.95, 33.31, 0.91666, 45, 68.53, 41.05, 0.08333, 2, 44, 66.01999, 20.35, 0.76813, 45, 41.41, 24.39, 0.23186, 2, 44, 74.51, 16.57, 0.64468, 45, 33.49, 19.53, 0.35531, 3, 44, 70.89, 21.97, 0.27669, 45, 39.99, 19.45999, 0.67508, 46, -29.67, -39.91, 0.04822, 3, 44, 42.77, 63.89, 0.11483, 45, 90.47, 18.95, 0.60854, 46, -17.2, 9, 0.2766, 2, 45, 101.86, 18.83, 0.45955, 46, -14.38, 20.04, 0.54044, 2, 45, 106.47, 2.08, 0.0625, 46, 2.98, 20.56, 0.9375, 1, 46, 51.32, 21.98, 1, 1, 46, 60.41, 11.1, 1, 1, 46, 72.39, 9.60999, 1, 1, 46, 100.37, -23.87, 1, 1, 46, 104.96, -40.9, 1, 1, 46, 78.37, -25.61, 1, 1, 46, 86.05, -56.84, 1, 1, 46, 52.92, -30.04, 1, 2, 45, 62.24, -43.92, 0.0625, 46, 37.18999, -33.33, 0.9375, 2, 45, 64.89, -28.65, 0.3125, 46, 22.98, -27.14, 0.6875, 2, 45, 57.69, -27.17, 0.30612, 46, 19.83, -33.78, 0.69387, 2, 44, 124.19, 3.83, 0.19395, 45, -5.09, -14.23, 0.80604, 2, 44, 110.77, -19.65, 0.3125, 45, -16.87999, 10.1, 0.6875, 2, 44, 99.14, -19.2, 0.51612, 45, -9.93, 19.44, 0.48386, 2, 44, 43.73, -17.03, 0.9375, 45, 23.17, 63.92, 0.0625, 1, 44, 35.41, -29.77, 1, 1, 44, -15.68, -28.02, 1, 1, 44, -13.87, 24.65, 1 ], + "vertices": [ 2, 40, 36.95, 33.31, 0.91666, 41, 68.53, 41.05, 0.08333, 2, 40, 66.01999, 20.35, 0.76813, 41, 41.41, 24.39, 0.23186, 2, 40, 74.51, 16.57, 0.64468, 41, 33.49, 19.53, 0.35531, 3, 40, 70.89, 21.97, 0.27669, 41, 39.99, 19.45999, 0.67508, 49, -29.67, -39.91, 0.04822, 3, 40, 42.77, 63.89, 0.11483, 41, 90.47, 18.95, 0.60854, 49, -17.2, 9, 0.2766, 2, 41, 101.86, 18.83, 0.45955, 49, -14.38, 20.04, 0.54044, 2, 41, 106.47, 2.08, 0.0625, 49, 2.98, 20.56, 0.9375, 1, 49, 51.32, 21.98, 1, 1, 49, 60.41, 11.1, 1, 1, 49, 72.39, 9.60999, 1, 1, 49, 100.37, -23.87, 1, 1, 49, 104.96, -40.9, 1, 1, 49, 78.37, -25.61, 1, 1, 49, 86.05, -56.84, 1, 1, 49, 52.92, -30.04, 1, 2, 41, 62.24, -43.92, 0.0625, 49, 37.18999, -33.33, 0.9375, 2, 41, 64.89, -28.65, 0.3125, 49, 22.98, -27.14, 0.6875, 2, 41, 57.69, -27.17, 0.30612, 49, 19.83, -33.78, 0.69387, 2, 40, 124.19, 3.83, 0.19395, 41, -5.09, -14.23, 0.80604, 2, 40, 110.77, -19.65, 0.3125, 41, -16.87999, 10.1, 0.6875, 2, 40, 99.14, -19.2, 0.51612, 41, -9.93, 19.44, 0.48386, 2, 40, 43.73, -17.03, 0.9375, 41, 23.17, 63.92, 0.0625, 1, 40, 35.41, -29.77, 1, 1, 40, -15.68, -28.02, 1, 1, 40, -13.87, 24.65, 1 ], "hull": 25, "edges": [ 44, 46, 44, 42, 38, 36, 32, 30, 30, 28, 28, 26, 24, 22, 18, 16, 16, 14, 46, 48, 38, 4, 6, 4, 6, 36, 42, 40, 40, 38, 4, 2, 2, 0, 40, 2, 10, 32, 36, 34, 34, 32, 10, 8, 8, 6, 34, 8, 14, 12, 12, 10, 12, 30, 18, 20, 22, 20, 26, 24, 48, 0 ], "width": 163, @@ -366,10 +372,10 @@ }, "raptor_body": { "raptor_body": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.89014, 0.11136, 1, 0.22194, 1, 0.42847, 0.88179, 0.38589, 0.874, 0.47986, 0.84783, 0.51728, 0.82504, 0.54984, 0.82403, 0.61606, 0.82305, 0.67972, 0.74042, 0.86709, 0.61596, 0.93097, 0.49649, 0.90968, 0.41186, 0.71379, 0.36955, 0.70086, 0.32823, 0.68824, 0.30082, 0.69962, 0.27515, 0.71028, 0.25301, 0.71948, 0.22568, 0.73082, 0.20832, 0.72362, 0.19092, 0.7164, 0.15952, 0.70337, 0.1301, 0.69116, 0.09227, 0.67546, 0.06029, 0.63165, 0.02855, 0.58817, 0, 0.49874, 0.05045, 0.53494, 0.08267, 0.54507, 0.11815, 0.55623, 0.14733, 0.54161, 0.17913, 0.52568, 0.20324, 0.5136, 0.22867, 0.50087, 0.24871, 0.47664, 0.27523, 0.44458, 0.32026, 0.39015, 0.37517, 0.35747, 0.43476, 0.32201, 0.4893, 0.35534, 0.56021, 0.39867, 0.61587, 0.40674, 0.67769, 0.4157, 0.69094, 0.31314, 0.69362, 0.14742, 0.79219, 0.08354, 0.51541, 0.74573, 0.62393, 0.75425, 0.70856, 0.7287, 0.76132, 0.63288, 0.7566, 0.49454, 0.80613, 0.27517, 0.65885, 0.59037, 0.53929, 0.54937, 0.42632, 0.52207, 0.3246, 0.55241, 0.22715, 0.618, 0.10574, 0.61341, 0.03969, 0.56109, 0.77916, 0.39461, 0.37556, 0.53721, 0.27743, 0.58416, 0.16958, 0.61582, 0.07259, 0.58715, 0.87545, 0.31683, 0.85488, 0.21417, 0.81012, 0.17403, 0.83214, 0.25662, 0.83823, 0.32214, 0.84622, 0.41719, 0.59954, 0.57003, 0.49074, 0.53763, 0.76917, 0.43888, 0.75912, 0.56845, 0.871, 0.3701, 0.85431, 0.43545, 0.89558, 0.32412, 0.90105, 0.22877, 0.91523, 0.20564, 0.93086, 0.219, 0.93446, 0.25858, 0.91956, 0.2776, 0.9061, 0.26423, 0.9415, 0.25929, 0.93589, 0.21545, 0.91669, 0.19192, 0.89297, 0.22201, 0.90245, 0.28513, 0.92006, 0.281, 0.92143, 0.29619, 0.94856, 0.2643, 0.19894, 0.61694, 0.13973, 0.61469, 0.25158, 0.60156, 0.88779, 0.26675 ], "triangles": [ 13, 60, 12, 12, 71, 46, 46, 70, 47, 11, 12, 46, 47, 11, 46, 10, 11, 47, 13, 14, 55, 15, 93, 14, 58, 26, 27, 28, 58, 27, 63, 28, 29, 63, 58, 28, 25, 26, 58, 25, 58, 63, 57, 63, 29, 92, 29, 30, 57, 29, 92, 24, 25, 63, 24, 63, 57, 23, 24, 57, 92, 23, 57, 22, 23, 92, 62, 22, 92, 21, 22, 62, 20, 21, 91, 92, 30, 62, 91, 21, 62, 62, 30, 31, 91, 62, 31, 31, 32, 93, 93, 91, 31, 20, 91, 56, 56, 19, 20, 17, 19, 56, 18, 19, 17, 55, 34, 35, 33, 34, 55, 61, 33, 55, 61, 32, 33, 93, 32, 61, 56, 91, 93, 56, 93, 15, 16, 56, 15, 16, 17, 56, 36, 37, 54, 60, 35, 36, 54, 60, 36, 60, 55, 35, 61, 55, 14, 93, 61, 14, 60, 13, 55, 12, 60, 54, 39, 54, 37, 39, 37, 38, 71, 54, 39, 40, 71, 39, 53, 71, 40, 53, 40, 41, 12, 54, 71, 46, 71, 53, 66, 45, 0, 44, 45, 66, 1, 84, 85, 65, 66, 0, 0, 85, 65, 85, 86, 65, 85, 0, 1, 78, 85, 84, 79, 78, 84, 78, 86, 85, 77, 86, 78, 77, 78, 79, 67, 66, 65, 83, 80, 79, 84, 83, 79, 77, 79, 80, 84, 90, 83, 82, 77, 80, 1, 90, 84, 94, 65, 86, 94, 86, 77, 94, 77, 82, 67, 65, 94, 51, 44, 66, 51, 66, 67, 81, 82, 80, 83, 88, 81, 87, 94, 82, 87, 82, 81, 87, 81, 88, 88, 90, 89, 87, 88, 89, 80, 83, 81, 90, 88, 83, 43, 44, 51, 64, 67, 94, 64, 94, 87, 68, 67, 64, 51, 67, 68, 76, 64, 87, 76, 87, 89, 74, 68, 64, 74, 64, 76, 3, 74, 76, 59, 43, 51, 59, 51, 68, 69, 59, 68, 74, 69, 68, 69, 74, 3, 90, 1, 2, 89, 90, 2, 76, 89, 2, 3, 76, 2, 75, 69, 3, 4, 75, 3, 75, 72, 69, 5, 75, 4, 5, 72, 75, 72, 59, 69, 59, 42, 43, 72, 42, 59, 50, 42, 72, 50, 72, 5, 6, 50, 5, 73, 50, 6, 52, 70, 42, 50, 52, 42, 73, 52, 50, 7, 73, 6, 49, 73, 7, 52, 73, 49, 8, 49, 7, 48, 52, 49, 48, 49, 8, 47, 52, 48, 70, 53, 41, 70, 41, 42, 46, 53, 70, 47, 70, 52, 9, 48, 8, 47, 48, 9, 10, 47, 9 ], - "vertices": [ 1, 48, 147.48, -145.48, 1, 1, 48, 89.4, -281.62, 1, 1, 48, -28.24, -285.93, 1, 1, 48, -14.58, -194.68, 1, 5, 22, 363.21, 87.73, 0.02179, 43, 238.39, -84.13, 0.20397, 47, 32.09999, -140.85, 0.18915, 48, -61.96, -132.26, 0.41197, 52, 129.57, 6.39, 0.1731, 5, 22, 332.7, 63.71, 0.06905, 43, 199.57, -83.03, 0.29424, 47, 3.69, -114.37, 0.2194, 48, -85.43, -101.32, 0.30859, 52, 127.34, -26.64, 0.1087, 5, 22, 307.08, 43.5, 0.11018, 43, 166.95, -82.12999, 0.37282, 47, -20.18, -92.14, 0.24572, 48, -105.18, -75.33999, 0.21862, 52, 123.08, -64.79, 0.05264, 5, 22, 307.75, 5.7, 0.18146, 43, 143.25, -111.59, 0.56512, 47, -57.43, -98.57, 0.12044, 48, -142.98, -75.33, 0.10715, 52, 154.85, -83.49, 0.0258, 2, 22, 308.7, -30.55, 0.25, 43, 120.75, -140.04, 0.75, 2, 22, 213.94, -142.7, 0.75, 43, -23.83, -165.45, 0.25, 3, 22, 64.44999, -187.34, 0.31139, 17, -158.45, 158.33, 0.10379, 3, 84.16, -190.98, 0.5848, 1, 3, -61.47, -178.84, 1, 7, 22, -193.84, -78.37, 0.01006, 17, 118.47, 114.74, 0.07207, 18, 17.17, 122.49, 0.17087, 19, -100.71, 132.55, 0.06655, 20, -272.53, 39.71, 0.0127, 21, -381.15, -123.99, 0.00106, 3, -166.91, -67.94999, 0.66666, 7, 22, -246.26, -74, 0.00847, 17, 170.4, 123.13, 0.06072, 18, 66.71, 104.77, 0.19505, 19, -53.08, 110.21, 0.11161, 20, -220.11, 35.3, 0.03559, 21, -331.4, -106.89, 0.02705, 3, -217.69, -61.33, 0.56148, 7, 22, -297.45, -69.74, 0.007, 17, 221.11, 131.31, 0.05019, 18, 115.07, 87.47, 0.2135, 19, -6.58, 88.39, 0.15181, 20, -168.92, 31, 0.05913, 21, -282.82, -90.19, 0.05445, 3, -267.66, -55.14, 0.46388, 7, 22, -322.38, -89.71, 0.00572, 17, 245.53, 147.45, 0.04099, 18, 146.51, 86.08, 0.22288, 19, 26.66, 83.39, 0.18428, 20, -134.99, 41.34, 0.0837, 21, -257.52, -60.65, 0.08408, 3, -298.87, -61.99, 0.37832, 7, 22, -359.24, -85.1, 0.00461, 17, 277.38, 161.09, 0.03306, 18, 178.73, 86.41, 0.22347, 19, 56.68, 81.29, 0.20919, 20, -107.13, 46.31, 0.10923, 21, -232.44, -51.26, 0.11589, 3, -328.68, -69.24, 0.30452, 7, 22, -376.16, -107.83, 0.00361, 17, 294.31, 176.47, 0.02591, 18, 203.26, 86.51, 0.21876, 19, 83.06, 77.01999, 0.2295, 20, -79.56, 53.53, 0.13534, 21, -210.89, -28.3, 0.14902, 3, -354.01, -75.41, 0.23783, 7, 22, -416.83, -99.41, 0.00301, 17, 329.83, 188.85, 0.02165, 18, 238.06, 85.41, 0.19918, 19, 115.65, 74.66, 0.23165, 20, -49.53, 60.58, 0.16135, 21, -185.49, -14.98, 0.18638, 3, -385.33, -83.15, 0.19674, 7, 22, -428.02, -116.81, 0.0025, 17, 343.12, 196.14, 0.01806, 18, 255.33, 78.85, 0.17874, 19, 133.83, 63.18, 0.23028, 20, -27.04, 56.84, 0.18642, 21, -163.58, -5.26, 0.22335, 3, -406.45, -79.89, 0.16063, 7, 22, -449.42, -116.23, 0.00209, 17, 364.17, 200.07, 0.01519, 18, 275.48, 71.62, 0.15813, 19, 152.97, 53.58, 0.22594, 20, -5.82, 53.94, 0.21024, 21, -142.85, 0.11, 0.25891, 3, -427.72, -77.47, 0.12944, 7, 22, -498.22, -88.19, 0.00178, 17, 411.52, 197.55, 0.0131, 18, 313.81, 53.61, 0.13839, 19, 188.04, 35.82, 0.21975, 20, 31.84, 49.3, 0.23251, 21, -106.46, 7.49, 0.2917, 3, -465.96, -72.58999, 0.10272, 7, 22, -524.31, -113.4, 0.00157, 17, 437.98, 213.03, 0.01186, 18, 345.74, 45.54, 0.12065, 19, 219.6, 19.28, 0.2131, 20, 68.31, 43.02, 0.25281, 21, -70.12999, 18.19, 0.32013, 3, -502.09, -68.19, 0.07983, 7, 22, -580.94, -76.79, 0.00148, 17, 494.56, 206.4, 0.01161, 18, 390.81, 21.3, 0.10603, 19, 261.62, -3.66, 0.20745, 20, 114.55, 37.83, 0.27063, 21, -26.15, 30.34, 0.34248, 3, -548.33, -63.22, 0.06027, 7, 22, -621.23, -53.98, 0.00153, 17, 539.16, 193.96, 0.01255, 18, 423.87, -11.11, 0.09566, 19, 291.46, -39.06, 0.20413, 20, 154.83, 14.99, 0.28529, 21, 19.91, 25.67, 0.35721, 3, -589.02, -42.19, 0.0436, 7, 22, -661.22, -31.34, 0.00173, 17, 583.41, 181.62, 0.01498, 18, 456.68, -43.27, 0.09054, 19, 321.06, -74.19999, 0.20422, 20, 194.79, -7.66, 0.29602, 21, 65.62, 21.04, 0.36309, 3, -629.78, -21.51, 0.02938, 7, 22, -698.76, 17.64, 0.00212, 17, 631.64, 143.1, 0.01928, 18, 480.34, -100.28, 0.09165, 19, 339.2, -133.2, 0.20843, 20, 232.3, -56.69, 0.30195, 21, 119.7, -8.68999, 0.35936, 3, -669.35, 25.71, 0.01717, 7, 22, -636.21, 0.4, 0.00186, 17, 566.79, 144.78, 0.02216, 18, 424.34, -67.51999, 0.09478, 19, 286.57, -95.27, 0.21971, 20, 169.77, -39.4, 0.30022, 21, 55.51, -18.08, 0.34915, 3, -606.08, 11.21, 0.01208, 7, 22, -596.68, -3.21, 0.00182, 17, 527.55, 138.78, 0.02791, 18, 387.08, -53.84, 0.10537, 19, 250.77, -78.11, 0.23429, 20, 130.24, -35.75, 0.29251, 21, 17.87, -30.67, 0.32978, 3, -566.25, 9.38, 0.00828, 7, 22, -553.14, -7.2, 0.00202, 17, 484.33, 132.17, 0.03718, 18, 346.04, -38.78, 0.12359, 19, 211.34, -59.22, 0.25059, 20, 86.7, -31.72, 0.27864, 21, -23.59, -44.54, 0.3024, 3, -522.33, 7.03, 0.00553, 7, 22, -516.96, -25.93, 0.00246, 17, 449.17, 125.97, 0.05073, 18, 311.45, -35.25, 0.14934, 19, 175.89, -56.83, 0.26648, 20, 51.53, -43.14, 0.2587, 21, -52.88, -67.87, 0.26867, 3, -487.23, 18.31, 0.00359, 7, 22, -479.88, 14.24, 0.00317, 17, 418.38, 93.72, 0.06938, 18, 269.72, -40.64, 0.18219, 19, 135.19, -53.82, 0.27948, 20, 13.42, -53.11, 0.23298, 21, -82.03, -93.66, 0.2305, 3, -449.1, 30.06, 0.00226, 7, 22, -451.64, 0.32, 0.00417, 17, 390.82, 86.58, 0.09392, 18, 241.19, -39.8, 0.22144, 19, 105.59, -52.93, 0.28715, 20, -16.25, -62.16, 0.20207, 21, -108.34, -111.24, 0.18983, 3, -419.88, 38.84, 0.00138, 7, 22, -420.35, 31.66, 0.00546, 17, 364.8, 62.48, 0.12486, 18, 207.71, -42.14, 0.26611, 19, 73.33, -49.43, 0.28757, 20, -46.11, -70.49, 0.16677, 21, -129.51, -133.56, 0.14836, 3, -389.13, 47.88, 8.1E-4, 7, 22, -399.11, 28.98, 0.00747, 17, 345.49, 47.53, 0.17173, 18, 182.34, -50.62, 0.31858, 19, 45.87, -56.62, 0.26575, 20, -71.57, -84.96, 0.1256, 21, -150.85, -153.35, 0.11024, 3, -365.08, 62.86, 5.8E-4, 7, 22, -365.43, 66.79, 0.00956, 17, 319.95, 15.15, 0.2203, 18, 145.6, -61.95, 0.37151, 19, 9.60999, -63.26, 0.24136, 20, -101.06, -105.58, 0.08415, 21, -165.65, -187.83, 0.07272, 3, -333.3, 82.65, 3.7E-4, 7, 22, -312.31, 100.78, 0.01175, 17, 276.58, -30.61, 0.27125, 18, 85.52, -81.11, 0.42509, 19, -52.01, -76.62, 0.21336, 20, -154.2, -139.52, 0.04227, 21, -200.6, -240.31, 0.03607, 3, -278.65, 115.6, 1.7E-4, 6, 22, -242.48, 124.41, 0.01402, 17, 214.5, -70.36, 0.32389, 18, 11.97, -85.98, 0.47912, 19, -125.69, -74.48, 0.18281, 20, -224.04, -163.1, 1.1E-4, 21, -255.01, -290.05, 3.0E-5, 6, 22, -166.71, 150.07, 0.02469, 17, 147.14, -113.5, 0.57033, 18, -67.83999, -91.26, 0.38714, 19, -205.65, -72.16, 0.01755, 20, -299.83, -188.7, 2.0E-4, 21, -314.05, -344.03, 5.0E-5, 2, 22, -113.14, 135.84, 0.24192, 17, 91.72, -112.59, 0.75807, 2, 22, -42.12, 116.77, 0.14515, 17, 18.2, -111.17, 0.85484, 1, 22, 44.2, 107.1, 1, 2, 22, 140.09, 96.35, 0.22579, 43, 72.58999, 65.41, 0.7742, 4, 22, 137.69, 169.35, 0.05644, 43, 117.5, 123, 0.24355, 47, 78.3, 94.48, 0.2125, 48, 23.7, 91.74, 0.4875, 2, 47, 171.15, 111.98, 0.25, 48, 118.17, 93.15, 0.75, 1, 48, 158.96, -25.58, 1, 1, 3, -40.63, -86.01, 1, 3, 22, 67.33999, -86.66, 0.33215, 17, -137.02, 59.92, 0.08303, 3, 92.54, -90.61, 0.5848, 2, 22, 170.13, -66.29, 0.75, 43, -8.53, -78.72, 0.25, 2, 22, 231.74, -8.12, 0.4, 43, 76.03, -73.51999, 0.6, 5, 22, 222.04, 70.41, 0.16894, 43, 118.9, -7, 0.5373, 47, -6.58, -3.99, 0.17075, 48, -76.73, 9.18, 0.08551, 52, 45.05, -108.02, 0.03748, 1, 48, 50.43, -46.56, 1, 1, 43, -9.88, 20.65, 1, 2, 22, -53.22, 20.53, 0.2, 17, 5.8, -15.09, 0.8, 6, 22, -180.71, 32.22, 0.0849, 17, 132.35, 4.23999, 0.55723, 18, -23.98, 19.01, 0.34911, 19, -151.51, 33.43999, 0.0085, 20, -285.75, -70.86, 1.8E-4, 21, -348.66, -230.51, 5.0E-5, 7, 22, -304.22, 7.95, 0.0403, 17, 246.39, 57.53, 0.26453, 18, 101.61, 10.65, 0.41136, 19, -27.28, 13.2, 0.19982, 20, -162.22, -46.69, 0.04444, 21, -245.36, -158.59, 0.03938, 3, -272.64, 22.61, 1.4E-4, 7, 22, -418.56, -35.09999, 0.01926, 17, 346.99, 126.85, 0.12662, 18, 223.17, 22.83, 0.27476, 19, 94.88, 13.77, 0.24466, 20, -47.85, -3.72, 0.1726, 21, -158.02, -73.16, 0.16124, 3, -387.18, -18.91, 8.0E-4, 7, 22, -566.47, -40.57, 0.00611, 17, 489.24, 167.77, 0.04146, 18, 367.51, -9.96, 0.13446, 19, 235.45, -32.57, 0.21638, 20, 100.06, 1.62, 0.28346, 21, -24.81, -8.63, 0.31257, 3, -534.79, -26.69, 0.00552, 7, 22, -648.5, -15.19, 0.00311, 17, 574.96, 162.88, 0.02391, 18, 440.24, -55.6, 0.09894, 19, 303.52, -84.91, 0.20698, 20, 182.07, -23.8, 0.30202, 21, 60.48, 1.14, 0.35292, 3, -617.72, -4.84, 0.01208, 3, 43, 174.99, 22.22, 0.2, 47, 54.82, -19.14, 0.6, 48, -18.79999, -16.2, 0.2, 6, 22, -242.34, 20.11, 0.04821, 17, 189.25, 30.83, 0.31645, 18, 38.68, 14.84, 0.45752, 19, -89.52, 23.34, 0.17767, 20, -224.1, -58.8, 1.0E-4, 21, -297.11, -194.62, 3.0E-5, 7, 22, -359.57, -12.88, 0.03247, 17, 295.08, 91.08, 0.21317, 18, 160.45, 16.54, 0.3652, 19, 31.85, 13.48, 0.22126, 20, -106.86, -25.89, 0.08869, 21, -203.08, -117.24, 0.07889, 3, -328.24, 2.88, 2.8E-4, 7, 22, -488.69, -37.68999, 0.01113, 17, 414.43, 146.25, 0.07357, 18, 291.61, 7.27, 0.19521, 19, 161.53, -8.2, 0.2345, 20, 22.27, -1.17999, 0.23931, 21, -94.86, -42.56, 0.24398, 3, -457.15, -22.02, 0.00224, 7, 22, -607.64, -27.83, 0.00441, 17, 532.26, 165.32, 0.03117, 18, 404.01, -32.87, 0.11328, 19, 269.61, -58.84, 0.20984, 20, 141.21, -11.13, 0.29595, 21, 17.98, -3.72, 0.33702, 3, -576.34, -15.62, 0.00828, 1, 48, 26.4, -166.06, 1, 1, 48, 87.21, -106.12, 1, 1, 48, 108.19, -49.62, 1, 2, 48, 61.73, -82.12999, 0.50021, 52, 4.42, 52.83, 0.49978, 2, 48, 22.84, -109.4, 0.50021, 52, 51.52, 46.73, 0.49978, 5, 22, 348.39, 119.13, 0.00694, 43, 247.12, -50.52, 0.065, 47, 60.86, -121.4, 0.06027, 48, -30.3, -118, 0.48738, 52, 96.58, 17.21999, 0.38039, 1, 22, 26.73, 14.8, 1, 2, 22, -107.97, 25.67, 0.24192, 17, 60.17, -6.91, 0.75807, 5, 22, 235.53, 102.96, 0.07484, 43, 150.1, 9.35, 0.34943, 47, 27.64, -12.34, 0.40983, 48, -44.43, -4.87, 0.14928, 52, 34.03, -74.39, 0.0166, 5, 22, 227.15, 28.49, 0.29238, 43, 95.96, -42.46, 0.5708, 47, -47.23, -15.44, 0.07952, 48, -118.74, 4.84, 0.03982, 52, 84.85, -129.5, 0.01744, 2, 48, 5.19, -153.1, 0.87618, 52, 90.96, 71.21, 0.12381, 5, 22, 351.78, 108.85, 0.01127, 43, 243.13, -60.59, 0.10548, 47, 51.21, -126.33, 0.09782, 48, -40.65, -121.21, 0.46541, 52, 105.71, 17.33, 0.32, 1, 48, 23.69, -185.21, 1, 1, 48, 79.64, -175.94, 1, 1, 48, 93.96, -187.56, 1, 1, 48, 87.07, -206.55, 1, 1, 48, 64.19999, -216.74, 1, 1, 48, 52.23, -203.68, 1, 1, 48, 59.24, -187.03, 1, 1, 48, 64.26, -223.8, 1, 1, 48, 89.44, -211.41, 1, 1, 48, 102.04, -186.95, 1, 1, 48, 83.1, -166.14, 1, 1, 48, 46.84, -186.41, 1, 1, 48, 50.32, -204.36, 1, 1, 48, 41.7, -206.59, 1, 1, 48, 61.87, -230.97, 1, 7, 22, -448.12, -58.75, 0.01475, 17, 374.97, 143.6, 0.09709, 18, 256.29, 17.42, 0.23314, 19, 127.43, 2.07, 0.24171, 20, -13.35, -3.05, 0.20842, 21, -128.14, -55.46, 0.20349, 3, -421.47, -20.31, 0.00137, 7, 22, -519.55, -68.54, 0.0083, 17, 442.75, 168.18, 0.05534, 18, 327.21, 4.42, 0.16201, 19, 196.28, -19.32, 0.22526, 20, 58.71, -1.04999, 0.2645, 21, -62.24, -26.21, 0.28097, 3, -493.48, -23.91, 0.00358, 7, 22, -386.43, -41.34999, 0.02472, 17, 318.32, 113.62, 0.16236, 18, 192.26, 20.14, 0.31904, 19, 64.19, 12.44, 0.24198, 20, -76.55, -13.67, 0.13287, 21, -182.56, -89.31, 0.11857, 3, -358.52, -8.29, 4.3E-4, 2, 48, 56.98, -162.99, 0.89259, 52, 57.54, 112, 0.1074 ], + "vertices": [ 1, 8, 147.48, -145.48, 1, 1, 8, 89.4, -281.62, 1, 1, 8, -28.24, -285.93, 1, 1, 8, -14.58, -194.68, 1, 5, 2, 363.21, 87.73, 0.02179, 6, 238.39, -84.13, 0.20397, 7, 32.09999, -140.85, 0.18915, 8, -61.96, -132.26, 0.41197, 39, 129.57, 6.39, 0.1731, 5, 2, 332.7, 63.71, 0.06905, 6, 199.57, -83.03, 0.29424, 7, 3.69, -114.37, 0.2194, 8, -85.43, -101.32, 0.30859, 39, 127.34, -26.64, 0.1087, 5, 2, 307.08, 43.5, 0.11018, 6, 166.95, -82.12999, 0.37282, 7, -20.18, -92.14, 0.24572, 8, -105.18, -75.33999, 0.21862, 39, 123.08, -64.79, 0.05264, 5, 2, 307.75, 5.7, 0.18146, 6, 143.25, -111.59, 0.56512, 7, -57.43, -98.57, 0.12044, 8, -142.98, -75.33, 0.10715, 39, 154.85, -83.49, 0.0258, 2, 2, 308.7, -30.55, 0.25, 6, 120.75, -140.04, 0.75, 2, 2, 213.94, -142.7, 0.75, 6, -23.83, -165.45, 0.25, 3, 2, 64.44999, -187.34, 0.31139, 58, -158.45, 158.33, 0.10379, 1, 84.16, -190.98, 0.5848, 1, 1, -61.47, -178.84, 1, 7, 2, -193.84, -78.37, 0.01006, 58, 118.47, 114.74, 0.07207, 59, 17.17, 122.49, 0.17087, 60, -100.71, 132.55, 0.06655, 61, -272.53, 39.71, 0.0127, 62, -381.15, -123.99, 0.00106, 1, -166.91, -67.94999, 0.66666, 7, 2, -246.26, -74, 0.00847, 58, 170.4, 123.13, 0.06072, 59, 66.71, 104.77, 0.19505, 60, -53.08, 110.21, 0.11161, 61, -220.11, 35.3, 0.03559, 62, -331.4, -106.89, 0.02705, 1, -217.69, -61.33, 0.56148, 7, 2, -297.45, -69.74, 0.007, 58, 221.11, 131.31, 0.05019, 59, 115.07, 87.47, 0.2135, 60, -6.58, 88.39, 0.15181, 61, -168.92, 31, 0.05913, 62, -282.82, -90.19, 0.05445, 1, -267.66, -55.14, 0.46388, 7, 2, -322.38, -89.71, 0.00572, 58, 245.53, 147.45, 0.04099, 59, 146.51, 86.08, 0.22288, 60, 26.66, 83.39, 0.18428, 61, -134.99, 41.34, 0.0837, 62, -257.52, -60.65, 0.08408, 1, -298.87, -61.99, 0.37832, 7, 2, -359.24, -85.1, 0.00461, 58, 277.38, 161.09, 0.03306, 59, 178.73, 86.41, 0.22347, 60, 56.68, 81.29, 0.20919, 61, -107.13, 46.31, 0.10923, 62, -232.44, -51.26, 0.11589, 1, -328.68, -69.24, 0.30452, 7, 2, -376.16, -107.83, 0.00361, 58, 294.31, 176.47, 0.02591, 59, 203.26, 86.51, 0.21876, 60, 83.06, 77.01999, 0.2295, 61, -79.56, 53.53, 0.13534, 62, -210.89, -28.3, 0.14902, 1, -354.01, -75.41, 0.23783, 7, 2, -416.83, -99.41, 0.00301, 58, 329.83, 188.85, 0.02165, 59, 238.06, 85.41, 0.19918, 60, 115.65, 74.66, 0.23165, 61, -49.53, 60.58, 0.16135, 62, -185.49, -14.98, 0.18638, 1, -385.33, -83.15, 0.19674, 7, 2, -428.02, -116.81, 0.0025, 58, 343.12, 196.14, 0.01806, 59, 255.33, 78.85, 0.17874, 60, 133.83, 63.18, 0.23028, 61, -27.04, 56.84, 0.18642, 62, -163.58, -5.26, 0.22335, 1, -406.45, -79.89, 0.16063, 7, 2, -449.42, -116.23, 0.00209, 58, 364.17, 200.07, 0.01519, 59, 275.48, 71.62, 0.15813, 60, 152.97, 53.58, 0.22594, 61, -5.82, 53.94, 0.21024, 62, -142.85, 0.11, 0.25891, 1, -427.72, -77.47, 0.12944, 7, 2, -498.22, -88.19, 0.00178, 58, 411.52, 197.55, 0.0131, 59, 313.81, 53.61, 0.13839, 60, 188.04, 35.82, 0.21975, 61, 31.84, 49.3, 0.23251, 62, -106.46, 7.49, 0.2917, 1, -465.96, -72.58999, 0.10272, 7, 2, -524.31, -113.4, 0.00157, 58, 437.98, 213.03, 0.01186, 59, 345.74, 45.54, 0.12065, 60, 219.6, 19.28, 0.2131, 61, 68.31, 43.02, 0.25281, 62, -70.12999, 18.19, 0.32013, 1, -502.09, -68.19, 0.07983, 7, 2, -580.94, -76.79, 0.00148, 58, 494.56, 206.4, 0.01161, 59, 390.81, 21.3, 0.10603, 60, 261.62, -3.66, 0.20745, 61, 114.55, 37.83, 0.27063, 62, -26.15, 30.34, 0.34248, 1, -548.33, -63.22, 0.06027, 7, 2, -621.23, -53.98, 0.00153, 58, 539.16, 193.96, 0.01255, 59, 423.87, -11.11, 0.09566, 60, 291.46, -39.06, 0.20413, 61, 154.83, 14.99, 0.28529, 62, 19.91, 25.67, 0.35721, 1, -589.02, -42.19, 0.0436, 7, 2, -661.22, -31.34, 0.00173, 58, 583.41, 181.62, 0.01498, 59, 456.68, -43.27, 0.09054, 60, 321.06, -74.19999, 0.20422, 61, 194.79, -7.66, 0.29602, 62, 65.62, 21.04, 0.36309, 1, -629.78, -21.51, 0.02938, 7, 2, -698.76, 17.64, 0.00212, 58, 631.64, 143.1, 0.01928, 59, 480.34, -100.28, 0.09165, 60, 339.2, -133.2, 0.20843, 61, 232.3, -56.69, 0.30195, 62, 119.7, -8.68999, 0.35936, 1, -669.35, 25.71, 0.01717, 7, 2, -636.21, 0.4, 0.00186, 58, 566.79, 144.78, 0.02216, 59, 424.34, -67.51999, 0.09478, 60, 286.57, -95.27, 0.21971, 61, 169.77, -39.4, 0.30022, 62, 55.51, -18.08, 0.34915, 1, -606.08, 11.21, 0.01208, 7, 2, -596.68, -3.21, 0.00182, 58, 527.55, 138.78, 0.02791, 59, 387.08, -53.84, 0.10537, 60, 250.77, -78.11, 0.23429, 61, 130.24, -35.75, 0.29251, 62, 17.87, -30.67, 0.32978, 1, -566.25, 9.38, 0.00828, 7, 2, -553.14, -7.2, 0.00202, 58, 484.33, 132.17, 0.03718, 59, 346.04, -38.78, 0.12359, 60, 211.34, -59.22, 0.25059, 61, 86.7, -31.72, 0.27864, 62, -23.59, -44.54, 0.3024, 1, -522.33, 7.03, 0.00553, 7, 2, -516.96, -25.93, 0.00246, 58, 449.17, 125.97, 0.05073, 59, 311.45, -35.25, 0.14934, 60, 175.89, -56.83, 0.26648, 61, 51.53, -43.14, 0.2587, 62, -52.88, -67.87, 0.26867, 1, -487.23, 18.31, 0.00359, 7, 2, -479.88, 14.24, 0.00317, 58, 418.38, 93.72, 0.06938, 59, 269.72, -40.64, 0.18219, 60, 135.19, -53.82, 0.27948, 61, 13.42, -53.11, 0.23298, 62, -82.03, -93.66, 0.2305, 1, -449.1, 30.06, 0.00226, 7, 2, -451.64, 0.32, 0.00417, 58, 390.82, 86.58, 0.09392, 59, 241.19, -39.8, 0.22144, 60, 105.59, -52.93, 0.28715, 61, -16.25, -62.16, 0.20207, 62, -108.34, -111.24, 0.18983, 1, -419.88, 38.84, 0.00138, 7, 2, -420.35, 31.66, 0.00546, 58, 364.8, 62.48, 0.12486, 59, 207.71, -42.14, 0.26611, 60, 73.33, -49.43, 0.28757, 61, -46.11, -70.49, 0.16677, 62, -129.51, -133.56, 0.14836, 1, -389.13, 47.88, 8.1E-4, 7, 2, -399.11, 28.98, 0.00747, 58, 345.49, 47.53, 0.17173, 59, 182.34, -50.62, 0.31858, 60, 45.87, -56.62, 0.26575, 61, -71.57, -84.96, 0.1256, 62, -150.85, -153.35, 0.11024, 1, -365.08, 62.86, 5.8E-4, 7, 2, -365.43, 66.79, 0.00956, 58, 319.95, 15.15, 0.2203, 59, 145.6, -61.95, 0.37151, 60, 9.60999, -63.26, 0.24136, 61, -101.06, -105.58, 0.08415, 62, -165.65, -187.83, 0.07272, 1, -333.3, 82.65, 3.7E-4, 7, 2, -312.31, 100.78, 0.01175, 58, 276.58, -30.61, 0.27125, 59, 85.52, -81.11, 0.42509, 60, -52.01, -76.62, 0.21336, 61, -154.2, -139.52, 0.04227, 62, -200.6, -240.31, 0.03607, 1, -278.65, 115.6, 1.7E-4, 6, 2, -242.48, 124.41, 0.01402, 58, 214.5, -70.36, 0.32389, 59, 11.97, -85.98, 0.47912, 60, -125.69, -74.48, 0.18281, 61, -224.04, -163.1, 1.1E-4, 62, -255.01, -290.05, 3.0E-5, 6, 2, -166.71, 150.07, 0.02469, 58, 147.14, -113.5, 0.57033, 59, -67.83999, -91.26, 0.38714, 60, -205.65, -72.16, 0.01755, 61, -299.83, -188.7, 2.0E-4, 62, -314.05, -344.03, 5.0E-5, 2, 2, -113.14, 135.84, 0.24192, 58, 91.72, -112.59, 0.75807, 2, 2, -42.12, 116.77, 0.14515, 58, 18.2, -111.17, 0.85484, 1, 2, 44.2, 107.1, 1, 2, 2, 140.09, 96.35, 0.22579, 6, 72.58999, 65.41, 0.7742, 4, 2, 137.69, 169.35, 0.05644, 6, 117.5, 123, 0.24355, 7, 78.3, 94.48, 0.2125, 8, 23.7, 91.74, 0.4875, 2, 7, 171.15, 111.98, 0.25, 8, 118.17, 93.15, 0.75, 1, 8, 158.96, -25.58, 1, 1, 1, -40.63, -86.01, 1, 3, 2, 67.33999, -86.66, 0.33215, 58, -137.02, 59.92, 0.08303, 1, 92.54, -90.61, 0.5848, 2, 2, 170.13, -66.29, 0.75, 6, -8.53, -78.72, 0.25, 2, 2, 231.74, -8.12, 0.4, 6, 76.03, -73.51999, 0.6, 5, 2, 222.04, 70.41, 0.16894, 6, 118.9, -7, 0.5373, 7, -6.58, -3.99, 0.17075, 8, -76.73, 9.18, 0.08551, 39, 45.05, -108.02, 0.03748, 1, 8, 50.43, -46.56, 1, 1, 6, -9.88, 20.65, 1, 2, 2, -53.22, 20.53, 0.2, 58, 5.8, -15.09, 0.8, 6, 2, -180.71, 32.22, 0.0849, 58, 132.35, 4.23999, 0.55723, 59, -23.98, 19.01, 0.34911, 60, -151.51, 33.43999, 0.0085, 61, -285.75, -70.86, 1.8E-4, 62, -348.66, -230.51, 5.0E-5, 7, 2, -304.22, 7.95, 0.0403, 58, 246.39, 57.53, 0.26453, 59, 101.61, 10.65, 0.41136, 60, -27.28, 13.2, 0.19982, 61, -162.22, -46.69, 0.04444, 62, -245.36, -158.59, 0.03938, 1, -272.64, 22.61, 1.4E-4, 7, 2, -418.56, -35.09999, 0.01926, 58, 346.99, 126.85, 0.12662, 59, 223.17, 22.83, 0.27476, 60, 94.88, 13.77, 0.24466, 61, -47.85, -3.72, 0.1726, 62, -158.02, -73.16, 0.16124, 1, -387.18, -18.91, 8.0E-4, 7, 2, -566.47, -40.57, 0.00611, 58, 489.24, 167.77, 0.04146, 59, 367.51, -9.96, 0.13446, 60, 235.45, -32.57, 0.21638, 61, 100.06, 1.62, 0.28346, 62, -24.81, -8.63, 0.31257, 1, -534.79, -26.69, 0.00552, 7, 2, -648.5, -15.19, 0.00311, 58, 574.96, 162.88, 0.02391, 59, 440.24, -55.6, 0.09894, 60, 303.52, -84.91, 0.20698, 61, 182.07, -23.8, 0.30202, 62, 60.48, 1.14, 0.35292, 1, -617.72, -4.84, 0.01208, 3, 6, 174.99, 22.22, 0.2, 7, 54.82, -19.14, 0.6, 8, -18.79999, -16.2, 0.2, 6, 2, -242.34, 20.11, 0.04821, 58, 189.25, 30.83, 0.31645, 59, 38.68, 14.84, 0.45752, 60, -89.52, 23.34, 0.17767, 61, -224.1, -58.8, 1.0E-4, 62, -297.11, -194.62, 3.0E-5, 7, 2, -359.57, -12.88, 0.03247, 58, 295.08, 91.08, 0.21317, 59, 160.45, 16.54, 0.3652, 60, 31.85, 13.48, 0.22126, 61, -106.86, -25.89, 0.08869, 62, -203.08, -117.24, 0.07889, 1, -328.24, 2.88, 2.8E-4, 7, 2, -488.69, -37.68999, 0.01113, 58, 414.43, 146.25, 0.07357, 59, 291.61, 7.27, 0.19521, 60, 161.53, -8.2, 0.2345, 61, 22.27, -1.17999, 0.23931, 62, -94.86, -42.56, 0.24398, 1, -457.15, -22.02, 0.00224, 7, 2, -607.64, -27.83, 0.00441, 58, 532.26, 165.32, 0.03117, 59, 404.01, -32.87, 0.11328, 60, 269.61, -58.84, 0.20984, 61, 141.21, -11.13, 0.29595, 62, 17.98, -3.72, 0.33702, 1, -576.34, -15.62, 0.00828, 1, 8, 26.4, -166.06, 1, 1, 8, 87.21, -106.12, 1, 1, 8, 108.19, -49.62, 1, 2, 8, 61.73, -82.12999, 0.50021, 39, 4.42, 52.83, 0.49978, 2, 8, 22.84, -109.4, 0.50021, 39, 51.52, 46.73, 0.49978, 5, 2, 348.39, 119.13, 0.00694, 6, 247.12, -50.52, 0.065, 7, 60.86, -121.4, 0.06027, 8, -30.3, -118, 0.48738, 39, 96.58, 17.21999, 0.38039, 1, 2, 26.73, 14.8, 1, 2, 2, -107.97, 25.67, 0.24192, 58, 60.17, -6.91, 0.75807, 5, 2, 235.53, 102.96, 0.07484, 6, 150.1, 9.35, 0.34943, 7, 27.64, -12.34, 0.40983, 8, -44.43, -4.87, 0.14928, 39, 34.03, -74.39, 0.0166, 5, 2, 227.15, 28.49, 0.29238, 6, 95.96, -42.46, 0.5708, 7, -47.23, -15.44, 0.07952, 8, -118.74, 4.84, 0.03982, 39, 84.85, -129.5, 0.01744, 2, 8, 5.19, -153.1, 0.87618, 39, 90.96, 71.21, 0.12381, 5, 2, 351.78, 108.85, 0.01127, 6, 243.13, -60.59, 0.10548, 7, 51.21, -126.33, 0.09782, 8, -40.65, -121.21, 0.46541, 39, 105.71, 17.33, 0.32, 1, 8, 23.69, -185.21, 1, 1, 8, 79.64, -175.94, 1, 1, 8, 93.96, -187.56, 1, 1, 8, 87.07, -206.55, 1, 1, 8, 64.19999, -216.74, 1, 1, 8, 52.23, -203.68, 1, 1, 8, 59.24, -187.03, 1, 1, 8, 64.26, -223.8, 1, 1, 8, 89.44, -211.41, 1, 1, 8, 102.04, -186.95, 1, 1, 8, 83.1, -166.14, 1, 1, 8, 46.84, -186.41, 1, 1, 8, 50.32, -204.36, 1, 1, 8, 41.7, -206.59, 1, 1, 8, 61.87, -230.97, 1, 7, 2, -448.12, -58.75, 0.01475, 58, 374.97, 143.6, 0.09709, 59, 256.29, 17.42, 0.23314, 60, 127.43, 2.07, 0.24171, 61, -13.35, -3.05, 0.20842, 62, -128.14, -55.46, 0.20349, 1, -421.47, -20.31, 0.00137, 7, 2, -519.55, -68.54, 0.0083, 58, 442.75, 168.18, 0.05534, 59, 327.21, 4.42, 0.16201, 60, 196.28, -19.32, 0.22526, 61, 58.71, -1.04999, 0.2645, 62, -62.24, -26.21, 0.28097, 1, -493.48, -23.91, 0.00358, 7, 2, -386.43, -41.34999, 0.02472, 58, 318.32, 113.62, 0.16236, 59, 192.26, 20.14, 0.31904, 60, 64.19, 12.44, 0.24198, 61, -76.55, -13.67, 0.13287, 62, -182.56, -89.31, 0.11857, 1, -358.52, -8.29, 4.3E-4, 2, 8, 56.98, -162.99, 0.89259, 39, 57.54, 112, 0.1074 ], "hull": 46, "edges": [ 22, 20, 20, 18, 18, 16, 6, 4, 4, 2, 90, 88, 54, 52, 52, 50, 24, 22, 88, 86, 86, 84, 8, 6, 24, 26, 26, 28, 72, 74, 74, 76, 70, 72, 46, 48, 48, 50, 54, 56, 56, 58, 80, 82, 82, 84, 76, 78, 78, 80, 8, 10, 10, 12, 12, 14, 14, 16, 0, 90, 0, 2, 62, 64, 64, 66, 40, 42, 58, 60, 60, 62, 42, 44, 44, 46, 66, 68, 68, 70, 32, 34, 34, 36, 52, 116, 116, 126, 126, 114, 114, 184, 184, 124, 124, 182, 182, 112, 112, 186, 186, 122, 122, 110, 110, 120, 120, 108, 108, 142, 142, 106, 106, 140, 140, 104, 92, 94, 94, 96, 96, 98, 98, 146, 146, 100, 100, 144, 144, 118, 118, 102, 8, 150, 150, 138, 138, 136, 136, 134, 134, 132, 156, 154, 154, 164, 164, 162, 162, 160, 160, 158, 158, 156, 180, 178, 178, 174, 174, 188, 188, 172, 170, 168, 28, 30, 30, 32, 36, 38, 38, 40 ], "width": 1219, @@ -378,10 +384,10 @@ }, "raptor_front_arm": { "raptor_front_arm": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.39562, 0.1396, 0.3877, 0.30212, 0.3123, 0.41784, 0.27287, 0.47835, 0.33388, 0.4507, 0.54879, 0.35328, 0.64092, 0.31152, 0.73024, 0.36529, 1, 0.5277, 1, 0.86606, 0.93242, 1, 0.86176, 0.80967, 0.75576, 0.99765, 0.71748, 1, 0.70276, 0.77442, 0.62031, 0.73448, 0.58792, 0.64519, 0.53561, 0.6582, 0.13448, 0.75798, 0, 0.69218, 0.01846, 0.56357, 0.05498, 0.30917, 0, 0.27863, 0, 0.12423, 0, 0, 0.19596, 0, 0.40242, 0, 0.24536, 0.1924, 0.21678, 0.0811 ], "triangles": [ 0, 28, 26, 23, 25, 28, 28, 25, 26, 23, 24, 25, 6, 7, 16, 6, 16, 5, 15, 16, 7, 7, 14, 15, 8, 14, 7, 11, 14, 8, 11, 8, 9, 12, 14, 11, 13, 14, 12, 10, 11, 9, 17, 4, 5, 16, 17, 5, 18, 19, 3, 18, 3, 4, 18, 4, 17, 27, 28, 0, 27, 22, 23, 27, 23, 28, 1, 27, 0, 21, 22, 27, 21, 27, 1, 2, 21, 1, 2, 20, 21, 3, 20, 2, 19, 20, 3 ], - "vertices": [ 2, 63, 3.06, 31.88, 0.51075, 43, 66.56, -109.48, 0.48924, 1, 63, 35.87, 35.62, 1, 2, 63, 60.94, 27.12, 0.8464, 64, 46.49, 31.12, 0.15358, 3, 63, 74.05, 22.67, 0.34375, 64, 36.5, 21.53, 0.64062, 65, -45.25, -29.96, 0.01562, 3, 63, 67, 31.58, 0.10937, 64, 47.66, 23.68, 0.78125, 65, -40.93, -19.44, 0.10937, 3, 63, 42.17, 62.99, 0.01562, 64, 86.98, 31.24, 0.64062, 65, -25.75, 17.61, 0.34375, 2, 64, 103.83, 34.49, 0.34375, 65, -19.24, 33.49, 0.65625, 2, 64, 114.04, 19.51, 0.10937, 65, -1.11, 33.84, 0.89062, 2, 64, 144.85, -25.73, 0.02083, 65, 53.62, 34.88, 0.97916, 1, 65, 96.03, -19.16, 1, 1, 65, 104.2, -47.31, 1, 1, 65, 71.33999, -23.98, 1, 1, 65, 81.39, -64.61, 1, 1, 65, 76.8, -68.81, 1, 2, 64, 83.18, -57.72, 0.02083, 65, 46.65, -34.25, 0.97916, 2, 64, 73.12999, -45.76, 0.10937, 65, 31.14, -36.12, 0.89062, 2, 64, 73.98, -26.9, 0.34375, 65, 15.82, -25.09, 0.65625, 3, 63, 103.67, 70.28, 0.01562, 64, 65.1, -26.69, 0.64062, 65, 10.78, -32.41, 0.34375, 3, 63, 133.56, 9.13, 0.10937, 64, -2.94, -25.03, 0.78125, 65, -27.84, -88.47, 0.10937, 3, 63, 123.67, -14.42, 0.34375, 64, -19.29, -5.39, 0.64062, 65, -53.23, -91.41, 0.01562, 2, 63, 97.41, -15.43, 0.8464, 64, -8.08, 18.37, 0.15358, 1, 63, 45.46, -17.43, 1, 2, 63, 40.68999, -27.17, 0.45035, 43, -1.69, -93.8, 0.54964, 2, 63, -2.74, -29.63, 0.44352, 43, 18.99, -72.93, 0.55646, 1, 43, 32.11, -48.45, 1, 1, 43, 57.56, -67.43, 1, 1, 43, 84.38, -87.42, 1, 2, 63, 16.44, 5.21, 0.7182, 43, 46.31, -101.86, 0.28178, 2, 63, -4.51, 5.32, 0.48851, 43, 52.82, -81.94, 0.51147 ], + "vertices": [ 2, 21, 3.06, 31.88, 0.51075, 6, 66.56, -109.48, 0.48924, 1, 21, 35.87, 35.62, 1, 2, 21, 60.94, 27.12, 0.8464, 22, 46.49, 31.12, 0.15358, 3, 21, 74.05, 22.67, 0.34375, 22, 36.5, 21.53, 0.64062, 31, -45.25, -29.96, 0.01562, 3, 21, 67, 31.58, 0.10937, 22, 47.66, 23.68, 0.78125, 31, -40.93, -19.44, 0.10937, 3, 21, 42.17, 62.99, 0.01562, 22, 86.98, 31.24, 0.64062, 31, -25.75, 17.61, 0.34375, 2, 22, 103.83, 34.49, 0.34375, 31, -19.24, 33.49, 0.65625, 2, 22, 114.04, 19.51, 0.10937, 31, -1.11, 33.84, 0.89062, 2, 22, 144.85, -25.73, 0.02083, 31, 53.62, 34.88, 0.97916, 1, 31, 96.03, -19.16, 1, 1, 31, 104.2, -47.31, 1, 1, 31, 71.33999, -23.98, 1, 1, 31, 81.39, -64.61, 1, 1, 31, 76.8, -68.81, 1, 2, 22, 83.18, -57.72, 0.02083, 31, 46.65, -34.25, 0.97916, 2, 22, 73.12999, -45.76, 0.10937, 31, 31.14, -36.12, 0.89062, 2, 22, 73.98, -26.9, 0.34375, 31, 15.82, -25.09, 0.65625, 3, 21, 103.67, 70.28, 0.01562, 22, 65.1, -26.69, 0.64062, 31, 10.78, -32.41, 0.34375, 3, 21, 133.56, 9.13, 0.10937, 22, -2.94, -25.03, 0.78125, 31, -27.84, -88.47, 0.10937, 3, 21, 123.67, -14.42, 0.34375, 22, -19.29, -5.39, 0.64062, 31, -53.23, -91.41, 0.01562, 2, 21, 97.41, -15.43, 0.8464, 22, -8.08, 18.37, 0.15358, 1, 21, 45.46, -17.43, 1, 2, 21, 40.68999, -27.17, 0.45035, 6, -1.69, -93.8, 0.54964, 2, 21, -2.74, -29.63, 0.44352, 6, 18.99, -72.93, 0.55646, 1, 6, 32.11, -48.45, 1, 1, 6, 57.56, -67.43, 1, 1, 6, 84.38, -87.42, 1, 2, 21, 16.44, 5.21, 0.7182, 6, 46.31, -101.86, 0.28178, 2, 21, -4.51, 5.32, 0.48851, 6, 52.82, -81.94, 0.51147 ], "hull": 27, "edges": [ 38, 36, 32, 30, 30, 28, 28, 26, 24, 26, 24, 22, 22, 20, 20, 18, 18, 16, 44, 42, 38, 6, 38, 40, 40, 42, 6, 4, 4, 2, 40, 4, 8, 6, 36, 8, 32, 12, 42, 2, 52, 0, 0, 2, 16, 14, 14, 12, 30, 14, 36, 34, 34, 32, 12, 10, 10, 8, 34, 10, 48, 50, 50, 52, 44, 46, 46, 48, 50, 56, 56, 54 ], "width": 162, @@ -390,10 +396,10 @@ }, "raptor_front_leg": { "raptor_front_leg": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.55116, 0.17817, 0.6279, 0.36027, 0.6671, 0.4533, 0.64879, 0.51527, 0.53553, 0.56893, 0.32335, 0.66946, 0.28674, 0.72086, 0.32538, 0.804, 0.36258, 0.80144, 0.42056, 0.79744, 0.61015, 0.78435, 0.84813, 0.84028, 1, 0.93854, 0.62439, 0.91738, 0.72812, 1, 0.58574, 1, 0.36707, 0.96667, 0.26306, 0.95082, 0.16266, 0.93552, 0.03859, 0.72237, 0, 0.66946, 0.0374, 0.62999, 0.1647, 0.49562, 0.23731, 0.4568, 0.27019, 0.43923, 0.28063, 0.43364, 0.223, 0.4057, 0.12565, 0.35851, 0, 0.29759, 0, 0.1524, 0, 0, 0.32132, 0, 0.32222, 0.22778, 0.4493, 0.38031, 0.47664, 0.44361, 0.4615, 0.47375, 0.35106, 0.53247, 0.20091, 0.65256, 0.18527, 0.72148, 0.25222, 0.86314, 0.30941, 0.88124, 0.55694, 0.89613, 0.55857, 0.89207, 0.47493, 0.85339, 0.6059, 0.91526, 0.39705, 0.89129, 0.13229, 0.09352, 0.36997, 0.45345, 0.37163, 0.43827, 0.32515, 0.39424, 0.23759, 0.34425, 0.34065, 0.47414 ], "triangles": [ 46, 30, 31, 15, 44, 13, 13, 11, 12, 11, 13, 10, 10, 13, 42, 13, 44, 42, 41, 43, 42, 42, 43, 10, 43, 9, 10, 41, 42, 44, 45, 41, 44, 45, 43, 41, 14, 15, 13, 16, 45, 15, 15, 45, 44, 17, 40, 16, 16, 40, 45, 45, 40, 8, 45, 9, 43, 45, 8, 9, 18, 39, 17, 17, 39, 40, 18, 38, 39, 18, 19, 38, 40, 7, 8, 40, 39, 7, 39, 6, 7, 39, 38, 6, 20, 21, 19, 19, 21, 38, 38, 37, 6, 38, 21, 37, 6, 37, 5, 5, 36, 4, 5, 37, 36, 36, 23, 51, 36, 37, 23, 21, 22, 37, 37, 22, 23, 36, 35, 4, 4, 35, 3, 36, 47, 35, 36, 51, 47, 35, 34, 3, 3, 34, 2, 23, 24, 51, 51, 24, 47, 47, 48, 35, 35, 48, 34, 24, 25, 47, 47, 25, 48, 34, 1, 2, 48, 33, 34, 34, 33, 1, 25, 49, 48, 48, 49, 33, 25, 26, 49, 26, 50, 49, 26, 27, 50, 33, 49, 32, 49, 50, 32, 33, 0, 1, 33, 32, 0, 50, 27, 46, 32, 50, 46, 46, 27, 28, 28, 29, 46, 46, 31, 32, 32, 31, 0, 29, 30, 46 ], - "vertices": [ 3, 11, 128.03, 88.47, 0.83908, 12, -70.19999, -134.13, 0.01331, 3, 158.83, -71.91, 0.1476, 2, 11, 219.55, 53.15, 0.77988, 12, -48.04, -38.58, 0.22011, 3, 11, 266.3, 35.09999, 0.5353, 12, -36.73, 10.22, 0.46443, 14, 127.25, 245.46, 2.4E-4, 4, 11, 286.89, 9.79, 0.35076, 12, -14.56, 34.14, 0.64667, 14, 125.69, 212.88, 0.0023, 15, 101.39, 199.13, 2.5E-4, 4, 11, 281.54, -41.24, 0.09169, 12, 36.71, 36, 0.90196, 14, 87.64, 178.44, 0.00513, 15, 58.29, 171.29, 0.00119, 5, 11, 271.53, -136.86, 0.05608, 12, 132.77, 39.48, 0.69232, 13, 34.99, 78.76, 0.22087, 14, 16.37999, 113.93, 0.0224, 15, -22.45, 119.13, 0.0083, 5, 11, 283.51, -164.25, 0.01987, 12, 158.21, 55.17, 0.50334, 13, 52.65, 54.63, 0.3617, 14, 7.01, 85.54, 0.08322, 15, -36.28, 92.63, 0.03184, 6, 11, 326.15, -179.3, 0.00798, 12, 167.14, 99.49, 0.21327, 13, 97.55, 49.25, 0.35075, 14, 28.72, 45.87, 0.14106, 15, -21.26, 49.99, 0.22311, 16, -72.29, 25.96, 0.0638, 6, 11, 333.96, -167.35, 0.00242, 12, 154.22, 105.55, 0.07519, 13, 102.57, 62.6, 0.22995, 14, 42.51, 49.55, 0.2831, 15, -7.06, 51.39, 0.2694, 16, -58.17, 28.03, 0.13992, 6, 11, 344.19, -149.68, 4.9E-4, 12, 134.24, 114.44, 0.0176, 13, 109.72, 83.39, 0.11397, 14, 64.08999, 55.23, 0.07976, 15, 15.12, 53.51, 0.36292, 16, -36.09, 31.19, 0.42523, 1, 16, 35.8, 41.81, 1, 1, 16, 128.11, 17.93, 1, 1, 16, 188.72, -29.42, 1, 1, 16, 44.86, -26.17, 1, 1, 15, 133.17, -49.83, 1, 1, 15, 78.78, -50.15, 1, 5, 11, 399.32, -220.02, 2.2E-4, 12, 195.56, 179.43, 0.01703, 13, 179.46, 27.52, 0.2372, 14, 58.34, -33.93, 0.2023, 15, -4.91, -33.55, 0.54324, 5, 11, 370.41, -244.91, 3.2E-4, 12, 225.9, 152.49, 0.02513, 13, 155.04, -5.13, 0.35003, 14, 17.87999, -32.5, 0.29852, 15, -44.62, -25.61, 0.32598, 5, 11, 340.37, -270.04, 0.00251, 12, 254.98, 126.27, 0.10129, 13, 131.21, -36.2, 0.54075, 14, -21.24, -31.17, 0.2082, 15, -83.01999, -17.96999, 0.14723, 5, 11, 225.1, -238.94, 0.01529, 12, 240.33, 7.81, 0.24036, 13, 11.94, -30.98, 0.5788, 14, -86.31, 68.9, 0.12023, 15, -131.06, 91.29, 0.04528, 5, 11, 194.64, -233.55, 0.04819, 12, 239.26, -23.1, 0.40427, 13, -18.95999, -32.37, 0.48451, 14, -105.4, 93.25, 0.04604, 15, -145.97, 118.4, 0.01696, 5, 11, 187.65, -209.73, 0.09565, 12, 216.66, -33.34999, 0.57617, 13, -30.97, -10.65, 0.30651, 14, -94.71, 115.65, 0.01788, 15, -131.8, 138.78, 0.00376, 4, 11, 163.85, -128.67, 0.19533, 12, 139.75, -68.26, 0.8011, 14, -58.32, 191.88, 0.00327, 15, -83.58, 208.13, 2.9E-4, 4, 11, 165.74, -94.49, 0.31921, 12, 105.59, -71.26, 0.6795, 14, -5.04, 220.72, 0.00116, 15, -56.32, 275.96, 1.0E-4, 4, 11, 166.39, -79.07, 0.46205, 12, 90.23, -72.76, 0.53752, 14, 5.55, 230.48, 3.9E-4, 15, -40.61, 286.16, 2.0E-5, 3, 11, 166.49, -74.17, 0.53779, 12, 85.42, -73.28, 0.46208, 14, -19.99, 230.7, 1.2E-4, 2, 11, 141.54, -82.46, 0.73138, 12, 97.13, -96.82, 0.26861, 3, 11, 99.76, -97.08, 0.81379, 12, 117.34, -136.23, 0.13997, 3, -2.56, -164.19, 0.04623, 3, 11, 45.01, -114.56, 0.8186, 12, 142.41, -187.89, 0.02098, 3, -51.09, -135.29, 0.1604, 3, 11, -16.2, -74.76, 0.62389, 12, 113.82, -253.08, 0.00952, 3, -42.95, -58.38, 0.36658, 2, 11, -74.73, -19.33, 0.31468, 3, -52.66, 17.54999, 0.68531, 2, 11, 1.67, 76.75, 0.25576, 3, 70.07, 18.78, 0.74423, 1, 11, 93.54, 4.13, 1, 2, 11, 185.14, -6.66, 0.75461, 12, 15.98, -64.26999, 0.24538, 2, 11, 217.11, -18.75, 0.50844, 12, 23.47, -30.93, 0.49154, 3, 11, 225.63, -32.91999, 0.32512, 12, 36.3, -20.5, 0.6744, 14, 51.57, 221.95, 4.7E-4, 4, 11, 223, -84.73, 0.20061, 12, 87.96, -15.86, 0.79287, 14, 15.03, 185.13, 0.00581, 15, -12.28, 189.61, 6.9E-4, 5, 11, 235.61, -168.06, 0.07777, 12, 168.69, 8.29, 0.54931, 13, 6.74, 40.47, 0.33413, 14, -31.18, 114.66, 0.0321, 15, -69.26999, 127.55, 0.00667, 5, 11, 259.63, -194.79, 0.01921, 12, 191.79, 35.8, 0.30498, 13, 36, 19.62, 0.53642, 14, -31.14, 78.74, 0.09568, 15, -75.03, 92.09, 0.04369, 5, 11, 332.55, -220.1, 0.00292, 12, 206.64, 111.53, 0.10776, 13, 112.69, 10.82, 0.51915, 14, 6.25, 11.23, 0.23449, 15, -49.03, 19.43, 0.13565, 4, 12, 192.51, 130.62, 0.03213, 13, 130.6, 26.41, 0.33941, 14, 29.35, 5.71, 0.27333, 15, -27.12, 10.25, 0.35511, 1, 16, 18.54999, -16.62999, 1, 1, 16, 19.07, -14.51, 1, 6, 11, 381.55, -150.4, 3.0E-4, 12, 130.71, 150.34, 0.00811, 13, 145.36, 89.53, 0.04102, 14, 89.29, 30.41, 0.02558, 15, 36, 24.95, 0.37636, 16, -13.89, 3.64, 0.5486, 1, 16, 37.75, -25.46, 1, 4, 12, 164.9, 153.55, 0.02263, 13, 151.18, 56, 0.23908, 14, 65.44, 5.55, 0.19254, 15, 8.45, 4.27, 0.54574, 2, 11, -9.28, -17.5, 0.59605, 3, 7.72, -30.85, 0.40393, 3, 11, 195.9, -53.81, 0.42356, 12, 61.11, -47.06, 0.57612, 14, 39.7, 225.21, 2.9E-4, 3, 11, 190.1, -48.45, 0.53227, 12, 56.61, -53.56, 0.46765, 14, 39.83, 233.12, 6.0E-5, 2, 11, 161.26, -48.26, 0.79873, 12, 60.44, -82.12999, 0.20126, 3, 11, 120.37, -58.54, 0.8485, 12, 76.31, -121.18, 0.14441, 3, 41.04, -161.4, 0.00707, 4, 11, 197.37, -69.23, 0.33487, 12, 76.17, -43.46, 0.66324, 14, 30.34, 213.88, 0.0017, 15, -9.09, 262.42, 1.8E-4 ], + "vertices": [ 3, 25, 128.03, 88.47, 0.83908, 26, -70.19999, -134.13, 0.01331, 1, 158.83, -71.91, 0.1476, 2, 25, 219.55, 53.15, 0.77988, 26, -48.04, -38.58, 0.22011, 3, 25, 266.3, 35.09999, 0.5353, 26, -36.73, 10.22, 0.46443, 28, 127.25, 245.46, 2.4E-4, 4, 25, 286.89, 9.79, 0.35076, 26, -14.56, 34.14, 0.64667, 28, 125.69, 212.88, 0.0023, 29, 101.39, 199.13, 2.5E-4, 4, 25, 281.54, -41.24, 0.09169, 26, 36.71, 36, 0.90196, 28, 87.64, 178.44, 0.00513, 29, 58.29, 171.29, 0.00119, 5, 25, 271.53, -136.86, 0.05608, 26, 132.77, 39.48, 0.69232, 27, 34.99, 78.76, 0.22087, 28, 16.37999, 113.93, 0.0224, 29, -22.45, 119.13, 0.0083, 5, 25, 283.51, -164.25, 0.01987, 26, 158.21, 55.17, 0.50334, 27, 52.65, 54.63, 0.3617, 28, 7.01, 85.54, 0.08322, 29, -36.28, 92.63, 0.03184, 6, 25, 326.15, -179.3, 0.00798, 26, 167.14, 99.49, 0.21327, 27, 97.55, 49.25, 0.35075, 28, 28.72, 45.87, 0.14106, 29, -21.26, 49.99, 0.22311, 30, -72.29, 25.96, 0.0638, 6, 25, 333.96, -167.35, 0.00242, 26, 154.22, 105.55, 0.07519, 27, 102.57, 62.6, 0.22995, 28, 42.51, 49.55, 0.2831, 29, -7.06, 51.39, 0.2694, 30, -58.17, 28.03, 0.13992, 6, 25, 344.19, -149.68, 4.9E-4, 26, 134.24, 114.44, 0.0176, 27, 109.72, 83.39, 0.11397, 28, 64.08999, 55.23, 0.07976, 29, 15.12, 53.51, 0.36292, 30, -36.09, 31.19, 0.42523, 1, 30, 35.8, 41.81, 1, 1, 30, 128.11, 17.93, 1, 1, 30, 188.72, -29.42, 1, 1, 30, 44.86, -26.17, 1, 1, 29, 133.17, -49.83, 1, 1, 29, 78.78, -50.15, 1, 5, 25, 399.32, -220.02, 2.2E-4, 26, 195.56, 179.43, 0.01703, 27, 179.46, 27.52, 0.2372, 28, 58.34, -33.93, 0.2023, 29, -4.91, -33.55, 0.54324, 5, 25, 370.41, -244.91, 3.2E-4, 26, 225.9, 152.49, 0.02513, 27, 155.04, -5.13, 0.35003, 28, 17.87999, -32.5, 0.29852, 29, -44.62, -25.61, 0.32598, 5, 25, 340.37, -270.04, 0.00251, 26, 254.98, 126.27, 0.10129, 27, 131.21, -36.2, 0.54075, 28, -21.24, -31.17, 0.2082, 29, -83.01999, -17.96999, 0.14723, 5, 25, 225.1, -238.94, 0.01529, 26, 240.33, 7.81, 0.24036, 27, 11.94, -30.98, 0.5788, 28, -86.31, 68.9, 0.12023, 29, -131.06, 91.29, 0.04528, 5, 25, 194.64, -233.55, 0.04819, 26, 239.26, -23.1, 0.40427, 27, -18.95999, -32.37, 0.48451, 28, -105.4, 93.25, 0.04604, 29, -145.97, 118.4, 0.01696, 5, 25, 187.65, -209.73, 0.09565, 26, 216.66, -33.34999, 0.57617, 27, -30.97, -10.65, 0.30651, 28, -94.71, 115.65, 0.01788, 29, -131.8, 138.78, 0.00376, 4, 25, 163.85, -128.67, 0.19533, 26, 139.75, -68.26, 0.8011, 28, -58.32, 191.88, 0.00327, 29, -83.58, 208.13, 2.9E-4, 4, 25, 165.74, -94.49, 0.31921, 26, 105.59, -71.26, 0.6795, 28, -5.04, 220.72, 0.00116, 29, -56.32, 275.96, 1.0E-4, 4, 25, 166.39, -79.07, 0.46205, 26, 90.23, -72.76, 0.53752, 28, 5.55, 230.48, 3.9E-4, 29, -40.61, 286.16, 2.0E-5, 3, 25, 166.49, -74.17, 0.53779, 26, 85.42, -73.28, 0.46208, 28, -19.99, 230.7, 1.2E-4, 2, 25, 141.54, -82.46, 0.73138, 26, 97.13, -96.82, 0.26861, 3, 25, 99.76, -97.08, 0.81379, 26, 117.34, -136.23, 0.13997, 1, -2.56, -164.19, 0.04623, 3, 25, 45.01, -114.56, 0.8186, 26, 142.41, -187.89, 0.02098, 1, -51.09, -135.29, 0.1604, 3, 25, -16.2, -74.76, 0.62389, 26, 113.82, -253.08, 0.00952, 1, -42.95, -58.38, 0.36658, 2, 25, -74.73, -19.33, 0.31468, 1, -52.66, 17.54999, 0.68531, 2, 25, 1.67, 76.75, 0.25576, 1, 70.07, 18.78, 0.74423, 1, 25, 93.54, 4.13, 1, 2, 25, 185.14, -6.66, 0.75461, 26, 15.98, -64.26999, 0.24538, 2, 25, 217.11, -18.75, 0.50844, 26, 23.47, -30.93, 0.49154, 3, 25, 225.63, -32.91999, 0.32512, 26, 36.3, -20.5, 0.6744, 28, 51.57, 221.95, 4.7E-4, 4, 25, 223, -84.73, 0.20061, 26, 87.96, -15.86, 0.79287, 28, 15.03, 185.13, 0.00581, 29, -12.28, 189.61, 6.9E-4, 5, 25, 235.61, -168.06, 0.07777, 26, 168.69, 8.29, 0.54931, 27, 6.74, 40.47, 0.33413, 28, -31.18, 114.66, 0.0321, 29, -69.26999, 127.55, 0.00667, 5, 25, 259.63, -194.79, 0.01921, 26, 191.79, 35.8, 0.30498, 27, 36, 19.62, 0.53642, 28, -31.14, 78.74, 0.09568, 29, -75.03, 92.09, 0.04369, 5, 25, 332.55, -220.1, 0.00292, 26, 206.64, 111.53, 0.10776, 27, 112.69, 10.82, 0.51915, 28, 6.25, 11.23, 0.23449, 29, -49.03, 19.43, 0.13565, 4, 26, 192.51, 130.62, 0.03213, 27, 130.6, 26.41, 0.33941, 28, 29.35, 5.71, 0.27333, 29, -27.12, 10.25, 0.35511, 1, 30, 18.54999, -16.62999, 1, 1, 30, 19.07, -14.51, 1, 6, 25, 381.55, -150.4, 3.0E-4, 26, 130.71, 150.34, 0.00811, 27, 145.36, 89.53, 0.04102, 28, 89.29, 30.41, 0.02558, 29, 36, 24.95, 0.37636, 30, -13.89, 3.64, 0.5486, 1, 30, 37.75, -25.46, 1, 4, 26, 164.9, 153.55, 0.02263, 27, 151.18, 56, 0.23908, 28, 65.44, 5.55, 0.19254, 29, 8.45, 4.27, 0.54574, 2, 25, -9.28, -17.5, 0.59605, 1, 7.72, -30.85, 0.40393, 3, 25, 195.9, -53.81, 0.42356, 26, 61.11, -47.06, 0.57612, 28, 39.7, 225.21, 2.9E-4, 3, 25, 190.1, -48.45, 0.53227, 26, 56.61, -53.56, 0.46765, 28, 39.83, 233.12, 6.0E-5, 2, 25, 161.26, -48.26, 0.79873, 26, 60.44, -82.12999, 0.20126, 3, 25, 120.37, -58.54, 0.8485, 26, 76.31, -121.18, 0.14441, 1, 41.04, -161.4, 0.00707, 4, 25, 197.37, -69.23, 0.33487, 26, 76.17, -43.46, 0.66324, 28, 30.34, 213.88, 0.0017, 29, -9.09, 262.42, 1.8E-4 ], "hull": 32, "edges": [ 40, 38, 38, 36, 28, 30, 28, 26, 26, 24, 24, 22, 22, 20, 14, 12, 12, 10, 6, 4, 60, 62, 0, 62, 40, 42, 42, 44, 34, 36, 16, 14, 52, 50, 4, 2, 2, 0, 10, 8, 8, 6, 72, 74, 74, 76, 76, 78, 78, 80, 80, 90, 90, 88, 16, 18, 18, 20, 30, 32, 32, 34, 56, 58, 58, 60, 94, 96, 96, 98, 52, 54, 54, 56, 100, 98, 48, 50, 44, 46, 46, 48, 102, 94, 72, 70, 70, 68, 66, 68, 66, 64, 64, 92, 86, 84, 50, 96, 94, 48, 46, 102, 52, 98, 54, 100, 70, 6, 68, 4, 66, 2, 72, 8, 86, 20, 86, 82, 82, 88, 84, 26, 88, 26 ], "width": 382, @@ -402,10 +408,10 @@ }, "raptor_hindleg_back": { "raptor_hindleg_back": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.45041, 0.09352, 0.56933, 0.23361, 0.65294, 0.47296, 0.66353, 0.50822, 0.63174, 0.54254, 0.32383, 0.69723, 0.30068, 0.73875, 0.27934, 0.77704, 0.30417, 0.83513, 0.31058, 0.85014, 0.341, 0.85046, 0.45165, 0.85163, 0.59555, 0.81881, 0.91176, 0.92548, 1, 1, 0.56336, 0.96426, 0.48349, 0.9826, 0.29878, 0.98027, 0.22808, 0.98389, 0.15997, 0.98737, 0.15423, 0.95546, 0.13894, 0.87047, 0.07371, 0.78726, 0, 0.75299, 0, 0.7049, 0, 0.671, 0.11875, 0.64652, 0.16535, 0.52659, 0.28495, 0.47397, 0.2901, 0.45773, 0.29427, 0.4446, 0.20635, 0.40396, 0.06128, 0.33691, 0, 0.25247, 0, 0, 0.30793, 0, 0.27599, 0.20261, 0.40397, 0.31121, 0.48439, 0.45963, 0.48317, 0.48383, 0.47029, 0.51062, 0.22698, 0.67328, 0.17141, 0.7242, 0.17122, 0.78241, 0.22995, 0.89469, 0.24677, 0.90829, 0.28672, 0.9146, 0.46582, 0.91414 ], "triangles": [ 15, 47, 12, 15, 12, 13, 16, 47, 15, 15, 13, 14, 47, 11, 12, 47, 46, 10, 47, 10, 11, 17, 46, 47, 17, 47, 16, 18, 45, 46, 18, 46, 17, 22, 23, 24, 43, 42, 7, 43, 22, 42, 21, 22, 43, 44, 43, 7, 44, 7, 8, 44, 8, 9, 21, 43, 44, 45, 44, 9, 46, 45, 9, 46, 9, 10, 20, 21, 44, 20, 45, 19, 44, 45, 20, 45, 18, 19, 40, 29, 39, 28, 29, 40, 40, 39, 4, 41, 27, 28, 26, 27, 41, 41, 28, 40, 5, 41, 40, 5, 40, 4, 24, 25, 26, 42, 26, 41, 24, 26, 42, 6, 41, 5, 42, 41, 6, 7, 42, 6, 24, 42, 22, 36, 34, 35, 36, 35, 0, 33, 34, 36, 37, 36, 0, 37, 0, 1, 32, 33, 36, 31, 32, 36, 31, 36, 37, 30, 31, 37, 38, 37, 1, 30, 37, 38, 38, 1, 2, 39, 30, 38, 39, 38, 2, 29, 30, 39, 39, 2, 3, 4, 39, 3 ], - "vertices": [ 1, 4, 53.94, 69.15, 1, 1, 4, 126.23, 67.31, 1, 2, 4, 226.42, 31.13, 0.9375, 5, -30.87, -1.11, 0.0625, 2, 4, 240.84, 25.33, 0.7, 5, -25.64, 13.52, 0.3, 2, 4, 246.67, 8.05, 0.3, 5, -8.60999, 20.02, 0.7, 3, 4, 240.81, -115.25, 0.0625, 5, 114.8, 19.01, 0.875, 6, 9.47999, 59.16, 0.0625, 2, 5, 131.07, 29.69, 0.7, 6, 22.11, 44.35, 0.3, 2, 5, 146.06, 39.54, 0.3, 6, 33.75999, 30.71, 0.7, 4, 5, 152.6, 65.01, 0.12438, 6, 59.85, 27.41, 0.74434, 7, 15.85, 48.05, 0.12104, 8, -80.51999, 23.87, 0.01021, 4, 5, 154.28, 71.58999, 0.0519, 6, 66.58999, 26.56, 0.74749, 7, 16.71999, 41.31, 0.15401, 8, -77.54, 17.76, 0.04658, 4, 5, 145.73, 77.3, 0.02193, 6, 71.19, 35.75999, 0.63296, 7, 26.78, 39.16999, 0.1288, 8, -67.32, 18.95999, 0.21628, 3, 6, 87.93, 69.21, 0.0625, 7, 63.37, 31.39, 0.675, 8, -30.17, 23.3, 0.26249, 2, 7, 113.82, 35.72, 0.1038, 8, 16.23, 43.56, 0.89619, 1, 8, 128.14, 12.02, 1, 1, 8, 161.85, -15.81, 1, 2, 7, 90.98, -23.36, 0.0138, 8, 13.52, -19.71999, 0.98619, 2, 7, 62.97, -25.81, 0.7, 8, -12.23, -31.02, 0.3, 3, 6, 115.12, -1.33, 0.08333, 7, 1.93, -12.66, 0.83333, 8, -74.26, -38.09999, 0.08333, 2, 6, 106.11, -23.53, 0.3, 7, -21.8, -9.52, 0.7, 2, 6, 97.43, -44.9, 0.7, 7, -44.67, -6.51, 0.3, 2, 6, 84.26, -40.68999, 0.9375, 7, -43.9, 7.29, 0.0625, 1, 6, 49.18, -29.46, 1, 2, 5, 206.75, 5.37, 0.13333, 6, 7.44, -33.77, 0.86666, 2, 5, 219.64, -20.52, 0.36111, 6, -16.64, -49.8, 0.63888, 2, 5, 208.4, -37.82, 0.72083, 6, -35.22, -40.82, 0.27916, 2, 5, 200.49, -50.02, 0.91666, 6, -48.31, -34.48, 0.08333, 1, 5, 161.1, -36.97, 1, 2, 4, 150.1, -116.76, 0.08333, 5, 119.88, -71.55, 0.91666, 2, 4, 154.99, -70.71, 0.42846, 5, 73.68, -68.47, 0.57153, 2, 4, 150.3, -65.26999, 0.35604, 5, 68.42, -73.36, 0.64395, 2, 4, 146.51, -60.87, 0.59147, 5, 64.17, -77.32, 0.40852, 2, 4, 115.12, -75.08, 0.8446, 5, 79.61, -108.13, 0.15538, 1, 4, 63.33, -98.53, 1, 1, 4, 21.78, -94.55, 1, 1, 4, -66.69, -32.04, 1, 1, 4, -6.62, 52.97, 1, 1, 4, 58.14, -6, 1, 1, 4, 121.17, 2.44, 1, 2, 4, 188.87, -12.1, 0.96, 5, 13.79, -36.91999, 0.04, 2, 4, 197.11, -18.42, 0.7, 5, 19.79, -28.44, 0.3, 2, 4, 203.98, -28.61, 0.3, 5, 29.69, -21.17, 0.7, 3, 4, 213.53, -136.06, 0.04, 5, 136.67, -7.42, 0.91999, 6, -14.02, 34.16, 0.04, 2, 5, 164.32, 0.66, 0.7, 6, -2.53, 7.73, 0.3, 2, 5, 177.97, 21.57, 0.25, 6, 19.92, -3.19, 0.75, 3, 5, 187.55, 72.78, 0.04, 6, 71.93, -6.29, 0.91999, 7, -13.72, 27.87, 0.04, 2, 6, 79.66, -3.72, 0.7, 7, -9.28, 21.04, 0.3, 3, 6, 87.98, 7.25, 0.3, 7, 3.42, 15.76, 0.66, 8, -81.96, -10.7, 0.04, 3, 6, 114.16, 61.85, 0.04, 7, 62.84, 4.15, 0.7, 8, -21.95, -2.66, 0.26 ], + "vertices": [ 1, 44, 53.94, 69.15, 1, 1, 44, 126.23, 67.31, 1, 2, 44, 226.42, 31.13, 0.9375, 45, -30.87, -1.11, 0.0625, 2, 44, 240.84, 25.33, 0.7, 45, -25.64, 13.52, 0.3, 2, 44, 246.67, 8.05, 0.3, 45, -8.60999, 20.02, 0.7, 3, 44, 240.81, -115.25, 0.0625, 45, 114.8, 19.01, 0.875, 46, 9.47999, 59.16, 0.0625, 2, 45, 131.07, 29.69, 0.7, 46, 22.11, 44.35, 0.3, 2, 45, 146.06, 39.54, 0.3, 46, 33.75999, 30.71, 0.7, 4, 45, 152.6, 65.01, 0.12438, 46, 59.85, 27.41, 0.74434, 47, 15.85, 48.05, 0.12104, 48, -80.51999, 23.87, 0.01021, 4, 45, 154.28, 71.58999, 0.0519, 46, 66.58999, 26.56, 0.74749, 47, 16.71999, 41.31, 0.15401, 48, -77.54, 17.76, 0.04658, 4, 45, 145.73, 77.3, 0.02193, 46, 71.19, 35.75999, 0.63296, 47, 26.78, 39.16999, 0.1288, 48, -67.32, 18.95999, 0.21628, 3, 46, 87.93, 69.21, 0.0625, 47, 63.37, 31.39, 0.675, 48, -30.17, 23.3, 0.26249, 2, 47, 113.82, 35.72, 0.1038, 48, 16.23, 43.56, 0.89619, 1, 48, 128.14, 12.02, 1, 1, 48, 161.85, -15.81, 1, 2, 47, 90.98, -23.36, 0.0138, 48, 13.52, -19.71999, 0.98619, 2, 47, 62.97, -25.81, 0.7, 48, -12.23, -31.02, 0.3, 3, 46, 115.12, -1.33, 0.08333, 47, 1.93, -12.66, 0.83333, 48, -74.26, -38.09999, 0.08333, 2, 46, 106.11, -23.53, 0.3, 47, -21.8, -9.52, 0.7, 2, 46, 97.43, -44.9, 0.7, 47, -44.67, -6.51, 0.3, 2, 46, 84.26, -40.68999, 0.9375, 47, -43.9, 7.29, 0.0625, 1, 46, 49.18, -29.46, 1, 2, 45, 206.75, 5.37, 0.13333, 46, 7.44, -33.77, 0.86666, 2, 45, 219.64, -20.52, 0.36111, 46, -16.64, -49.8, 0.63888, 2, 45, 208.4, -37.82, 0.72083, 46, -35.22, -40.82, 0.27916, 2, 45, 200.49, -50.02, 0.91666, 46, -48.31, -34.48, 0.08333, 1, 45, 161.1, -36.97, 1, 2, 44, 150.1, -116.76, 0.08333, 45, 119.88, -71.55, 0.91666, 2, 44, 154.99, -70.71, 0.42846, 45, 73.68, -68.47, 0.57153, 2, 44, 150.3, -65.26999, 0.35604, 45, 68.42, -73.36, 0.64395, 2, 44, 146.51, -60.87, 0.59147, 45, 64.17, -77.32, 0.40852, 2, 44, 115.12, -75.08, 0.8446, 45, 79.61, -108.13, 0.15538, 1, 44, 63.33, -98.53, 1, 1, 44, 21.78, -94.55, 1, 1, 44, -66.69, -32.04, 1, 1, 44, -6.62, 52.97, 1, 1, 44, 58.14, -6, 1, 1, 44, 121.17, 2.44, 1, 2, 44, 188.87, -12.1, 0.96, 45, 13.79, -36.91999, 0.04, 2, 44, 197.11, -18.42, 0.7, 45, 19.79, -28.44, 0.3, 2, 44, 203.98, -28.61, 0.3, 45, 29.69, -21.17, 0.7, 3, 44, 213.53, -136.06, 0.04, 45, 136.67, -7.42, 0.91999, 46, -14.02, 34.16, 0.04, 2, 45, 164.32, 0.66, 0.7, 46, -2.53, 7.73, 0.3, 2, 45, 177.97, 21.57, 0.25, 46, 19.92, -3.19, 0.75, 3, 45, 187.55, 72.78, 0.04, 46, 71.93, -6.29, 0.91999, 47, -13.72, 27.87, 0.04, 2, 46, 79.66, -3.72, 0.7, 47, -9.28, 21.04, 0.3, 3, 46, 87.98, 7.25, 0.3, 47, 3.42, 15.76, 0.66, 48, -81.96, -10.7, 0.04, 3, 46, 114.16, 61.85, 0.04, 47, 62.84, 4.15, 0.7, 48, -21.95, -2.66, 0.26 ], "hull": 36, "edges": [ 66, 68, 66, 64, 56, 54, 54, 52, 52, 50, 46, 44, 44, 42, 34, 32, 32, 30, 30, 28, 28, 26, 26, 24, 24, 22, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 68, 70, 0, 70, 46, 48, 48, 50, 14, 12, 12, 10, 60, 58, 58, 56, 42, 40, 40, 38, 18, 16, 16, 14, 22, 20, 20, 18, 38, 36, 36, 34, 60, 62, 62, 64, 68, 72, 72, 74, 74, 76, 76, 78, 78, 80, 80, 82, 82, 84, 84, 86, 16, 88, 86, 88, 18, 90, 90, 38, 88, 90, 20, 92, 92, 36, 90, 92, 92, 94, 94, 22, 94, 32, 30, 24, 88, 40, 86, 14, 84, 12, 82, 10, 82, 52, 48, 84, 44, 86, 78, 6, 4, 76, 80, 8, 80, 56, 58, 78, 76, 60 ], "width": 338, @@ -420,10 +426,10 @@ }, "raptor_jaw": { "raptor_jaw": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.40984, 0.22169, 0.42214, 0.3988, 0.67894, 0.53819, 0.7589, 0.62838, 0.99999, 0.4726, 1, 0.53491, 0.87731, 0.77925, 0.63281, 0.94487, 0.39908, 0.96947, 0.19456, 0.89404, 0.21609, 0.6497, 0, 0.46111, 0, 0, 0.26069, 0, 0.19456, 0.29385 ], "triangles": [ 14, 13, 0, 14, 0, 1, 5, 3, 4, 10, 14, 1, 11, 14, 10, 6, 3, 5, 2, 10, 1, 7, 2, 3, 7, 3, 6, 2, 8, 10, 8, 9, 10, 2, 7, 8, 14, 12, 13, 11, 12, 14 ], - "vertices": [ 1, 52, 28.6, 68.85, 1, 1, 52, 69.65, 38.95, 1, 1, 52, 150.72, 72.87999, 1, 1, 52, 186.16, 74.79, 1, 1, 52, 199.76, 159.69, 1, 1, 52, 213.35, 148.16, 1, 1, 52, 242.43, 74.42, 1, 1, 52, 230.31, -13.08, 1, 1, 52, 189.56, -71.99, 1, 1, 52, 132.76, -105.6, 1, 1, 52, 83.71, -55.39, 1, 2, 48, -18.31, 12.1, 0.67732, 52, -0.04, -70.76, 0.32267, 1, 48, 113.44, 16.95, 1, 1, 48, 116.36, -62.48, 1, 1, 52, 1.86, 5.43, 1 ], + "vertices": [ 1, 39, 28.6, 68.85, 1, 1, 39, 69.65, 38.95, 1, 1, 39, 150.72, 72.87999, 1, 1, 39, 186.16, 74.79, 1, 1, 39, 199.76, 159.69, 1, 1, 39, 213.35, 148.16, 1, 1, 39, 242.43, 74.42, 1, 1, 39, 230.31, -13.08, 1, 1, 39, 189.56, -71.99, 1, 1, 39, 132.76, -105.6, 1, 1, 39, 83.71, -55.39, 1, 2, 8, -18.31, 12.1, 0.67732, 39, -0.04, -70.76, 0.32267, 1, 8, 113.44, 16.95, 1, 1, 8, 116.36, -62.48, 1, 1, 39, 1.86, 5.43, 1 ], "hull": 14, "edges": [ 22, 24, 22, 20, 20, 18, 18, 16, 16, 14, 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 0, 24, 26, 0, 26, 24, 28, 22, 28, 28, 0 ], "width": 305, @@ -438,10 +444,10 @@ }, "raptor_saddle_strap_rear": { "raptor_saddle_strap_rear": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.85499, 0.06802, 1, 0.13237, 1, 0.20266, 0.95981, 0.26524, 0.88583, 0.38045, 0.80684, 0.46413, 0.74038, 0.53453, 0.81676, 0.5895, 0.51961, 1, 0.4516, 1, 0.01739, 0.8407, 0, 0.80889, 0.24645, 0.36639, 0.3792, 0.39151, 0.42457, 0.32099, 0.49229, 0.21571, 0.57673, 0.10986, 0.66437, 0, 0.70168, 0, 0.56028, 0.46321, 0.68822, 0.29772, 0.76845, 0.18722, 0.61529, 0.39206 ], "triangles": [ 19, 14, 22, 13, 14, 19, 19, 22, 6, 13, 10, 11, 9, 13, 19, 8, 9, 19, 6, 8, 19, 13, 11, 12, 9, 10, 13, 7, 8, 6, 15, 16, 20, 20, 21, 4, 22, 15, 20, 14, 15, 22, 5, 20, 4, 22, 20, 5, 6, 22, 5, 21, 18, 0, 16, 17, 18, 21, 16, 18, 0, 1, 2, 3, 21, 0, 2, 3, 0, 20, 16, 21, 4, 21, 3 ], - "vertices": [ 1, 38, 3.9, -3.27, 1, 1, 38, 4.25, 15.05, 1, 1, 38, 13.24, 20.28, 1, 2, 38, 23.42, 21.2, 0.7, 39, -15.2, 21.22, 0.3, 3, 38, 41.11, 22.87, 0.3, 39, 2.48, 22.89, 0.6375, 40, -33.83, 24.96, 0.0625, 3, 38, 52.07, 21.72, 0.0625, 39, 13.43, 21.74, 0.6375, 40, -22.97, 23.11, 0.3, 2, 39, 18.39, 20.76, 0.25, 40, -18.09, 21.82, 0.75, 1, 40, -18.76, 33.09, 1, 1, 40, 49.92, 31.57, 1, 1, 40, 53.21, 25, 1, 1, 40, 53.11, -27.48, 1, 1, 40, 49.74, -31.27, 1, 1, 40, -20.73, -36.75999, 1, 1, 40, -23.82, -22.28, 1, 3, 38, 53.48, -24.61, 0.0625, 39, 14.84, -24.59, 0.575, 40, -24.51, -23.21, 0.3625, 3, 38, 41.43999, -26.12, 0.3, 39, 2.81, -26.09, 0.6375, 40, -36.62, -23.95, 0.0625, 2, 38, 24.38, -26.12, 0.7, 39, -14.24, -26.1, 0.3, 1, 38, 5.57, -26.12, 1, 1, 38, 3.54, -22.64, 1, 1, 40, -23.08, -0.04, 1, 3, 38, 41.66, -1.72, 0.3, 39, 3.03, -1.7, 0.66, 40, -34.84999, 0.38, 0.04, 2, 38, 23.85, -2.46, 0.7, 39, -14.77, -2.44, 0.3, 3, 38, 52.58, -1.52, 0.04, 39, 13.95, -1.5, 0.62, 40, -23.94, -0.11, 0.34 ], + "vertices": [ 1, 52, 3.9, -3.27, 1, 1, 52, 4.25, 15.05, 1, 1, 52, 13.24, 20.28, 1, 2, 52, 23.42, 21.2, 0.7, 53, -15.2, 21.22, 0.3, 3, 52, 41.11, 22.87, 0.3, 53, 2.48, 22.89, 0.6375, 54, -33.83, 24.96, 0.0625, 3, 52, 52.07, 21.72, 0.0625, 53, 13.43, 21.74, 0.6375, 54, -22.97, 23.11, 0.3, 2, 53, 18.39, 20.76, 0.25, 54, -18.09, 21.82, 0.75, 1, 54, -18.76, 33.09, 1, 1, 54, 49.92, 31.57, 1, 1, 54, 53.21, 25, 1, 1, 54, 53.11, -27.48, 1, 1, 54, 49.74, -31.27, 1, 1, 54, -20.73, -36.75999, 1, 1, 54, -23.82, -22.28, 1, 3, 52, 53.48, -24.61, 0.0625, 53, 14.84, -24.59, 0.575, 54, -24.51, -23.21, 0.3625, 3, 52, 41.43999, -26.12, 0.3, 53, 2.81, -26.09, 0.6375, 54, -36.62, -23.95, 0.0625, 2, 52, 24.38, -26.12, 0.7, 53, -14.24, -26.1, 0.3, 1, 52, 5.57, -26.12, 1, 1, 52, 3.54, -22.64, 1, 1, 54, -23.08, -0.04, 1, 3, 52, 41.66, -1.72, 0.3, 53, 3.03, -1.7, 0.66, 54, -34.84999, 0.38, 0.04, 2, 52, 23.85, -2.46, 0.7, 53, -14.77, -2.44, 0.3, 3, 52, 52.58, -1.52, 0.04, 53, 13.95, -1.5, 0.62, 54, -23.94, -0.11, 0.34 ], "hull": 19, "edges": [ 26, 24, 24, 22, 22, 20, 20, 18, 16, 18, 16, 14, 14, 12, 4, 2, 34, 36, 12, 38, 38, 26, 8, 40, 40, 30, 2, 0, 0, 36, 30, 32, 32, 34, 32, 42, 4, 6, 6, 8, 42, 6, 26, 28, 28, 30, 28, 44, 8, 10, 10, 12, 44, 10 ], "width": 108, @@ -453,10 +459,10 @@ }, "raptor_tongue": { "raptor_tongue": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.35242, 0.2156, 0.4794, 0.44245, 0.62071, 0.61176, 0.80562, 0.75373, 1, 0.90297, 1, 1, 0.8971, 1, 0.72054, 0.92254, 0.50668, 0.82872, 0.30401, 0.70725, 0.10537, 0.57888, 0, 0.50622, 0, 0, 0.26224, 0 ], "triangles": [ 8, 7, 6, 6, 4, 5, 4, 6, 3, 6, 7, 3, 7, 8, 3, 8, 2, 3, 9, 10, 1, 8, 9, 2, 9, 1, 2, 1, 10, 0, 10, 11, 0, 0, 12, 13, 0, 11, 12 ], - "vertices": [ 2, 49, 3.63, 27.04, 0.6875, 50, -47.26, 33.87, 0.3125, 3, 49, 39.09, 19.45, 0.3125, 50, -13.41, 20.86, 0.625, 51, -51.54, 33.37, 0.0625, 3, 49, 71.56, 19.02, 0.0625, 50, 18.58, 15.39, 0.625, 51, -21.56, 20.92, 0.3125, 2, 50, 55.03, 16.85, 0.3125, 51, 14.29, 14.23, 0.6875, 2, 50, 93.34, 18.39, 0.08333, 51, 51.98, 7.21, 0.91666, 1, 51, 56.09, -4.5, 1, 2, 50, 85.06, -1.49, 0.08333, 51, 39.48, -10.33, 0.91666, 2, 50, 54.22, -9.18, 0.3125, 51, 7.71, -10.96, 0.6875, 3, 49, 75.14, -14.72, 0.0625, 50, 16.87, -18.5, 0.625, 51, -30.77, -11.73, 0.3125, 3, 49, 38.8, -25.8, 0.3125, 50, -20.74, -23.8, 0.625, 51, -68.62, -8.53, 0.0625, 2, 49, 2.4, -35.77, 0.6875, 50, -58.25, -27.99, 0.3125, 2, 49, -17.28, -40.62, 0.91666, 50, -78.44999, -29.71, 0.08333, 1, 49, -59.91, 8.18, 1, 2, 49, -26.13, 37.68999, 0.91666, 50, -75.01999, 49.02, 0.08333 ], + "vertices": [ 2, 63, 3.63, 27.04, 0.6875, 64, -47.26, 33.87, 0.3125, 3, 63, 39.09, 19.45, 0.3125, 64, -13.41, 20.86, 0.625, 65, -51.54, 33.37, 0.0625, 3, 63, 71.56, 19.02, 0.0625, 64, 18.58, 15.39, 0.625, 65, -21.56, 20.92, 0.3125, 2, 64, 55.03, 16.85, 0.3125, 65, 14.29, 14.23, 0.6875, 2, 64, 93.34, 18.39, 0.08333, 65, 51.98, 7.21, 0.91666, 1, 65, 56.09, -4.5, 1, 2, 64, 85.06, -1.49, 0.08333, 65, 39.48, -10.33, 0.91666, 2, 64, 54.22, -9.18, 0.3125, 65, 7.71, -10.96, 0.6875, 3, 63, 75.14, -14.72, 0.0625, 64, 16.87, -18.5, 0.625, 65, -30.77, -11.73, 0.3125, 3, 63, 38.8, -25.8, 0.3125, 64, -20.74, -23.8, 0.625, 65, -68.62, -8.53, 0.0625, 2, 63, 2.4, -35.77, 0.6875, 64, -58.25, -27.99, 0.3125, 2, 63, -17.28, -40.62, 0.91666, 64, -78.44999, -29.71, 0.08333, 1, 63, -59.91, 8.18, 1, 2, 63, -26.13, 37.68999, 0.91666, 64, -75.01999, 49.02, 0.08333 ], "hull": 14, "edges": [ 22, 24, 10, 12, 10, 8, 24, 26, 16, 4, 18, 16, 2, 4, 18, 2, 22, 20, 0, 26, 20, 0, 0, 2, 12, 14, 14, 16, 4, 6, 6, 8, 14, 6, 20, 18 ], "width": 171, @@ -474,10 +480,10 @@ }, "stirrup_strap": { "stirrup_strap": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 0.36822, 0.27893, 0.45737, 0.38897, 0.54451, 0.49651, 0.67872, 0.59135, 0.81977, 0.69102, 1, 0.77344, 1, 1, 0.77956, 1, 0.63729, 0.81629, 0.53364, 0.72348, 0.40534, 0.6086, 0.30886, 0.52535, 0.21049, 0.44047, 0, 0.26245, 0, 0, 0.30637, 0, 0.20241, 0.23 ], "triangles": [ 2, 10, 1, 9, 10, 2, 9, 2, 3, 8, 9, 3, 8, 3, 4, 7, 8, 4, 7, 4, 5, 7, 5, 6, 16, 14, 15, 13, 14, 16, 16, 15, 0, 12, 16, 0, 12, 0, 1, 13, 16, 12, 11, 12, 1, 10, 11, 1 ], - "vertices": [ 2, 25, 24.71, 8.03, 0.80344, 26, -17.42, 11.02, 0.19655, 2, 25, 37.95, 8.04, 0.59978, 26, -4.36, 8.87, 0.40021, 2, 25, 50.88, 8.04, 0.36895, 26, 8.39, 6.77, 0.63103, 2, 25, 65.92, 12.27, 0.17748, 26, 23.91, 8.47999, 0.82251, 2, 25, 81.72, 16.7, 0.05943, 26, 40.23, 10.28, 0.94056, 2, 25, 98.82, 25.04, 0.01209, 26, 58.46, 15.71, 0.9879, 2, 25, 114.44, 11.57, 0.00191, 26, 71.67, -0.11, 0.99808, 2, 25, 100.47, -4.61, 0.01816, 26, 55.25, -13.81, 0.98182, 2, 25, 78.79, -4.14, 0.07487, 26, 33.93999, -9.81, 0.92512, 2, 25, 65.83, -6.24, 0.2028, 26, 20.81, -9.76, 0.79719, 2, 25, 49.78, -8.83, 0.39971, 26, 4.55, -9.7, 0.60028, 2, 25, 37.93, -10.97, 0.62658, 26, -7.48, -9.88, 0.37341, 2, 25, 25.85, -13.15, 0.82034, 26, -19.75, -10.06, 0.17965, 2, 25, 0.25, -18.03, 0.95288, 26, -45.81, -10.7, 0.04711, 2, 25, -17.83, -2.43, 0.97709, 26, -61.11, 7.63, 0.0229, 2, 25, 1.57, 20.07, 0.94774, 26, -38.29, 26.67, 0.05225, 2, 25, 10.84, -1.23, 0.97709, 26, -32.62, 4.14, 0.0229 ], + "vertices": [ 2, 56, 24.71, 8.03, 0.80344, 57, -17.42, 11.02, 0.19655, 2, 56, 37.95, 8.04, 0.59978, 57, -4.36, 8.87, 0.40021, 2, 56, 50.88, 8.04, 0.36895, 57, 8.39, 6.77, 0.63103, 2, 56, 65.92, 12.27, 0.17748, 57, 23.91, 8.47999, 0.82251, 2, 56, 81.72, 16.7, 0.05943, 57, 40.23, 10.28, 0.94056, 2, 56, 98.82, 25.04, 0.01209, 57, 58.46, 15.71, 0.9879, 2, 56, 114.44, 11.57, 0.00191, 57, 71.67, -0.11, 0.99808, 2, 56, 100.47, -4.61, 0.01816, 57, 55.25, -13.81, 0.98182, 2, 56, 78.79, -4.14, 0.07487, 57, 33.93999, -9.81, 0.92512, 2, 56, 65.83, -6.24, 0.2028, 57, 20.81, -9.76, 0.79719, 2, 56, 49.78, -8.83, 0.39971, 57, 4.55, -9.7, 0.60028, 2, 56, 37.93, -10.97, 0.62658, 57, -7.48, -9.88, 0.37341, 2, 56, 25.85, -13.15, 0.82034, 57, -19.75, -10.06, 0.17965, 2, 56, 0.25, -18.03, 0.95288, 57, -45.81, -10.7, 0.04711, 2, 56, -17.83, -2.43, 0.97709, 57, -61.11, 7.63, 0.0229, 2, 56, 1.57, 20.07, 0.94774, 57, -38.29, 26.67, 0.05225, 2, 56, 10.84, -1.23, 0.97709, 57, -32.62, 4.14, 0.0229 ], "hull": 16, "edges": [ 28, 30, 30, 0, 12, 10, 8, 10, 12, 14, 14, 16, 26, 28, 24, 26, 26, 32, 32, 30, 20, 22, 22, 24, 0, 2, 2, 4, 4, 6, 6, 8, 16, 18, 18, 20 ], "width": 97, @@ -489,9 +495,6 @@ } } }, -"events": { - "footstep": {} -}, "animations": { "Jump": { "bones": { @@ -1740,7 +1743,7 @@ }, "ik": { "front_arm_goal": [ - { "time": 0, "mix": 0, "bendPositive": true } + { "time": 0, "mix": 0 } ] } }, @@ -1826,8 +1829,8 @@ }, "ik": { "front_arm_goal": [ - { "time": 0, "mix": 0, "bendPositive": true, "curve": "stepped" }, - { "time": 0.5666, "mix": 1, "bendPositive": true } + { "time": 0, "mix": 0, "curve": "stepped" }, + { "time": 0.5666 } ] } }, @@ -2670,7 +2673,7 @@ ] } }, - "ffd": { + "deform": { "default": { "raptor_body": { "raptor_body": [ @@ -2714,11 +2717,7 @@ ] } } - }, - "events": [ - { "time": 0, "name": "footstep" }, - { "time": 0.5333, "name": "footstep" } - ] + } } } } \ No newline at end of file diff --git a/spine-unity/Assets/Examples/Spine/Raptor/raptor.png.meta b/spine-unity/Assets/Examples/Spine/Raptor/raptor.png.meta index 1cd830520..cbac5fa23 100644 --- a/spine-unity/Assets/Examples/Spine/Raptor/raptor.png.meta +++ b/spine-unity/Assets/Examples/Spine/Raptor/raptor.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 4261719a8f729a644b2dab6113d1b0ea -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Raptor/raptor_Atlas.asset b/spine-unity/Assets/Examples/Spine/Raptor/raptor_Atlas.asset index fbceadfb0..49b6a02f9 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raptor/raptor_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Raptor/raptor_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Raptor/raptor_Material.mat b/spine-unity/Assets/Examples/Spine/Raptor/raptor_Material.mat index 197b240a7..9a1cfd46a 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raptor/raptor_Material.mat and b/spine-unity/Assets/Examples/Spine/Raptor/raptor_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Raptor/raptor_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Raptor/raptor_SkeletonData.asset index 64a8d0ed4..3e9abdbb5 100644 Binary files a/spine-unity/Assets/Examples/Spine/Raptor/raptor_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Raptor/raptor_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.json b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.json index c89acd7f5..f98be262c 100644 --- a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.json +++ b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.json @@ -1,46 +1,51 @@ { "skeleton": { - "hash": "BATKOdd4U3M9OP4b5+/HxENiNzM", - "spine": "3.1.02", - "width": 470.86, - "height": 731.44, + "hash": "nRAMrmcWEKPxacYiF9d5DFza2MU", + "spine": "3.3.07", + "width": 470.7, + "height": 731.57, "images": "C:/Program Files (x86)/Spine/examples/spineboy/images/" }, "bones": [ - { "name": "hip", "y": 247.47 }, - { "name": "torso", "parent": "hip", "length": 127.55, "x": -1.61, "y": 4.9, "rotation": 103.82, "color": "e0da19ff" }, - { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "x": 103.75, "y": 19.32, "rotation": 168.37, "color": "00ff04ff" }, + { "name": "root" }, + { "name": "hip", "parent": "root", "length": 338.72, "y": 247.47 }, + { "name": "shoot target", "parent": "root", "rotation": 1.22, "x": 578.73, "y": 350.08, "color": "ff3f00ff" }, + { "name": "aimer", "parent": "hip", "length": 350.93, "rotation": 1.57, "x": -5.73, "y": 98.76 }, + { "name": "aiming gun target", "parent": "aimer", "rotation": 0.33, "x": 317.91, "y": -78.74, "color": "ff3f00ff" }, + { "name": "free gun bone", "parent": "root", "rotation": -37.23, "x": 41.13, "y": 276.2 }, + { "name": "torso", "parent": "hip", "length": 127.55, "rotation": 103.82, "x": -1.61, "y": 4.9, "color": "e0da19ff" }, + { "name": "front_upper_arm", "parent": "torso", "length": 69.45, "rotation": 168.37, "x": 103.75, "y": 19.32, "color": "00ff04ff" }, { "name": "front_bracer", "parent": "front_upper_arm", "length": 40.57, + "rotation": 18.29, "x": 68.8, "y": -0.68, - "rotation": 18.29, "color": "00ff04ff" }, - { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "x": 40.56, "y": 0.19, "rotation": 12.43, "color": "00ff04ff" }, - { "name": "front_thigh", "parent": "hip", "length": 74.8, "x": -17.45, "y": -11.64, "rotation": -95.51, "color": "00ff04ff" }, + { "name": "front_fist", "parent": "front_bracer", "length": 65.38, "rotation": 29.28, "x": 40.56, "y": 0.19, "color": "00ff04ff" }, + { "name": "front_thigh", "parent": "hip", "length": 74.8, "rotation": -95.51, "x": -17.45, "y": -11.64, "color": "00ff04ff" }, { "name": "front_shin", "parent": "front_thigh", "length": 128.76, + "rotation": -2.21, "x": 78.69, "y": 1.6, - "rotation": -2.21, "inheritScale": false, "color": "00ff04ff" }, - { "name": "front_foot", "parent": "front_shin", "length": 91.34, "x": 128.75, "y": -0.33, "rotation": 77.9, "color": "00ff04ff" }, - { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "x": 92.35, "y": -19.22, "rotation": -169.55, "color": "ff000dff" }, - { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "x": 51.35, "rotation": 23.15, "color": "ff000dff" }, - { "name": "gun", "parent": "rear_bracer", "length": 43.1, "x": 34.42, "y": -0.45, "rotation": 5.34, "color": "ff000dff" }, - { "name": "gunTip", "parent": "gun", "x": 201.04, "y": 52.13, "rotation": 6.83, "color": "ff000dff" }, - { "name": "neck", "parent": "torso", "length": 25.45, "x": 127.49, "y": -0.3, "rotation": -31.53, "color": "e0da19ff" }, - { "name": "head", "parent": "neck", "length": 263.57, "x": 27.66, "y": -0.25, "rotation": 23.18, "color": "e0da19ff" }, - { "name": "rear_thigh", "parent": "hip", "length": 85.71, "x": 8.91, "y": -5.62, "rotation": -72.54, "color": "ff000dff" }, - { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "x": 86.1, "y": -1.32, "rotation": -19.83, "color": "ff000dff" }, - { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "x": 121.45, "y": -0.75, "rotation": 69.3, "color": "ff000dff" } + { "name": "front_foot", "parent": "front_shin", "length": 91.34, "rotation": 77.9, "x": 128.75, "y": -0.33, "color": "00ff04ff" }, + { "name": "rear_upper_arm", "parent": "torso", "length": 51.93, "rotation": -169.55, "x": 92.35, "y": -19.22, "color": "ff000dff" }, + { "name": "rear_bracer", "parent": "rear_upper_arm", "length": 34.55, "rotation": 23.15, "x": 51.35, "color": "ff000dff" }, + { "name": "gun", "parent": "rear_bracer", "length": 43.1, "rotation": 5.34, "x": 34.42, "y": -0.45, "color": "ff000dff" }, + { "name": "gunTip", "parent": "gun", "rotation": 6.83, "x": 201.03, "y": 52.12, "color": "ff000dff" }, + { "name": "neck", "parent": "torso", "length": 25.45, "rotation": -31.53, "x": 127.49, "y": -0.3, "color": "e0da19ff" }, + { "name": "head", "parent": "neck", "length": 263.57, "rotation": 23.18, "x": 27.66, "y": -0.25, "color": "e0da19ff" }, + { "name": "rear_thigh", "parent": "hip", "length": 85.71, "rotation": -72.54, "x": 8.91, "y": -5.62, "color": "ff000dff" }, + { "name": "rear_shin", "parent": "rear_thigh", "length": 121.87, "rotation": -19.83, "x": 86.1, "y": -1.32, "color": "ff000dff" }, + { "name": "rear_foot", "parent": "rear_shin", "length": 82.57, "rotation": 69.3, "x": 121.45, "y": -0.75, "color": "ff000dff" } ], "slots": [ { "name": "rear_upper_arm", "bone": "rear_upper_arm", "attachment": "rear_upper_arm" }, @@ -64,6 +69,31 @@ { "name": "muzzle", "bone": "gunTip", "blend": "additive" }, { "name": "head-bb", "bone": "head" } ], +"ik": [ + { + "name": "aiming constraint", + "bones": [ "aimer" ], + "target": "shoot target", + "mix": 0 + }, + { + "name": "aiming gun constraint", + "bones": [ "rear_upper_arm", "rear_bracer" ], + "target": "aiming gun target", + "mix": 0 + } +], +"transform": [ + { + "name": "gun flying", + "bones": [ "gun" ], + "target": "free gun bone", + "rotateMix": 0, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + } +], "skins": { "default": { "eye": { @@ -74,8 +104,8 @@ "front_bracer": { "x": 12.03, "y": -1.67, "rotation": 79.59, "width": 58, "height": 80 } }, "front_fist": { - "front_fist_closed": { "x": 35.49, "y": 6, "rotation": 67.16, "width": 75, "height": 82 }, - "front_fist_open": { "x": 39.56, "y": 7.76, "rotation": 67.16, "width": 86, "height": 87 } + "front_fist_closed": { "x": 35.71, "y": -4.54, "rotation": 50.3, "width": 75, "height": 82 }, + "front_fist_open": { "x": 40.11, "y": -4.04, "rotation": 50.3, "width": 86, "height": 87 } }, "front_foot": { "front_foot": { "x": 29.51, "y": 7.83, "rotation": 18.68, "width": 126, "height": 69 }, @@ -95,7 +125,7 @@ "goggles": { "x": 97.07, "y": 6.54, "rotation": -70.63, "width": 261, "height": 166 } }, "gun": { - "gun": { "x": 77.3, "y": 16.4, "rotation": 60.82, "width": 210, "height": 203 } + "gun": { "x": 77.29, "y": 16.39, "rotation": 60.82, "width": 210, "height": 203 } }, "head": { "head": { "x": 128.95, "y": 0.29, "rotation": -70.63, "width": 271, "height": 298 } @@ -103,7 +133,8 @@ "head-bb": { "head": { "type": "boundingbox", - "vertices": [ -19.14309, -70.30209, 40.80313, -118.07423, 257.77155, -115.61827, 285.16193, 57.18005, 120.77191, 164.95125, -5.06762, 76.94907 ] + "vertexCount": 6, + "vertices": [ -19.14, -70.3, 40.8, -118.07, 257.77, -115.61, 285.16, 57.18, 120.77, 164.95, -5.06, 76.94 ] } }, "mouth": { @@ -185,12 +216,6 @@ { "time": 2.5, "angle": -51.96, "curve": "stepped" }, { "time": 4.5333, "angle": -51.96 }, { "time": 4.6666, "angle": -85.28 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "neck": { @@ -207,12 +232,6 @@ { "time": 2.5, "angle": 18.5, "curve": "stepped" }, { "time": 4.5333, "angle": 18.5 }, { "time": 4.6666, "angle": 47.94 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "torso": { @@ -222,18 +241,12 @@ { "time": 0.2666, "angle": -280.19 }, { "time": 0.4, "angle": -237.22, "curve": "stepped" }, { "time": 0.4333, "angle": -237.22 }, - { "time": 0.5, "angle": 76.03, "curve": "stepped" }, + { "time": 0.5, "angle": 76.03 }, + { "time": 0.5666, "angle": -280.99 }, + { "time": 0.6333, "angle": 76.03, "curve": "stepped" }, { "time": 0.8, "angle": 76.03, "curve": "stepped" }, { "time": 0.9333, "angle": 76.03, "curve": "stepped" }, { "time": 2.2333, "angle": 76.03 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 2.2333, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_upper_arm": { @@ -251,12 +264,6 @@ { "time": 4.6666, "angle": -290.68 }, { "time": 4.8, "angle": 8.61 }, { "time": 4.8666, "angle": 10.94 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_upper_arm": { @@ -269,12 +276,6 @@ { "time": 0.5666, "angle": 172.6, "curve": "stepped" }, { "time": 0.9333, "angle": 172.6, "curve": "stepped" }, { "time": 2.2333, "angle": 172.6 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_bracer": { @@ -291,12 +292,6 @@ { "time": 4.6666, "angle": -1.95 }, { "time": 4.8, "angle": 34.55 }, { "time": 4.9333, "angle": -18.74 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_fist": { @@ -308,12 +303,6 @@ { "time": 2.7, "angle": 5.72, "curve": "stepped" }, { "time": 4.6666, "angle": 5.72 }, { "time": 4.8666, "angle": -6.52 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_bracer": { @@ -326,44 +315,12 @@ { "time": 0.5666, "angle": -23.2, "curve": "stepped" }, { "time": 0.9333, "angle": -23.2, "curve": "stepped" }, { "time": 2.2333, "angle": -23.2 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "gun": { "rotate": [ { "time": 0, "angle": -2.78 }, { "time": 0.1333, "angle": -24.58 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } - ] - }, - "hip": { - "rotate": [ - { "time": 0, "angle": 0, "curve": "stepped" }, - { "time": 0.9333, "angle": 0, "curve": "stepped" }, - { "time": 2.2333, "angle": 0 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 }, - { "time": 0.2, "x": 50.34, "y": 151.73 }, - { "time": 0.4, "x": 5.16, "y": -119.64, "curve": "stepped" }, - { "time": 0.4333, "x": 5.16, "y": -119.64 }, - { "time": 0.5, "x": 50.34, "y": -205.18, "curve": "stepped" }, - { "time": 0.8, "x": 50.34, "y": -205.18, "curve": "stepped" }, - { "time": 0.9333, "x": 50.34, "y": -205.18, "curve": "stepped" }, - { "time": 2.2333, "x": 50.34, "y": -205.18 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_thigh": { @@ -371,16 +328,10 @@ { "time": 0, "angle": 0 }, { "time": 0.1333, "angle": 8.47 }, { "time": 0.2666, "angle": 115.95 }, - { "time": 0.4, "angle": 180.66, "curve": "stepped" }, - { "time": 0.4333, "angle": 180.66 }, - { "time": 0.5, "angle": 155.22 }, - { "time": 0.6, "angle": 97.73 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0.4, "angle": 180.66 }, + { "time": 0.5666, "angle": 192.71 }, + { "time": 0.6666, "angle": 155.22 }, + { "time": 0.7666, "angle": 97.73 } ] }, "front_shin": { @@ -389,15 +340,13 @@ { "time": 0.1333, "angle": -27.37 }, { "time": 0.2666, "angle": -35.1 }, { "time": 0.4, "angle": -37.72, "curve": "stepped" }, - { "time": 0.4333, "angle": -37.72 }, - { "time": 0.5, "angle": -40.06 }, - { "time": 0.6, "angle": 2.76 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0.5666, "angle": -37.72 }, + { + "time": 0.6666, + "angle": -40.06, + "curve": [ 0.153, 0.88, 0.75, 1 ] + }, + { "time": 0.8, "angle": 2.76 } ] }, "rear_thigh": { @@ -408,13 +357,7 @@ { "time": 0.4, "angle": 214.31, "curve": "stepped" }, { "time": 0.4333, "angle": 214.31 }, { "time": 0.5, "angle": 169.67 }, - { "time": 0.8, "angle": 83.27 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0.7, "angle": 83.27 } ] }, "rear_shin": { @@ -424,52 +367,41 @@ { "time": 0.2666, "angle": -21.04 }, { "time": 0.4, "angle": -29.93, "curve": "stepped" }, { "time": 0.4333, "angle": -29.93 }, - { "time": 0.5, "angle": -16.79 }, - { "time": 0.8, "angle": 7.77 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { + "time": 0.5666, + "angle": 9.39, + "curve": [ 0.053, 0.95, 0.75, 1 ] + }, + { "time": 0.7333, "angle": 7.77 } ] }, "rear_foot": { "rotate": [ { "time": 0, "angle": 0 }, - { "time": 0.1333, "angle": -11.62 }, - { "time": 0.4, "angle": -45.59, "curve": "stepped" }, - { "time": 0.4333, "angle": -45.59 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0.1333, "angle": -41.12 }, + { "time": 0.3333, "angle": 9.01 }, + { "time": 0.5333, "angle": -45.59 }, + { "time": 0.7333, "angle": -26.91 } ] }, "front_foot": { "rotate": [ { "time": 0, "angle": 0 }, - { "time": 0.4, "angle": -48.75, "curve": "stepped" }, - { "time": 0.4333, "angle": -48.75 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0.2, "angle": -27.97 }, + { "time": 0.3666, "angle": 12.62 }, + { "time": 0.4333, "angle": -4.69 }, + { "time": 0.6666, "angle": -26.61 } ] }, - "gunTip": { - "rotate": [ - { "time": 0, "angle": 0 } - ], + "hip": { "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.2, "x": 50.34, "y": 151.73 }, + { "time": 0.4, "x": 5.16, "y": -119.64, "curve": "stepped" }, + { "time": 0.4333, "x": 5.16, "y": -119.64 }, + { "time": 0.5, "x": 50.34, "y": -205.18 }, + { "time": 0.5666, "x": 50.34, "y": -193.75 }, + { "time": 0.6333, "x": 50.34, "y": -205.18 } ] } } @@ -621,6 +553,40 @@ { "time": 0.1333, "angle": -19.9 } ] }, + "front_shin": { + "rotate": [ + { + "time": 0, + "angle": -16.39, + "curve": [ 0.481, 0.01, 0.75, 1 ] + }, + { "time": 0.1333, "angle": 6.69 } + ] + }, + "gun": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.1333, "angle": -2.78 } + ] + }, + "front_foot": { + "rotate": [ + { "time": 0, "angle": -19.79, "curve": "stepped" }, + { "time": 0.0666, "angle": -19.79 }, + { "time": 0.2, "angle": 26.01 }, + { "time": 0.5546, "angle": 21.03 } + ] + }, + "rear_foot": { + "rotate": [ + { "time": 0, "angle": -28.21 }, + { "time": 0.1333, "angle": 34.38 }, + { "time": 0.5546, "angle": 15.66 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, "hip": { "rotate": [ { "time": 0, "angle": 0 }, @@ -717,44 +683,1306 @@ { "time": 0.4, "x": 1, "y": 1, "curve": "stepped" }, { "time": 1.1666, "x": 1, "y": 1 } ] + } + } + }, + "gun toss": { + "slots": { + "front_fist": { + "attachment": [ + { "time": 0, "name": "front_fist_open" }, + { "time": 0.1666, "name": "front_fist_open" }, + { "time": 0.5666, "name": "front_fist_closed" }, + { "time": 1.2, "name": "front_fist_open" }, + { "time": 2.5333, "name": "front_fist_open" } + ] + }, + "mouth": { + "attachment": [ + { "time": 0, "name": "mouth_smile" }, + { "time": 2.2333, "name": "mouth_smile" }, + { "time": 2.5333, "name": "mouth_smile" } + ] + }, + "muzzle": { + "color": [ + { "time": 0, "color": "ffffff00", "curve": "stepped" }, + { "time": 0.7666, "color": "ffffff00", "curve": "stepped" }, + { "time": 0.8, "color": "ffffffff", "curve": "stepped" }, + { "time": 0.8333, "color": "ffffff00", "curve": "stepped" }, + { "time": 0.8666, "color": "ffffffff", "curve": "stepped" }, + { "time": 0.9, "color": "ffffff00", "curve": "stepped" }, + { "time": 0.9333, "color": "ffffffff", "curve": "stepped" }, + { "time": 0.9666, "color": "ffffff00", "curve": "stepped" }, + { "time": 1.1, "color": "ffffffff", "curve": "stepped" }, + { "time": 1.1333, "color": "ffffff00", "curve": "stepped" }, + { "time": 1.2, "color": "ffffff00", "curve": "stepped" }, + { "time": 1.2333, "color": "ffffffff", "curve": "stepped" }, + { "time": 1.2666, "color": "ffffff00", "curve": "stepped" }, + { "time": 1.3333, "color": "ffffff00", "curve": "stepped" }, + { "time": 2.5333, "color": "ffffff00" } + ], + "attachment": [ + { "time": 0, "name": null }, + { "time": 0.7666, "name": "muzzle" }, + { "time": 1.3333, "name": null }, + { "time": 2.5333, "name": null } + ] + } + }, + "bones": { + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 1.0333, + "angle": 0, + "curve": [ 0.25, 0, 0.985, 0.38 ] + }, + { "time": 1.1, "angle": -83.31 }, + { + "time": 1.2, + "angle": 155.47, + "curve": [ 0.187, 0.36, 0.477, 1 ] + }, + { "time": 1.4666, "angle": 0, "curve": "stepped" }, + { "time": 2.5333, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": -6.63, "y": -23.01, "curve": "stepped" }, + { + "time": 0.9, + "x": -6.63, + "y": -23.01, + "curve": [ 0.328, 0.07, 0.662, 0.41 ] + }, + { + "time": 0.9666, + "x": -5.86, + "y": -99.54, + "curve": [ 0.319, 0.15, 0.653, 0.5 ] + }, + { + "time": 1.1666, + "x": -9.34, + "y": 237.83, + "curve": [ 0.315, 0.02, 0.648, 0.39 ] + }, + { "time": 1.4333, "x": -3.93, "y": -66.28, "curve": "stepped" }, + { + "time": 1.7, + "x": -3.93, + "y": -66.28, + "curve": [ 0.33, 0.31, 0.663, 0.64 ] + }, + { + "time": 1.7666, + "x": -3.93, + "y": -90.61, + "curve": [ 0.331, 0.32, 0.665, 0.65 ] + }, + { + "time": 1.9, + "x": -0.92, + "y": 15.74, + "curve": [ 0.329, 0.31, 0.662, 0.64 ] + }, + { + "time": 2.0333, + "x": -6.63, + "y": -23.01, + "curve": [ 0.329, 0.08, 0.663, 0.42 ] + }, + { + "time": 2.1, + "x": -6.63, + "y": -34.66, + "curve": [ 0.324, 0.16, 0.658, 0.51 ] + }, + { "time": 2.2666, "x": -6.63, "y": -23.01, "curve": "stepped" }, + { "time": 2.5333, "x": -6.63, "y": -23.01 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9, "x": 1, "y": 1 }, + { "time": 0.9666, "x": 1.098, "y": 0.921 }, + { "time": 1.0666, "x": 1, "y": 1.1 }, + { "time": 1.3, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9, "x": 0, "y": 0 }, + { "time": 0.9666, "x": 0, "y": -1 }, + { "time": 1.1666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "front_thigh": { + "rotate": [ + { "time": 0, "angle": 0.64, "curve": "stepped" }, + { + "time": 0.9, + "angle": 0.64, + "curve": [ 0.328, 0.07, 0.662, 0.41 ] + }, + { + "time": 0.9666, + "angle": 39.66, + "curve": [ 0.326, 0.2, 0.659, 0.54 ] + }, + { + "time": 1.0333, + "angle": -13.85, + "curve": [ 0.326, 0.26, 0.659, 0.6 ] + }, + { + "time": 1.1666, + "angle": 86.96, + "curve": [ 0.315, 0.02, 0.648, 0.39 ] + }, + { "time": 1.4333, "angle": -15.97, "curve": "stepped" }, + { + "time": 1.7, + "angle": -15.97, + "curve": [ 0.331, 0.32, 0.665, 0.65 ] + }, + { + "time": 1.7666, + "angle": -5.81, + "curve": [ 0.327, 0.3, 0.661, 0.63 ] + }, + { + "time": 2.0333, + "angle": 0.64, + "curve": [ 0.329, 0.08, 0.663, 0.42 ] + }, + { + "time": 2.1, + "angle": 14.29, + "curve": [ 0.324, 0.16, 0.658, 0.51 ] + }, + { "time": 2.2666, "angle": 0.64, "curve": "stepped" }, + { "time": 2.5333, "angle": 0.64 } + ], + "translate": [ + { "time": 0, "x": -13.39, "y": 6.69, "curve": "stepped" }, + { + "time": 0.9, + "x": -13.39, + "y": 6.69, + "curve": [ 0.315, 0.02, 0.648, 0.39 ] + }, + { + "time": 1.1666, + "x": -12.04, + "y": 18.86, + "curve": [ 0.315, 0.02, 0.648, 0.39 ] + }, + { "time": 1.4333, "x": -10.69, "y": 14.8, "curve": "stepped" }, + { + "time": 1.7, + "x": -10.69, + "y": 14.8, + "curve": [ 0.326, 0.29, 0.659, 0.62 ] + }, + { "time": 2.0333, "x": -13.39, "y": 6.69, "curve": "stepped" }, + { "time": 2.5333, "x": -13.39, "y": 6.69 } + ], + "scale": [ + { "time": 0, "x": 0.896, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 0.896, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.6666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] }, "front_shin": { "rotate": [ + { "time": 0, "angle": -19.28, "curve": "stepped" }, { - "time": 0, - "angle": -16.39, - "curve": [ 0.481, 0.01, 0.75, 1 ] + "time": 0.9, + "angle": -19.28, + "curve": [ 0.328, 0.07, 0.662, 0.41 ] }, - { "time": 0.1333, "angle": 6.69 } + { + "time": 0.9666, + "angle": -87.26, + "curve": [ 0.326, 0.2, 0.659, 0.54 ] + }, + { + "time": 1.0333, + "angle": 2.8, + "curve": [ 0.326, 0.26, 0.659, 0.6 ] + }, + { + "time": 1.1666, + "angle": -103.46, + "curve": [ 0.321, 0.03, 0.655, 0.38 ] + }, + { + "time": 1.3333, + "angle": -22.81, + "curve": [ 0.326, 0.26, 0.659, 0.6 ] + }, + { "time": 1.4666, "angle": -26.16, "curve": "stepped" }, + { + "time": 1.7, + "angle": -26.16, + "curve": [ 0.331, 0.32, 0.665, 0.65 ] + }, + { + "time": 1.7666, + "angle": -44.54, + "curve": [ 0.327, 0.3, 0.661, 0.63 ] + }, + { + "time": 2.0333, + "angle": -19.28, + "curve": [ 0.329, 0.08, 0.663, 0.42 ] + }, + { + "time": 2.1, + "angle": -41.71, + "curve": [ 0.324, 0.16, 0.658, 0.51 ] + }, + { "time": 2.2666, "angle": -19.28, "curve": "stepped" }, + { "time": 2.5333, "angle": -19.28 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.0666, "x": 1, "y": 1 }, + { "time": 1.1333, "x": 1, "y": 2.131 }, + { "time": 1.3, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { + "time": 0.9, + "x": 0, + "y": 0, + "curve": [ 0.263, 0.47, 0.75, 1 ] + }, + { "time": 0.9666, "x": -3.29, "y": 22.68 }, + { + "time": 1.0333, + "x": 0, + "y": 9.7, + "curve": [ 0.336, 0, 0.61, 0.5 ] + }, + { + "time": 1.1333, + "x": 0, + "y": -12.29, + "curve": [ 0.229, 0.5, 0.528, 1 ] + }, + { + "time": 1.2, + "x": 0, + "y": 9.7, + "curve": [ 0.25, 0, 0.406, 1 ] + }, + { "time": 1.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.7, "x": 0, "y": 0 }, + { "time": 1.7666, "x": -4.4, "y": 13.34 }, + { "time": 2.0333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } ] }, - "gun": { + "rear_thigh": { "rotate": [ - { "time": 0, "angle": 0 }, - { "time": 0.1333, "angle": -2.78 } + { "time": 0, "angle": 30.5, "curve": "stepped" }, + { + "time": 0.9, + "angle": 30.5, + "curve": [ 0.326, 0.05, 0.66, 0.39 ] + }, + { + "time": 0.9666, + "angle": 75.84, + "curve": [ 0.323, 0.2, 0.657, 0.54 ] + }, + { + "time": 1.0666, + "angle": 87.83, + "curve": [ 0.324, 0.27, 0.657, 0.6 ] + }, + { + "time": 1.1666, + "angle": 57.77, + "curve": [ 0.308, 0.01, 0.641, 0.4 ] + }, + { "time": 1.4333, "angle": 56.48, "curve": "stepped" }, + { "time": 1.7, "angle": 56.48 }, + { "time": 1.7666, "angle": 73.88 }, + { "time": 1.9, "angle": 9.72 }, + { + "time": 2.0333, + "angle": 30.5, + "curve": [ 0.329, 0.08, 0.663, 0.42 ] + }, + { + "time": 2.1, + "angle": 40.03, + "curve": [ 0.324, 0.16, 0.658, 0.51 ] + }, + { "time": 2.2666, "angle": 30.5, "curve": "stepped" }, + { "time": 2.5333, "angle": 30.5 } + ] + }, + "rear_shin": { + "rotate": [ + { "time": 0, "angle": -23.83, "curve": "stepped" }, + { + "time": 0.9, + "angle": -23.83, + "curve": [ 0.326, 0.05, 0.66, 0.39 ] + }, + { + "time": 0.9666, + "angle": -80.38, + "curve": [ 0.323, 0.2, 0.657, 0.54 ] + }, + { + "time": 1.0666, + "angle": -124.5, + "curve": [ 0.324, 0.27, 0.657, 0.6 ] + }, + { + "time": 1.2666, + "angle": 10.25, + "curve": [ 0.308, 0.01, 0.641, 0.4 ] + }, + { "time": 1.4666, "angle": -49.1, "curve": "stepped" }, + { "time": 1.7, "angle": -49.1 }, + { "time": 1.7666, "angle": -67.91 }, + { "time": 1.9, "angle": 12.32 }, + { + "time": 2.0333, + "angle": -23.83, + "curve": [ 0.329, 0.08, 0.663, 0.42 ] + }, + { + "time": 2.1, + "angle": -37.67, + "curve": [ 0.324, 0.16, 0.658, 0.51 ] + }, + { "time": 2.2666, "angle": -23.83, "curve": "stepped" }, + { "time": 2.5333, "angle": -23.83 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.1666, "x": 1, "y": 1 }, + { "time": 1.3, "x": 1, "y": 1.803 }, + { "time": 1.4666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.0333, "x": 0, "y": 0 }, + { + "time": 1.1, + "x": -16.57, + "y": 0, + "curve": [ 0.25, 0, 0.223, 1 ] + }, + { + "time": 1.2666, + "x": 14.34, + "y": 0, + "curve": [ 0.25, 0, 0.503, 1 ] + }, + { "time": 1.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } ] }, "front_foot": { "rotate": [ - { "time": 0, "angle": -19.79, "curve": "stepped" }, - { "time": 0.0666, "angle": -19.79 }, - { "time": 0.2, "angle": 26.01 }, - { "time": 0.5546, "angle": 21.03 } + { "time": 0, "angle": 5.13, "curve": "stepped" }, + { + "time": 0.9, + "angle": 5.13, + "curve": [ 0.551, 0.05, 0.837, 0.21 ] + }, + { + "time": 0.9666, + "angle": 26.2, + "curve": [ 0.319, 0.15, 0.653, 0.5 ] + }, + { + "time": 1.0333, + "angle": -12.15, + "curve": [ 0.319, 0.15, 0.653, 0.5 ] + }, + { "time": 1.1333, "angle": -20.78, "curve": "stepped" }, + { + "time": 1.3333, + "angle": -20.78, + "curve": [ 0.315, 0.02, 0.648, 0.39 ] + }, + { "time": 1.4333, "angle": 31, "curve": "stepped" }, + { + "time": 1.7, + "angle": 31, + "curve": [ 0.332, 0.32, 0.665, 0.66 ] + }, + { + "time": 1.7666, + "angle": 36.47, + "curve": [ 0.331, 0.32, 0.664, 0.65 ] + }, + { + "time": 1.8666, + "angle": -18.45, + "curve": [ 0.329, 0.3, 0.663, 0.64 ] + }, + { + "time": 1.9666, + "angle": 23.36, + "curve": [ 0.331, 0.32, 0.664, 0.65 ] + }, + { + "time": 2.0333, + "angle": 7.95, + "curve": [ 0.332, 0.32, 0.665, 0.66 ] + }, + { + "time": 2.1, + "angle": 15.51, + "curve": [ 0.324, 0.12, 0.657, 0.46 ] + }, + { "time": 2.2666, "angle": 5.13, "curve": "stepped" }, + { "time": 2.5333, "angle": 5.13 } + ], + "scale": [ + { "time": 0, "x": 0.755, "y": 1.309, "curve": "stepped" }, + { "time": 1.1, "x": 0.755, "y": 1.309 }, + { "time": 1.2, "x": 1.271, "y": 1.309, "curve": "stepped" }, + { "time": 1.2666, "x": 1.271, "y": 1.309 }, + { "time": 1.4, "x": 0.755, "y": 1.309, "curve": "stepped" }, + { "time": 2.5333, "x": 0.755, "y": 1.309 } + ] + }, + "rear_upper_arm": { + "rotate": [ + { + "time": 0, + "angle": 62.41, + "curve": [ 0.504, 0.02, 0.75, 1 ] + }, + { "time": 0.1666, "angle": -54.91 }, + { "time": 0.5333, "angle": 299.38 }, + { "time": 0.7, "angle": 103.94 }, + { "time": 0.7666, "angle": 149.61 }, + { "time": 1.3, "angle": 12.09 }, + { + "time": 1.4666, + "angle": 269.27, + "curve": [ 0.25, 0, 0.401, 1 ] + }, + { "time": 1.6, "angle": -90.72, "curve": "stepped" }, + { + "time": 1.6333, + "angle": -90.72, + "curve": [ 0.097, 0.62, 0.259, 1 ] + }, + { "time": 2, "angle": 62.41, "curve": "stepped" }, + { "time": 2.5333, "angle": 62.41 } + ], + "translate": [ + { "time": 0, "x": -1.83, "y": -16.78 }, + { "time": 0.1666, "x": -3.74, "y": 56 }, + { "time": 0.5333, "x": 8.84, "y": 49.52 }, + { "time": 0.7, "x": 4.59, "y": -0.69, "curve": "stepped" }, + { "time": 0.7666, "x": 4.59, "y": -0.69 }, + { "time": 1.4333, "x": 7.36, "y": 37.32 }, + { "time": 1.5666, "x": 29.37, "y": 77.68, "curve": "stepped" }, + { "time": 1.6333, "x": 29.37, "y": 77.68 }, + { "time": 2, "x": -1.83, "y": -16.78, "curve": "stepped" }, + { "time": 2.5333, "x": -1.83, "y": -16.78 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.2666, "x": 0, "y": 0 }, + { + "time": 1.4, + "x": 16.96, + "y": 0, + "curve": [ 0.25, 0, 0.511, 1 ] + }, + { "time": 1.6, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.9666, "x": 0, "y": 0 }, + { + "time": 2.0666, + "x": -8.11, + "y": 0, + "curve": [ 0.25, 0, 0.432, 1 ] + }, + { "time": 2.4666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "front_upper_arm": { + "rotate": [ + { + "time": 0, + "angle": -59.85, + "curve": [ 0.492, 0, 0.75, 1 ] + }, + { "time": 0.3, "angle": 52.26 }, + { + "time": 0.5333, + "angle": -300.75, + "curve": [ 0.25, 0, 0.566, 1.77 ] + }, + { "time": 0.7, "angle": -41.32 }, + { + "time": 0.8333, + "angle": -47.51, + "curve": [ 0.47, 0, 0.571, 1 ] + }, + { + "time": 1.2333, + "angle": -292.9, + "curve": [ 0.514, 0, 0.803, 0.42 ] + }, + { + "time": 1.3, + "angle": -231.77, + "curve": [ 0.342, 0.4, 0.364, 1 ] + }, + { "time": 1.5666, "angle": -30.13, "curve": "stepped" }, + { "time": 1.7333, "angle": -30.13 }, + { "time": 2.3333, "angle": -59.85, "curve": "stepped" }, + { "time": 2.5333, "angle": -59.85 } + ], + "translate": [ + { "time": 0, "x": -7.12, "y": -8.23, "curve": "stepped" }, + { "time": 0.3, "x": -7.12, "y": -8.23 }, + { + "time": 0.5333, + "x": -4.98, + "y": -22.29, + "curve": [ 0.25, 0, 0.566, 1.77 ] + }, + { "time": 0.7, "x": -2.86, "y": 8.61, "curve": "stepped" }, + { + "time": 0.8333, + "x": -2.86, + "y": 8.61, + "curve": [ 0.47, 0, 0.571, 1 ] + }, + { "time": 1.2333, "x": -4.26, "y": -30.12 }, + { "time": 1.5666, "x": -11.4, "y": 10.91, "curve": "stepped" }, + { "time": 1.7333, "x": -11.4, "y": 10.91 }, + { "time": 2.3333, "x": -7.12, "y": -8.23, "curve": "stepped" }, + { "time": 2.5333, "x": -7.12, "y": -8.23 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.2, "x": 0, "y": 0 }, + { + "time": 0.3, + "x": 8.24, + "y": 0, + "curve": [ 0.25, 0, 0.333, 1 ] + }, + { "time": 0.4333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 }, + { + "time": 1.4666, + "x": 8.24, + "y": 0, + "curve": [ 0.25, 0, 0.333, 1 ] + }, + { "time": 1.6666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.9666, "x": 0, "y": 0 }, + { + "time": 2.1333, + "x": 10.64, + "y": 0, + "curve": [ 0.25, 0, 0.333, 1 ] + }, + { "time": 2.4666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "torso": { + "rotate": [ + { + "time": 0, + "angle": -5.61, + "curve": [ 0.299, 0, 0.635, 0.36 ] + }, + { + "time": 0.1666, + "angle": -19.41, + "curve": [ 0.285, 0.17, 0.69, 0.74 ] + }, + { + "time": 0.4333, + "angle": -22.45, + "curve": [ 0.285, 0.17, 0.69, 0.74 ] + }, + { "time": 0.7, "angle": 0.33, "curve": "stepped" }, + { + "time": 1.0333, + "angle": 0.33, + "curve": [ 0.25, 0, 0.548, 1 ] + }, + { "time": 1.3666, "angle": -80.68 }, + { "time": 1.4333, "angle": -65.08 }, + { + "time": 1.4666, + "angle": -95.78, + "curve": [ 0.223, 0.38, 0.459, 1 ] + }, + { + "time": 1.6333, + "angle": -85.98, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 2.1666, "angle": -5.61, "curve": "stepped" }, + { "time": 2.5333, "angle": -5.61 } + ], + "translate": [ + { "time": 0, "x": -6.49, "y": 0 }, + { "time": 0.1666, "x": -6.49, "y": -5.46, "curve": "stepped" }, + { "time": 0.4333, "x": -6.49, "y": -5.46 }, + { "time": 0.7, "x": -6.49, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": -6.49, "y": 0 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { + "time": 1.1, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.456, 1 ] + }, + { + "time": 1.2, + "x": 7.28, + "y": 0, + "curve": [ 0.25, 0, 0.456, 1 ] + }, + { "time": 1.4333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "front_bracer": { + "rotate": [ + { + "time": 0, + "angle": 45.46, + "curve": [ 0.492, 0, 0.75, 1 ] + }, + { "time": 0.1666, "angle": 62.76 }, + { + "time": 0.5666, + "angle": 89.75, + "curve": [ 0.179, 0.72, 0.456, 1 ] + }, + { "time": 0.7, "angle": -20.53, "curve": "stepped" }, + { + "time": 0.8333, + "angle": -20.53, + "curve": [ 0.47, 0, 0.571, 1 ] + }, + { "time": 1, "angle": 61.24 }, + { + "time": 1.4, + "angle": 93.63, + "curve": [ 0.294, 1.37, 0.624, 1 ] + }, + { "time": 1.6666, "angle": -18.23, "curve": "stepped" }, + { "time": 1.7333, "angle": -18.23 }, + { + "time": 1.9666, + "angle": -24.32, + "curve": [ 0.25, 0, 0.519, 1 ] + }, + { "time": 2.4, "angle": 45.46, "curve": "stepped" }, + { "time": 2.5333, "angle": 45.46 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { + "time": 0.8333, + "x": 0, + "y": 0, + "curve": [ 0.47, 0, 0.571, 1 ] + }, + { "time": 1, "x": -18.66, "y": 2.59, "curve": "stepped" }, + { "time": 1.7333, "x": -18.66, "y": 2.59 }, + { "time": 2.3333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } ] }, "rear_foot": { "rotate": [ - { "time": 0, "angle": -28.21 }, - { "time": 0.1333, "angle": 34.38 }, - { "time": 0.5546, "angle": 15.66 } + { "time": 0, "angle": -7.34, "curve": "stepped" }, + { + "time": 0.9, + "angle": -7.34, + "curve": [ 0.326, 0.05, 0.66, 0.39 ] + }, + { + "time": 0.9666, + "angle": 4.55, + "curve": [ 0.327, 0.23, 0.66, 0.57 ] + }, + { + "time": 1.0333, + "angle": -5.78, + "curve": [ 0.321, 0.24, 0.654, 0.58 ] + }, + { + "time": 1.1666, + "angle": 19.82, + "curve": [ 0.327, 0.06, 0.66, 0.4 ] + }, + { "time": 1.4333, "angle": 2.28 }, + { + "time": 1.5, + "angle": -5.48, + "curve": [ 0.325, 0.22, 0.658, 0.55 ] + }, + { + "time": 1.7666, + "angle": -5.69, + "curve": [ 0.33, 0.3, 0.663, 0.63 ] + }, + { + "time": 1.9, + "angle": -33.94, + "curve": [ 0.325, 0.28, 0.659, 0.62 ] + }, + { + "time": 2.0333, + "angle": -7.34, + "curve": [ 0.324, 0.04, 0.658, 0.39 ] + }, + { + "time": 2.1, + "angle": -2.67, + "curve": [ 0.317, 0.18, 0.65, 0.53 ] + }, + { "time": 2.2333, "angle": -7.34, "curve": "stepped" }, + { "time": 2.2666, "angle": -7.34, "curve": "stepped" }, + { "time": 2.5333, "angle": -7.34 } + ] + }, + "rear_bracer": { + "rotate": [ + { + "time": 0, + "angle": -17.16, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 0.1666, "angle": -24.07 }, + { "time": 0.4333, "angle": -29.77 }, + { "time": 0.5666, "angle": -68.84 }, + { "time": 0.7, "angle": -22.33 }, + { "time": 0.7666, "angle": -20.19, "curve": "stepped" }, + { + "time": 0.8666, + "angle": -20.19, + "curve": [ 0.25, 0, 0.516, 1 ] + }, + { + "time": 1.2, + "angle": 3.47, + "curve": [ 0.277, 0, 0.569, 0.66 ] + }, + { + "time": 1.5, + "angle": 17.63, + "curve": [ 0.298, 0.6, 0.628, 1 ] + }, + { "time": 1.6, "angle": -23.72, "curve": "stepped" }, + { "time": 1.6333, "angle": -23.72 }, + { + "time": 1.8, + "angle": -80.6, + "curve": [ 0.465, 0.15, 0.852, 0.45 ] + }, + { "time": 2.2, "angle": -17.16, "curve": "stepped" }, + { "time": 2.5333, "angle": -17.16 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": -5.51, "curve": "stepped" }, + { + "time": 0.3666, + "angle": -5.51, + "curve": [ 0.317, 0, 0.651, 0.34 ] + }, + { + "time": 0.8333, + "angle": -35.47, + "curve": [ 0.299, 0.14, 0.637, 0.5 ] + }, + { + "time": 1.2, + "angle": -14.39, + "curve": [ 0.25, 0, 0.369, 1 ] + }, + { "time": 1.5666, "angle": -35.47, "curve": "stepped" }, + { + "time": 1.6666, + "angle": -35.47, + "curve": [ 0.433, 0, 0.716, 0.44 ] + }, + { "time": 1.8333, "angle": -14.54 }, + { + "time": 1.9333, + "angle": 30.04, + "curve": [ 0.197, 0.64, 0.414, 1 ] + }, + { "time": 2.4, "angle": -5.51, "curve": "stepped" }, + { "time": 2.5333, "angle": -5.51 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.1, "x": 1, "y": 1 }, + { "time": 1.2, "x": 1, "y": 1.384, "curve": "stepped" }, + { "time": 1.2666, "x": 1, "y": 1.384 }, + { "time": 1.4666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.1, "x": 0, "y": 0 }, + { "time": 1.2, "x": 0, "y": 33.37, "curve": "stepped" }, + { "time": 1.3333, "x": 0, "y": 33.37 }, + { "time": 1.5, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.6666, "x": 0, "y": 0 }, + { + "time": 1.8666, + "x": -17.77, + "y": 0, + "curve": [ 0.25, 0, 0.676, 1 ] + }, + { "time": 2, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "front_fist": { + "rotate": [ + { + "time": 0, + "angle": -6.84, + "curve": [ 0.367, 0, 0.698, 0.38 ] + }, + { "time": 0.1666, "angle": -7.86, "curve": "stepped" }, + { + "time": 0.4333, + "angle": -7.86, + "curve": [ 0.421, 0.25, 0.726, 0.75 ] + }, + { + "time": 0.6666, + "angle": -19.63, + "curve": [ 0.343, 0.61, 0.672, 1 ] + }, + { "time": 0.7333, "angle": -6.84, "curve": "stepped" }, + { "time": 1.0333, "angle": -6.84 }, + { + "time": 1.1666, + "angle": 77.81, + "curve": [ 0.25, 0, 0.438, 1 ] + }, + { "time": 1.5, "angle": -6.84, "curve": "stepped" }, + { + "time": 1.7, + "angle": -6.84, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.0333, + "angle": -44.04, + "curve": [ 0.25, 0, 0.556, 1 ] + }, + { "time": 2.4, "angle": -6.84, "curve": "stepped" }, + { "time": 2.5333, "angle": -6.84 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.5666, "x": 1, "y": 1 }, + { "time": 0.6, "x": 1, "y": 2, "curve": "stepped" }, + { "time": 0.6333, "x": 1, "y": 2 }, + { "time": 0.6666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.2333, "x": 1, "y": 1 }, + { "time": 1.3666, "x": 1, "y": 2, "curve": "stepped" }, + { "time": 1.4333, "x": 1, "y": 2 }, + { "time": 1.5666, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 2.5333, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.3, "x": -11.45, "y": 0 }, + { "time": 0.5333, "x": -14.51, "y": -10.11 }, + { "time": 0.6, "x": 9.49, "y": -7.02 }, + { "time": 0.7, "x": 0, "y": 0, "curve": "stepped" }, + { + "time": 1.4, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.553, 1 ] + }, + { + "time": 1.5666, + "x": -13.44, + "y": 0, + "curve": [ 0.25, 0, 0.553, 1 ] + }, + { + "time": 1.8, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.553, 1 ] + }, + { + "time": 2.0333, + "x": -16.53, + "y": 0, + "curve": [ 0.25, 0, 0.553, 1 ] + }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "gun": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.286, 0, 0.626, 0.38 ] + }, + { "time": 0.1666, "angle": -8.72, "curve": "stepped" }, + { + "time": 0.4333, + "angle": -8.72, + "curve": [ 0.3, 0.22, 0.654, 0.62 ] + }, + { + "time": 0.5666, + "angle": -43.92, + "curve": [ 0.348, 0.38, 0.691, 0.75 ] + }, + { "time": 0.7, "angle": 0, "curve": "stepped" }, + { + "time": 1.7333, + "angle": 0, + "curve": [ 0.245, 0, 0.637, 0.55 ] + }, + { + "time": 1.9666, + "angle": -23.41, + "curve": [ 0.381, 0.54, 0.438, 1 ] + }, + { "time": 2.2333, "angle": 0, "curve": "stepped" }, + { "time": 2.5333, "angle": 0 } + ] + }, + "free gun bone": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.1666, "angle": 0, "curve": "stepped" }, + { "time": 0.4333, "angle": 0 }, + { "time": 0.6666, "angle": 81.73 }, + { "time": 0.7333, "angle": 201.73 }, + { "time": 0.8, "angle": 321.73 }, + { "time": 0.8666, "angle": 441.73 }, + { "time": 0.9666, "angle": 201.73 }, + { "time": 1.1333, "angle": 321.73 }, + { "time": 1.3333, "angle": 81.73 }, + { "time": 1.6333, "angle": 147.13, "curve": "stepped" }, + { + "time": 1.7333, + "angle": 147.13, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 2.2333, "angle": 0, "curve": "stepped" }, + { "time": 2.5333, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.1666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.4333, "x": 0, "y": 0 }, + { + "time": 0.6666, + "x": 24.84, + "y": 38.06, + "curve": [ 0.062, 0.74, 0.529, 0.9 ] + }, + { + "time": 1.1333, + "x": 12.43, + "y": 700.82, + "curve": [ 0.478, 0, 0.875, 0.5 ] + }, + { + "time": 1.6666, + "x": -45.78, + "y": 5.56, + "curve": [ 0.189, 0.41, 0.401, 1 ] + }, + { "time": 2.2333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.6, "x": 0, "y": 0 }, + { "time": 0.7333, "x": -26.21, "y": 0 }, + { "time": 1.0666, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 2.5333, "x": 0, "y": 0 } + ] + }, + "gunTip": { + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.7666, "x": 0, "y": 0 }, + { "time": 0.8333, "x": 20.93, "y": 1.57 }, + { "time": 0.8666, "x": 0, "y": 0 }, + { "time": 0.9333, "x": 20.93, "y": 1.57 }, + { "time": 0.9666, "x": 0, "y": 0 }, + { "time": 1.0333, "x": 20.93, "y": 1.57 }, + { "time": 1.0666, "x": 0, "y": 0 }, + { "time": 1.1333, "x": 20.93, "y": 1.57 }, + { "time": 1.2, "x": 0, "y": 0 }, + { "time": 1.3333, "x": 20.93, "y": 1.57, "curve": "stepped" }, + { "time": 2.5333, "x": 20.93, "y": 1.57 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { + "time": 0.7666, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 0.8333, "x": 1.247, "y": 1.516 }, + { + "time": 0.8666, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 0.9333, "x": 1.247, "y": 1.516 }, + { + "time": 0.9666, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 1.0333, "x": 1.247, "y": 1.516 }, + { + "time": 1.0666, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 1.1333, "x": 1.247, "y": 1.516 }, + { + "time": 1.2, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 1.3333, "x": 1.247, "y": 1.516, "curve": "stepped" }, + { "time": 2.5333, "x": 1.247, "y": 1.516 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.4, "angle": 14.08 }, + { "time": 0.8666, "angle": -7.48 }, + { "time": 1.1333, "angle": -14.81 }, + { "time": 1.3333, "angle": -5.35 }, + { "time": 1.5, "angle": 0, "curve": "stepped" }, + { "time": 2.5333, "angle": 0 } + ] + } + }, + "ik": { + "aiming constraint": [ + { "time": 0, "mix": 0, "curve": "stepped" }, + { "time": 2.5333, "mix": 0 } + ], + "aiming gun constraint": [ + { "time": 0, "mix": 0, "curve": "stepped" }, + { "time": 2.5333, "mix": 0 } + ] + }, + "transform": { + "gun flying": [ + { "time": 0, "rotateMix": 0, "translateMix": 0, "scaleMix": 0, "shearMix": 0, "curve": "stepped" }, + { "time": 0.6666, "rotateMix": 0, "translateMix": 0, "scaleMix": 0, "shearMix": 0 }, + { "time": 0.7, "curve": "stepped" }, + { "time": 1.6333 }, + { "time": 1.6666, "rotateMix": 0, "translateMix": 0, "scaleMix": 0, "shearMix": 0, "curve": "stepped" }, + { "time": 2.5333, "rotateMix": 0, "translateMix": 0, "scaleMix": 0, "shearMix": 0 } + ] + } + }, + "hit": { + "slots": { + "front_fist": { + "attachment": [ + { "time": 0.1, "name": "front_fist_open" } + ] + }, + "mouth": { + "attachment": [ + { "time": 0, "name": "mouth_grind" }, + { "time": 0.2, "name": "mouth_smile" } + ] + } + }, + "bones": { + "torso": { + "rotate": [ + { "time": 0, "angle": 56.42 }, + { "time": 0.2, "angle": 8.89 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 35.38 }, + { "time": 0.1333, "angle": 24.94 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": 10.21 }, + { "time": 0.2, "angle": -41.3 } + ] + }, + "front_upper_arm": { + "rotate": [ + { + "time": 0, + "angle": -310.92, + "curve": [ 0.38, 0.53, 0.744, 1 ] + }, + { "time": 0.2, "angle": -112.59 } + ], + "translate": [ + { "time": 0, "x": 7.23, "y": -13.13 } + ] + }, + "front_bracer": { + "rotate": [ + { "time": 0, "angle": 36.99 }, + { "time": 0.2, "angle": -28.64 } + ] + }, + "front_fist": { + "rotate": [ + { "time": 0, "angle": 13.59 }, + { "time": 0.2, "angle": 7.55 } + ] + }, + "rear_upper_arm": { + "rotate": [ + { + "time": 0, + "angle": 271.02, + "curve": [ 0.342, 0.36, 0.68, 0.71 ] + }, + { "time": 0.2, "angle": -15.84 } + ], + "translate": [ + { "time": 0.2, "x": -0.09, "y": -0.46 } + ] + }, + "rear_bracer": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.2, "angle": 40.03 } + ] + }, + "gun": { + "rotate": [ + { "time": 0, "angle": 14.98 }, + { "time": 0.2, "angle": 39.75 } + ] + }, + "front_thigh": { + "rotate": [ + { + "time": 0, + "angle": 90.94, + "curve": [ 0.227, 0.26, 0.432, 1 ] + }, + { "time": 0.2, "angle": 32.02 } + ], + "translate": [ + { "time": 0, "x": 7.21, "y": -4 } + ] + }, + "rear_thigh": { + "rotate": [ + { + "time": 0, + "angle": 40.51, + "curve": [ 0.295, 0.3, 0.59, 0.99 ] + }, + { "time": 0.2, "angle": 90.76 } + ], + "translate": [ + { "time": 0, "x": -1.96, "y": -0.32 } + ] + }, + "front_shin": { + "rotate": [ + { "time": 0, "angle": -96.62 }, + { "time": 0.2, "angle": -15.13 } + ] + }, + "rear_shin": { + "rotate": [ + { "time": 0, "angle": 7.99 }, + { "time": 0.2, "angle": -67.54 } ], "scale": [ { "time": 0, "x": 1, "y": 1 } ] + }, + "front_foot": { + "rotate": [ + { "time": 0, "angle": 5.4 }, + { "time": 0.2, "angle": -16.26 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1 } + ] + }, + "rear_foot": { + "rotate": [ + { "time": 0, "angle": 2.67 }, + { "time": 0.2, "angle": -10.31 } + ] + }, + "hip": { + "translate": [ + { "time": 0, "x": -75.54, "y": -78.03 }, + { "time": 0.1333, "x": -36.48, "y": 12.42 }, + { "time": 0.2, "x": -36.48, "y": -2.99 } + ] } } }, - "hit": { + "hit old": { "slots": { "front_fist": { "attachment": [ @@ -837,13 +2065,6 @@ { "time": 0.3333, "angle": 39.75 } ] }, - "hip": { - "translate": [ - { "time": 0, "x": -75.54, "y": -78.03 }, - { "time": 0.2333, "x": -36.48, "y": 12.42 }, - { "time": 0.3333, "x": -36.48, "y": -2.99 } - ] - }, "front_thigh": { "rotate": [ { @@ -902,6 +2123,13 @@ { "time": 0, "angle": 2.67 }, { "time": 0.3333, "angle": -10.31 } ] + }, + "hip": { + "translate": [ + { "time": 0, "x": -75.54, "y": -78.03 }, + { "time": 0.2333, "x": -36.48, "y": 12.42 }, + { "time": 0.3333, "x": -36.48, "y": -2.99 } + ] } } }, @@ -937,10 +2165,6 @@ ], "translate": [ { "time": 0, "x": -6.49, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "front_upper_arm": { @@ -961,10 +2185,6 @@ { "time": 0, "x": -7.12, "y": -8.23 }, { "time": 0.6666, "x": -6.32, "y": -8.3 }, { "time": 1.6666, "x": -7.12, "y": -8.23 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "rear_upper_arm": { @@ -985,10 +2205,6 @@ { "time": 0, "x": -1.83, "y": -16.78 }, { "time": 0.6666, "x": 0.34, "y": -15.23 }, { "time": 1.6666, "x": -1.83, "y": -16.78 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "neck": { @@ -1000,10 +2216,6 @@ "translate": [ { "time": 0, "x": -1.88, "y": -4.76, "curve": "stepped" }, { "time": 1.6666, "x": -1.88, "y": -4.76 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "front_thigh": { @@ -1074,10 +2286,6 @@ "curve": [ 0.594, 0, 0.653, 1 ] }, { "time": 1.6666, "angle": 30.5 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "rear_shin": { @@ -1093,10 +2301,6 @@ "curve": [ 0.594, 0, 0.653, 1 ] }, { "time": 1.6666, "angle": -23.83 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "front_foot": { @@ -1118,27 +2322,6 @@ { "time": 1.6666, "x": 0.755, "y": 1.309 } ] }, - "hip": { - "translate": [ - { - "time": 0, - "x": -6.63, - "y": -23.01, - "curve": [ 0.235, 0, 0.558, 0.99 ] - }, - { - "time": 0.6666, - "x": 6.27, - "y": -35, - "curve": [ 0.594, 0, 0.653, 1 ] - }, - { "time": 1.6666, "x": -6.63, "y": -23.01 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } - ] - }, "rear_foot": { "rotate": [ { @@ -1152,10 +2335,6 @@ "curve": [ 0.594, 0, 0.653, 1 ] }, { "time": 1.6666, "angle": -7.34 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "rear_bracer": { @@ -1171,10 +2350,6 @@ "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1.6666, "angle": -17.16 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "head": { @@ -1190,10 +2365,6 @@ "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1.6666, "angle": -5.51 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "front_bracer": { @@ -1209,10 +2380,6 @@ "curve": [ 0.32, 0.1, 0.736, 0.91 ] }, { "time": 1.6666, "angle": 45.46 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "gun": { @@ -1228,10 +2395,6 @@ "curve": [ 0.732, 0, 0.769, 0.99 ] }, { "time": 1.6666, "angle": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 1.6666, "x": 1, "y": 1 } ] }, "front_fist": { @@ -1257,16 +2420,316 @@ }, { "time": 0.6666, - "x": 0.689, + "x": 0.8, "y": 1.1, "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1.6666, "x": 1, "y": 1 } ] + }, + "hip": { + "translate": [ + { + "time": 0, + "x": -6.63, + "y": -23.01, + "curve": [ 0.235, 0, 0.558, 0.99 ] + }, + { + "time": 0.6666, + "x": 6.27, + "y": -35, + "curve": [ 0.594, 0, 0.653, 1 ] + }, + { "time": 1.6666, "x": -6.63, "y": -23.01 } + ] } } }, "jump": { + "slots": { + "front_fist": { + "attachment": [ + { "time": 0, "name": "front_fist_open" }, + { "time": 0.1333, "name": "front_fist_closed" }, + { "time": 0.6, "name": "front_fist_open" } + ] + }, + "mouth": { + "attachment": [ + { "time": 0, "name": "mouth_grind" } + ] + }, + "torso": { + "attachment": [ + { "time": 0, "name": "torso" } + ] + } + }, + "bones": { + "front_thigh": { + "rotate": [ + { + "time": 0, + "angle": 91.53, + "curve": [ 0.278, 0.46, 0.763, 1 ] + }, + { + "time": 0.1333, + "angle": -35.83, + "curve": [ 0.761, 0, 0.75, 1 ] + }, + { "time": 0.3666, "angle": 127.74 }, + { + "time": 0.6666, + "angle": 48.18, + "curve": [ 0.227, 0.26, 0.432, 1 ] + }, + { "time": 0.7666, "angle": 25.35 }, + { "time": 0.8666, "angle": 45.37 }, + { "time": 0.9666, "angle": 38.12 }, + { "time": 1.0666, "angle": 25.35 }, + { "time": 1.2666, "angle": 91.53 } + ], + "translate": [ + { "time": 0, "x": -2.56, "y": 5.77 }, + { "time": 0.3666, "x": 8.3, "y": 7.98 }, + { "time": 0.6666, "x": 7.21, "y": -4 }, + { "time": 1.2666, "x": -2.56, "y": 5.77 } + ] + }, + "torso": { + "rotate": [ + { "time": 0, "angle": -42.63 }, + { "time": 0.1333, "angle": -5.74 }, + { "time": 0.3666, "angle": -50.76 }, + { "time": 0.6666, "angle": 1.89 }, + { "time": 0.7666, "angle": 11.58 }, + { "time": 0.9, "angle": -1.89 }, + { "time": 1.0666, "angle": 11.58 }, + { "time": 1.2666, "angle": -42.63 } + ] + }, + "rear_thigh": { + "rotate": [ + { "time": 0, "angle": -26.32 }, + { "time": 0.1333, "angle": 121.44 }, + { "time": 0.3666, "angle": 70.54 }, + { + "time": 0.6666, + "angle": 79.89, + "curve": [ 0.295, 0.3, 0.59, 0.99 ] + }, + { "time": 0.7666, "angle": 99.12 }, + { "time": 0.8666, "angle": 74.05 }, + { "time": 0.9666, "angle": 98.04 }, + { "time": 1.0666, "angle": 99.12 }, + { "time": 1.2666, "angle": -26.32 } + ], + "translate": [ + { "time": 0, "x": -0.56, "y": -0.32 }, + { "time": 0.3666, "x": -8.5, "y": 10.58 }, + { "time": 0.6666, "x": -1.96, "y": -0.32 }, + { "time": 1.2666, "x": -0.56, "y": -0.32 } + ] + }, + "rear_shin": { + "rotate": [ + { "time": 0, "angle": -78.69 }, + { "time": 0.3666, "angle": -55.56 }, + { "time": 0.6666, "angle": -62.84 }, + { "time": 0.7666, "angle": -80.74 }, + { "time": 0.8666, "angle": -41.12 }, + { "time": 0.9666, "angle": -77.4 }, + { "time": 1.0666, "angle": -80.74 }, + { "time": 1.2666, "angle": -78.69 } + ] + }, + "front_upper_arm": { + "rotate": [ + { "time": 0, "angle": -22.61 }, + { "time": 0.1333, "angle": -246.68 }, + { + "time": 0.5333, + "angle": 11.28, + "curve": [ 0.246, 0, 0.633, 0.53 ] + }, + { + "time": 0.6666, + "angle": -57.45, + "curve": [ 0.38, 0.53, 0.744, 1 ] + }, + { "time": 0.8, "angle": -112.59 }, + { "time": 0.8666, "angle": -102.17 }, + { "time": 0.9666, "angle": -108.61 }, + { "time": 1.0666, "angle": -112.59 }, + { "time": 1.2666, "angle": -22.61 } + ], + "translate": [ + { "time": 0, "x": 6.08, "y": 7.15 }, + { "time": 0.1333, "x": 7.23, "y": -13.13, "curve": "stepped" }, + { "time": 0.6666, "x": 7.23, "y": -13.13 }, + { "time": 1.2666, "x": 6.08, "y": 7.15 } + ] + }, + "front_bracer": { + "rotate": [ + { "time": 0, "angle": 66.46 }, + { "time": 0.1333, "angle": 42.39 }, + { "time": 0.3666, "angle": 26.06 }, + { "time": 0.6666, "angle": 13.28 }, + { "time": 0.8, "angle": -28.64 }, + { "time": 0.8666, "angle": -22.31 }, + { "time": 0.9666, "angle": -35.39 }, + { "time": 1.0666, "angle": -28.64 }, + { "time": 1.2666, "angle": 66.46 } + ] + }, + "front_fist": { + "rotate": [ + { "time": 0, "angle": -28.43 }, + { "time": 0.3666, "angle": -45.6 }, + { "time": 0.6666, "angle": -53.66 }, + { "time": 0.8, "angle": 7.55 }, + { "time": 0.8666, "angle": 31.15 }, + { "time": 0.9666, "angle": -32.58 }, + { "time": 1.0666, "angle": 7.55 }, + { "time": 1.2666, "angle": -28.43 } + ] + }, + "rear_upper_arm": { + "rotate": [ + { "time": 0, "angle": 39.68 }, + { "time": 0.1333, "angle": 276.57 }, + { "time": 0.2333, "angle": 17.73 }, + { "time": 0.3666, "angle": 83.38 }, + { + "time": 0.5333, + "angle": -4.71, + "curve": [ 0.246, 0, 0.633, 0.53 ] + }, + { + "time": 0.6666, + "angle": -69.63, + "curve": [ 0.342, 0.36, 0.68, 0.71 ] + }, + { + "time": 0.7, + "angle": 321.47, + "curve": [ 0.333, 0.33, 0.667, 0.66 ] + }, + { + "time": 0.7333, + "angle": 33.7, + "curve": [ 0.358, 0.64, 0.693, 1 ] + }, + { "time": 0.8, "angle": 34.56 }, + { "time": 0.9666, "angle": 71.96 }, + { "time": 1.0666, "angle": 34.56 }, + { "time": 1.2666, "angle": 39.68 } + ], + "translate": [ + { "time": 0, "x": -3.1, "y": -4.86 }, + { "time": 0.1333, "x": 23.33, "y": 49.07 }, + { "time": 0.3666, "x": 20.78, "y": 40.21 }, + { "time": 1.2666, "x": -3.1, "y": -4.86 } + ] + }, + "rear_bracer": { + "rotate": [ + { "time": 0, "angle": 29.66 }, + { "time": 0.1333, "angle": 45.06 }, + { "time": 0.3666, "angle": -4.34 }, + { "time": 0.7, "angle": 61.68 }, + { "time": 0.7333, "angle": 82.59 }, + { "time": 0.8, "angle": 80.06 }, + { "time": 0.9666, "angle": 57.56 }, + { "time": 1.0666, "angle": 80.06 }, + { "time": 1.2666, "angle": 29.66 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 24.9 }, + { "time": 0.1333, "angle": 16.31 }, + { "time": 0.3666, "angle": 7.44 }, + { "time": 0.6666, "angle": -20.35 }, + { "time": 0.7666, "angle": -0.69, "curve": "stepped" }, + { "time": 1.0666, "angle": -0.69 }, + { "time": 1.2666, "angle": 24.9 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": 24.92 }, + { "time": 0.1333, "angle": 10.36 }, + { "time": 0.3666, "angle": 28.65 }, + { "time": 0.6666, "angle": -2.65 }, + { "time": 0.7666, "angle": -28.94, "curve": "stepped" }, + { "time": 1.0666, "angle": -28.94 }, + { "time": 1.2666, "angle": 24.92 } + ] + }, + "front_shin": { + "rotate": [ + { + "time": 0, + "angle": -90.62, + "curve": [ 0.416, 0.54, 0.743, 1 ] + }, + { + "time": 0.1333, + "angle": -10.52, + "curve": [ 0.644, 0, 0.75, 1 ] + }, + { "time": 0.3666, "angle": -127.72 }, + { "time": 0.6666, "angle": -19.91 }, + { "time": 0.7666, "angle": -5.16 }, + { "time": 0.8666, "angle": -35.06 }, + { "time": 0.9666, "angle": -43.97 }, + { "time": 1.0666, "angle": -5.16 }, + { "time": 1.2666, "angle": -90.62 } + ] + }, + "front_foot": { + "rotate": [ + { "time": 0, "angle": 16.27 }, + { "time": 0.0333, "angle": 21.02 }, + { "time": 0.0666, "angle": 10.92 }, + { "time": 0.1333, "angle": -38.45 }, + { "time": 0.3666, "angle": 6.62 }, + { "time": 0.6666, "angle": -11.51 }, + { "time": 0.9666, "angle": -22.91 }, + { "time": 1.2666, "angle": -0.79 } + ] + }, + "rear_foot": { + "rotate": [ + { "time": 0, "angle": -12.77 }, + { "time": 0.1333, "angle": 17.05 }, + { "time": 0.3666, "angle": 19.45 }, + { "time": 0.6666, "angle": 2.67 }, + { "time": 0.9666, "angle": -28.49 }, + { "time": 1.2666, "angle": -12.77 } + ] + }, + "gun": { + "rotate": [ + { "time": 0, "angle": 6.18 }, + { "time": 0.1333, "angle": 30.81 }, + { "time": 0.3666, "angle": 13.25 }, + { "time": 0.6666, "angle": 14.98 }, + { "time": 0.7, "angle": 25.64 }, + { "time": 0.7333, "angle": 20.62 }, + { "time": 0.8, "angle": 64.52 }, + { "time": 0.9666, "angle": 8.59 }, + { "time": 1.0666, "angle": 64.52 }, + { "time": 1.2666, "angle": 6.18 } + ] + } + } + }, + "jump old": { "slots": { "front_fist": { "attachment": [ @@ -1316,9 +2779,6 @@ { "time": 0.4333, "x": 8.3, "y": 7.98 }, { "time": 0.7333, "x": 7.21, "y": -4 }, { "time": 1.3333, "x": -2.56, "y": 5.77 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "torso": { @@ -1331,12 +2791,6 @@ { "time": 0.9666, "angle": -1.89 }, { "time": 1.1333, "angle": 11.58 }, { "time": 1.3333, "angle": -42.63 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_thigh": { @@ -1360,9 +2814,6 @@ { "time": 0.4333, "x": -8.5, "y": 10.58 }, { "time": 0.7333, "x": -1.96, "y": -0.32 }, { "time": 1.3333, "x": -0.56, "y": -0.32 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_shin": { @@ -1375,13 +2826,6 @@ { "time": 1.0333, "angle": -77.4 }, { "time": 1.1333, "angle": -80.74 }, { "time": 1.3333, "angle": -78.69 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.7333, "x": 1, "y": 1 } ] }, "front_upper_arm": { @@ -1409,9 +2853,6 @@ { "time": 0.2, "x": 7.23, "y": -13.13, "curve": "stepped" }, { "time": 0.7333, "x": 7.23, "y": -13.13 }, { "time": 1.3333, "x": 6.08, "y": 7.15 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_bracer": { @@ -1425,12 +2866,6 @@ { "time": 1.0333, "angle": -35.39 }, { "time": 1.1333, "angle": -28.64 }, { "time": 1.3333, "angle": 66.46 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_fist": { @@ -1443,12 +2878,6 @@ { "time": 1.0333, "angle": -32.58 }, { "time": 1.1333, "angle": 7.55 }, { "time": 1.3333, "angle": -28.43 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_upper_arm": { @@ -1487,9 +2916,6 @@ { "time": 0.2, "x": 23.33, "y": 49.07 }, { "time": 0.4333, "x": 20.78, "y": 40.21 }, { "time": 1.3333, "x": -3.1, "y": -4.86 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_bracer": { @@ -1503,12 +2929,6 @@ { "time": 1.0333, "angle": 57.56 }, { "time": 1.1333, "angle": 80.06 }, { "time": 1.3333, "angle": 29.66 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "neck": { @@ -1520,12 +2940,6 @@ { "time": 0.8333, "angle": -0.69, "curve": "stepped" }, { "time": 1.1333, "angle": -0.69 }, { "time": 1.3333, "angle": 24.9 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "head": { @@ -1537,42 +2951,6 @@ { "time": 0.8333, "angle": -28.94, "curve": "stepped" }, { "time": 1.1333, "angle": -28.94 }, { "time": 1.3333, "angle": 24.92 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } - ] - }, - "hip": { - "rotate": [ - { "time": 0, "angle": 0 } - ], - "translate": [ - { - "time": 0, - "x": -34.51, - "y": -78.62, - "curve": [ 0.232, 1, 0.75, 1 ] - }, - { - "time": 0.2, - "x": -34.51, - "y": 182.5, - "curve": [ 0.232, 0.48, 0.598, 0.79 ] - }, - { - "time": 0.7666, - "x": -34.51, - "y": 596.22, - "curve": [ 0.329, 0.17, 0.66, 0.21 ] - }, - { "time": 1.1333, "x": -34.51, "y": 2.49 }, - { "time": 1.3333, "x": -34.51, "y": -78.62 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_shin": { @@ -1594,12 +2972,6 @@ { "time": 1.0333, "angle": -43.97 }, { "time": 1.1333, "angle": -5.16 }, { "time": 1.3333, "angle": -90.62 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "front_foot": { @@ -1614,12 +2986,6 @@ { "time": 0.7333, "angle": -11.51 }, { "time": 1.0333, "angle": -22.91 }, { "time": 1.3333, "angle": -0.79 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "rear_foot": { @@ -1630,12 +2996,6 @@ { "time": 0.7333, "angle": 2.67 }, { "time": 1.0333, "angle": -28.49 }, { "time": 1.3333, "angle": -12.77 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } ] }, "gun": { @@ -1650,12 +3010,30 @@ { "time": 1.0333, "angle": 8.59 }, { "time": 1.1333, "angle": 64.52 }, { "time": 1.3333, "angle": 6.18 } - ], + ] + }, + "hip": { "translate": [ - { "time": 0, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1 } + { + "time": 0, + "x": -34.51, + "y": -78.62, + "curve": [ 0.232, 1, 0.75, 1 ] + }, + { + "time": 0.2, + "x": -34.51, + "y": 182.5, + "curve": [ 0.232, 0.48, 0.598, 0.79 ] + }, + { + "time": 0.7666, + "x": -34.51, + "y": 596.22, + "curve": [ 0.329, 0.17, 0.66, 0.21 ] + }, + { "time": 1.1333, "x": -34.51, "y": 2.49 }, + { "time": 1.3333, "x": -34.51, "y": -78.62 } ] } } @@ -1948,43 +3326,6 @@ { "time": 0.1666, "x": 1, "y": 1 } ] }, - "hip": { - "rotate": [ - { "time": 0, "angle": 0, "curve": "stepped" }, - { "time": 0.0333, "angle": 0 } - ], - "translate": [ - { "time": 0, "x": -62.47, "y": -31.55, "curve": "stepped" }, - { - "time": 0.0333, - "x": -62.47, - "y": -31.55, - "curve": [ 0.266, 0, 0.303, 1 ] - }, - { "time": 0.0666, "x": -34.75, "y": -23.15 }, - { "time": 0.1666, "x": -34.75, "y": -14.31, "curve": "stepped" }, - { - "time": 0.6666, - "x": -34.75, - "y": -14.31, - "curve": [ 0.433, 0, 0.823, 1 ] - }, - { "time": 1.6333, "x": -34.75, "y": -148.55, "curve": "stepped" }, - { "time": 2, "x": -34.75, "y": -148.55 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.0666, "x": 1, "y": 1 }, - { "time": 0.0864, "x": 0.9, "y": 1.1 }, - { - "time": 0.1144, - "x": 1.163, - "y": 1, - "curve": [ 0.074, 0.48, 0.331, 1 ] - }, - { "time": 0.2333, "x": 1, "y": 1 } - ] - }, "front_shin": { "rotate": [ { @@ -2063,6 +3404,43 @@ { "time": 0.1666, "x": 1.208, "y": 1.208 }, { "time": 0.2666, "x": 1, "y": 1 } ] + }, + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.0333, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": -62.47, "y": -31.55, "curve": "stepped" }, + { + "time": 0.0333, + "x": -62.47, + "y": -31.55, + "curve": [ 0.266, 0, 0.303, 1 ] + }, + { "time": 0.0666, "x": -34.75, "y": -23.15 }, + { "time": 0.1666, "x": -34.75, "y": -14.31, "curve": "stepped" }, + { + "time": 0.6666, + "x": -34.75, + "y": -14.31, + "curve": [ 0.433, 0, 0.823, 1 ] + }, + { "time": 1.6333, "x": -34.75, "y": -148.55, "curve": "stepped" }, + { "time": 2, "x": -34.75, "y": -148.55 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.0666, "x": 1, "y": 1 }, + { "time": 0.0864, "x": 0.9, "y": 1.1 }, + { + "time": 0.1144, + "x": 1.163, + "y": 1, + "curve": [ 0.074, 0.48, 0.331, 1 ] + }, + { "time": 0.2333, "x": 1, "y": 1 } + ] } } }, @@ -2112,10 +3490,6 @@ { "time": 0.1333, "x": -7.7, "y": 8.98 }, { "time": 0.5333, "x": -1.26, "y": 3.83 }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "torso": { @@ -2130,10 +3504,6 @@ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.4, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_thigh": { @@ -2161,10 +3531,6 @@ { "time": 0.5333, "x": -9.01, "y": -5.15 }, { "time": 0.6666, "x": -23.18, "y": -2.57 }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_shin": { @@ -2193,10 +3559,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_upper_arm": { @@ -2220,10 +3582,6 @@ { "time": 0.2666, "x": 4.95, "y": -13.13 }, { "time": 0.6, "x": -2.43, "y": 1.94 }, { "time": 0.8, "x": 6.24, "y": 10.05 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_bracer": { @@ -2244,10 +3602,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_fist": { @@ -2264,10 +3618,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_upper_arm": { @@ -2292,10 +3642,6 @@ { "time": 0.2, "x": 21.73, "y": 51.17 }, { "time": 0.6, "x": 4.33, "y": 2.05 }, { "time": 0.8, "x": -2.57, "y": -8.89 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_bracer": { @@ -2317,10 +3663,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "neck": { @@ -2335,10 +3677,6 @@ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.4, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "head": { @@ -2355,45 +3693,6 @@ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.4, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "hip": { - "rotate": [ - { "time": 0, "angle": 0, "curve": "stepped" }, - { "time": 0.8, "angle": 0 } - ], - "translate": [ - { "time": 0, "x": -62.47, "y": -23.1 }, - { - "time": 0.0666, - "x": -62.47, - "y": -38.51, - "curve": [ 0.244, 0.04, 0.75, 1 ] - }, - { - "time": 0.2666, - "x": -62.47, - "y": 22.28, - "curve": [ 0.17, 0.52, 0.75, 1 ] - }, - { "time": 0.4, "x": -62.47, "y": -23.1 }, - { "time": 0.4333, "x": -62.47, "y": -24.59 }, - { - "time": 0.4666, - "x": -62.47, - "y": -43.29, - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { "time": 0.6666, "x": -62.47, "y": 22.28 }, - { "time": 0.8, "x": -62.47, "y": -23.1 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_shin": { @@ -2425,10 +3724,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_foot": { @@ -2453,10 +3748,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_foot": { @@ -2483,10 +3774,6 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "gun": { @@ -2499,10 +3786,37 @@ "translate": [ { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, { "time": 0.8, "x": 0, "y": 0 } + ] + }, + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.8, "angle": 0 } ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } + "translate": [ + { "time": 0, "x": -62.47, "y": -23.1 }, + { + "time": 0.0666, + "x": -62.47, + "y": -38.51, + "curve": [ 0.244, 0.04, 0.75, 1 ] + }, + { + "time": 0.2666, + "x": -62.47, + "y": 22.28, + "curve": [ 0.17, 0.52, 0.75, 1 ] + }, + { "time": 0.4, "x": -62.47, "y": -23.1 }, + { "time": 0.4333, "x": -62.47, "y": -24.59 }, + { + "time": 0.4666, + "x": -62.47, + "y": -43.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 0.6666, "x": -62.47, "y": 22.28 }, + { "time": 0.8, "x": -62.47, "y": -23.1 } ] } }, @@ -2512,6 +3826,108 @@ ] }, "shoot": { + "slots": { + "mouth": { + "attachment": [ + { "time": 0, "name": "mouth_grind" } + ] + }, + "muzzle": { + "color": [ + { + "time": 0.0225, + "color": "ffffff00", + "curve": [ 0.118, 0.99, 0.75, 1 ] + }, + { "time": 0.0666, "color": "ffffffff", "curve": "stepped" }, + { "time": 0.1, "color": "ffffffff" }, + { "time": 0.1666, "color": "ffffff00" } + ], + "attachment": [ + { "time": 0.0333, "name": "muzzle" }, + { "time": 0.1666, "name": null } + ] + } + }, + "bones": { + "gunTip": { + "translate": [ + { "time": 0.0333, "x": 0, "y": 0 }, + { "time": 0.1666, "x": 20.93, "y": 1.57 } + ], + "scale": [ + { + "time": 0.0333, + "x": 1, + "y": 1, + "curve": [ 0.706, 0, 0.49, 1 ] + }, + { "time": 0.1666, "x": 1.247, "y": 1.516 } + ] + }, + "gun": { + "rotate": [ + { "time": 0, "angle": 1.9 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.0333, "x": -6.42, "y": 6.68 }, + { + "time": 0.0666, + "x": 0, + "y": 0, + "curve": [ 0, 0.98, 0.354, 0.98 ] + }, + { "time": 0.1666, "x": -9.3, "y": -1.41 }, + { "time": 0.2666, "x": 0, "y": 0 } + ] + }, + "rear_bracer": { + "rotate": [ + { "time": 0, "angle": -30.47 } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0, 0.3, 0.678, 1 ] + }, + { "time": 0.2, "x": -5.99, "y": -3.71 }, + { "time": 0.2666, "x": 0, "y": 0 } + ] + }, + "rear_upper_arm": { + "rotate": [ + { "time": 0, "angle": 62.3 } + ], + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0, 0.3, 0.678, 1 ] + }, + { "time": 0.2, "x": 2.81, "y": 11.41 }, + { "time": 0.2666, "x": 0, "y": 0 } + ] + }, + "aiming gun target": { + "translate": [ + { "time": 0, "x": 2.57, "y": -9.1 } + ] + } + }, + "ik": { + "aiming constraint": [ + { "time": 0 } + ], + "aiming gun constraint": [ + { "time": 0 } + ] + } + }, + "shoot old": { "slots": { "front_fist": { "attachment": [ @@ -2525,10 +3941,6 @@ ] }, "muzzle": { - "attachment": [ - { "time": 0.1333, "name": "muzzle" }, - { "time": 0.2666, "name": null } - ], "color": [ { "time": 0.1333, @@ -2541,16 +3953,14 @@ "curve": [ 0.821, 0, 0.909, 0.89 ] }, { "time": 0.2666, "color": "ffffff00" } + ], + "attachment": [ + { "time": 0.1333, "name": "muzzle" }, + { "time": 0.2666, "name": null } ] } }, "bones": { - "front_fist": { - "scale": [ - { "time": 0.1333, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.4, "x": 1, "y": 1 } - ] - }, "gunTip": { "translate": [ { "time": 0.1333, "x": 0, "y": 0 }, @@ -2605,7 +4015,20 @@ { "time": 0.3, "x": 2.81, "y": 11.41 }, { "time": 0.4, "x": 0, "y": 0 } ] + }, + "aiming gun target": { + "translate": [ + { "time": 0, "x": -0.06, "y": -10.39 } + ] } + }, + "ik": { + "aiming constraint": [ + { "time": 0 } + ], + "aiming gun constraint": [ + { "time": 0 } + ] } }, "test": { @@ -2763,11 +4186,6 @@ { "time": 0.5, "x": 0.11, "y": 0.41 }, { "time": 0.6, "x": 9.48, "y": 0.27 }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.4, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_shin": { @@ -2780,14 +4198,6 @@ { "time": 0.5, "angle": -26.76 }, { "time": 0.7, "angle": -55.44 }, { "time": 0.8, "angle": 5.12 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_thigh": { @@ -2808,10 +4218,6 @@ { "time": 0.5, "x": 0, "y": 0 }, { "time": 0.7, "x": -21.14, "y": -9.6 }, { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_shin": { @@ -2826,10 +4232,6 @@ { "time": 0.7, "angle": 21.85 }, { "time": 0.8, "angle": 14.26 } ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], "scale": [ { "time": 0, "x": 1, "y": 1 }, { "time": 0.1, "x": 0.951, "y": 1 }, @@ -2848,14 +4250,6 @@ { "time": 0.6, "angle": -0.97 }, { "time": 0.7, "angle": 2.97 }, { "time": 0.8, "angle": 10.13 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "front_upper_arm": { @@ -2863,14 +4257,6 @@ { "time": 0, "angle": -23.74 }, { "time": 0.4, "angle": -320.57 }, { "time": 0.8, "angle": -23.74 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "rear_upper_arm": { @@ -2880,14 +4266,6 @@ { "time": 0.4, "angle": 345.26 }, { "time": 0.5, "angle": 343.44 }, { "time": 0.8, "angle": 11.62 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "torso": { @@ -2897,10 +4275,6 @@ { "time": 0.4, "angle": -12.11 }, { "time": 0.5666, "angle": -15.81 }, { "time": 0.8, "angle": -12.11 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "neck": { @@ -2910,15 +4284,6 @@ { "time": 0.4, "angle": 1.41 }, { "time": 0.6333, "angle": -3.04 }, { "time": 0.8, "angle": 1.41 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.4, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] }, "head": { @@ -2930,22 +4295,73 @@ { "time": 0.5666, "angle": 8.02 }, { "time": 0.6666, "angle": 12.65 }, { "time": 0.8, "angle": 6.97 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.4, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } + ] + }, + "front_bracer": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.4, "angle": 20.59 }, + { "time": 0.8, "angle": 0 } + ] + }, + "front_foot": { + "rotate": [ + { "time": 0, "angle": 12.49 }, + { "time": 0.1, "angle": -8.34 }, + { "time": 0.2, "angle": -6.17 }, + { "time": 0.3, "angle": -0.75 }, + { "time": 0.3333, "angle": 3.89 }, + { "time": 0.4, "angle": 10.22 }, + { "time": 0.5, "angle": 11.44 }, + { "time": 0.6, "angle": -0.33 }, + { "time": 0.7, "angle": 0.15 }, + { "time": 0.8, "angle": 12.49 } + ] + }, + "rear_bracer": { + "rotate": [ + { "time": 0, "angle": 3.58 }, + { "time": 0.1, "angle": 5.51 }, + { "time": 0.4, "angle": -22.77 }, + { "time": 0.5, "angle": -9.65 }, + { "time": 0.8, "angle": 3.58 } + ] + }, + "front_fist": { + "rotate": [ + { "time": 0, "angle": -15.22 }, + { "time": 0.1, "angle": -51.4 }, + { "time": 0.4, "angle": -39.4 }, + { "time": 0.5, "angle": 19.26 }, + { "time": 0.8, "angle": -15.22 } + ] + }, + "gun": { + "rotate": [ + { + "time": 0, + "angle": -24.06, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.1, + "angle": -10.94, + "curve": [ 0.381, 0.54, 0.742, 1 ] + }, + { + "time": 0.4, + "angle": 25.34, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.6666, + "angle": -27.47, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 0.8, "angle": -24.06 } ] }, "hip": { - "rotate": [ - { "time": 0, "angle": 0, "curve": "stepped" }, - { "time": 0.8, "angle": 0 } - ], "translate": [ { "time": 0, @@ -2996,114 +4412,6 @@ "curve": [ 0.615, 0, 0.75, 1 ] }, { "time": 0.8, "x": -23.93, "y": 3.22 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "front_bracer": { - "rotate": [ - { "time": 0, "angle": 0 }, - { "time": 0.4, "angle": 20.59 }, - { "time": 0.8, "angle": 0 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "front_foot": { - "rotate": [ - { "time": 0, "angle": 12.49 }, - { "time": 0.1, "angle": -8.34 }, - { "time": 0.2, "angle": -6.17 }, - { "time": 0.3, "angle": -0.75 }, - { "time": 0.3333, "angle": 3.89 }, - { "time": 0.4, "angle": 10.22 }, - { "time": 0.5, "angle": 11.44 }, - { "time": 0.6, "angle": -0.33 }, - { "time": 0.7, "angle": 0.15 }, - { "time": 0.8, "angle": 12.49 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "rear_bracer": { - "rotate": [ - { "time": 0, "angle": 3.58 }, - { "time": 0.1, "angle": 5.51 }, - { "time": 0.4, "angle": -22.77 }, - { "time": 0.5, "angle": -9.65 }, - { "time": 0.8, "angle": 3.58 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "front_fist": { - "rotate": [ - { "time": 0, "angle": -15.22 }, - { "time": 0.1, "angle": -51.4 }, - { "time": 0.4, "angle": -39.4 }, - { "time": 0.5, "angle": 19.26 }, - { "time": 0.8, "angle": -15.22 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } - ] - }, - "gun": { - "rotate": [ - { - "time": 0, - "angle": -24.06, - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 0.1, - "angle": -10.94, - "curve": [ 0.381, 0.54, 0.742, 1 ] - }, - { - "time": 0.4, - "angle": 25.34, - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { - "time": 0.6666, - "angle": -27.47, - "curve": [ 0.25, 0, 0.75, 1 ] - }, - { "time": 0.8, "angle": -24.06 } - ], - "translate": [ - { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, - { "time": 0.8, "x": 0, "y": 0 } - ], - "scale": [ - { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, - { "time": 0.8, "x": 1, "y": 1 } ] } } diff --git a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.png.meta b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.png.meta index 64f7ac3b3..f022f2d10 100644 --- a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.png.meta +++ b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 49bb65eefe08e424bbf7a38bc98ec638 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Atlas.asset b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Atlas.asset index 464fe2827..ae8491bec 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Material.mat b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Material.mat index cb02038bf..7333f766e 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Material.mat and b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_SkeletonData.asset index d5b6bf7d3..4ba0e80ab 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Spineboy/spineboy_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.json b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.json index 52129857a..dc2838e93 100644 --- a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.json +++ b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.json @@ -1,70 +1,66 @@ { -"skeleton": { "hash": "LB6lK51rA9CQsAi/AwR23H3jVZY", "spine": "3.0.11", "width": 519.72, "height": 542.19, "images": "" }, +"skeleton": { "hash": "mDzkOfnXqTuFIADT0TiLHSO3Mh4", "spine": "3.3.07", "width": 525.12, "height": 543.06, "images": "" }, "bones": [ { "name": "root" }, - { "name": "hip", "parent": "root", "length": 68.61, "x": -19.9, "y": 151.37, "rotation": -171.49, "color": "ffe941ff" }, - { "name": "lumbar", "parent": "hip", "length": 33.93, "x": 0.07, "y": -4.74, "rotation": -97.88 }, - { "name": "femurR", "parent": "hip", "length": 45.3, "x": 43.53, "y": 43.45, "rotation": 53.25 }, - { "name": "femurL", "parent": "hip", "length": 92.96, "x": -52.77, "y": 39.86, "rotation": 125.21 }, - { "name": "strap anchor", "parent": "hip", "length": 31.94, "x": 2.3, "y": 43.77, "rotation": -85.09, "color": "ff702eff" }, - { "name": "thorax", "parent": "lumbar", "length": 54.39, "x": 35.09, "y": -0.8, "rotation": -18.29 }, - { "name": "strap tie", "parent": "thorax", "length": 32.33, "x": 48.07, "y": 9.54, "rotation": 174.59, "color": "ff702eff" }, - { "name": "humerusR", "parent": "thorax", "length": 55.73, "x": 23.08, "y": 29.13, "rotation": 137.38 }, - { "name": "radiusR", "parent": "humerusR", "length": 47.29, "x": 58.87, "rotation": 4.01 }, + { "name": "hip", "parent": "root", "length": 68.61, "rotation": -171.49, "x": -19.9, "y": 151.37, "color": "ffe941ff" }, + { "name": "lumbar", "parent": "hip", "length": 33.93, "rotation": -97.88, "x": 0.07, "y": -4.74 }, + { "name": "thorax", "parent": "lumbar", "length": 54.39, "rotation": -18.29, "x": 35.09, "y": -0.8 }, + { "name": "humerusL", "parent": "thorax", "length": 73.48, "rotation": -65.21, "x": 41.33, "y": -55.5 }, + { "name": "radiusL", "parent": "humerusL", "length": 65.38, "rotation": 43.11, "x": 75.72, "y": 1.83 }, + { "name": "handL", "parent": "radiusL", "rotation": -52.7, "x": 80.44, "y": 2.06 }, + { "name": "arrowOrigin", "parent": "root", "x": 172.99, "y": 292 }, + { "name": "arrowX", "parent": "arrowOrigin", "length": 71.44, "rotation": -4.7, "x": 47.68, "y": -3.92 }, + { "name": "arrowY", "parent": "arrowOrigin", "length": 71.44, "rotation": 49.81, "x": 37.77, "y": 44.72 }, + { "name": "head", "parent": "thorax", "length": 14.3, "rotation": 6.59, "x": 70.1, "y": -1.78 }, + { "name": "browL", "parent": "head", "length": 31.37, "rotation": -58.18, "x": 128.48, "y": -11.4 }, + { "name": "browR", "parent": "head", "length": 26.75, "rotation": 65.11, "x": 121.66, "y": 39.52 }, + { "name": "eyelids", "parent": "head", "length": 14.96, "rotation": -82.34, "x": 79.11, "y": 8.18 }, + { "name": "femurL", "parent": "hip", "length": 92.96, "rotation": 125.21, "x": -52.77, "y": 39.86 }, + { "name": "femurR", "parent": "hip", "length": 45.3, "rotation": 53.25, "x": 43.53, "y": 43.45 }, + { "name": "tibiaL", "parent": "femurL", "length": 83, "rotation": -24.72, "x": 107.79, "y": -1.31 }, + { "name": "footL", "parent": "tibiaL", "length": 54.47, "rotation": 37.77, "x": 82.83, "y": -20.62 }, + { "name": "hairL1", "parent": "head", "length": 27.5, "rotation": -150.58, "x": 179.86, "y": -9.57 }, + { "name": "hairL2", "parent": "head", "length": 35.09, "rotation": -135.32, "x": 173.5, "y": -26.26 }, + { "name": "hairL2 2", "parent": "hairL2", "length": 32.49, "rotation": 17.32, "x": 37.68, "y": -0.62 }, + { "name": "hairM", "parent": "head", "length": 25.81, "rotation": -173.33, "x": 182.69, "y": 31.1 }, + { "name": "hairML", "parent": "hairM", "length": 46.41, "rotation": 32.57, "x": 13.83, "y": 24.11 }, + { "name": "hairMR", "parent": "hairM", "length": 44.06, "rotation": -6.41, "x": 17, "y": -28.44 }, + { "name": "hairR1", "parent": "head", "length": 43.15, "rotation": -178.89, "x": 157.15, "y": 74.61 }, + { "name": "hairR2", "parent": "head", "length": 49.32, "rotation": 157.66, "x": 179.91, "y": 62.62 }, + { "name": "hairR2 2", "parent": "hairR2", "length": 28.91, "rotation": -50.6, "x": 45.74, "y": -13.91 }, + { "name": "hairSide", "parent": "head", "length": 33.33, "rotation": 94.94, "x": 47.44, "y": -92.9 }, + { "name": "humerusR", "parent": "thorax", "length": 55.73, "rotation": 137.38, "x": 23.08, "y": 29.13 }, + { "name": "radiusR", "parent": "humerusR", "length": 47.29, "rotation": 4.01, "x": 58.87 }, { "name": "handR", "parent": "radiusR", "x": 54.01, "y": -1.07 }, - { "name": "ringR", "parent": "handR", "length": 18.11, "x": -10.21, "y": -16.03, "rotation": -31.44 }, - { "name": "pinkyR", "parent": "handR", "length": 20.98, "x": -15.17, "y": -0.62, "rotation": -38.56 }, - { "name": "middleR", "parent": "handR", "length": 19.24, "x": -3.3, "y": -17.06, "rotation": -23.52 }, - { "name": "indexR", "parent": "handR", "length": 18, "x": 6.82, "y": -13.85, "rotation": -11.04 }, - { "name": "handleCenterTargetR", "parent": "handR", "x": 18.07, "y": 0.06, "rotation": -89, "color": "ff0000ff" }, - { "name": "rotateHandle", "parent": "root", "length": 55.27, "x": -152.63, "y": 153.44, "rotation": 124.8, "color": "ff0000ff" }, + { "name": "handleCenterTargetR", "parent": "handR", "rotation": -89, "x": 18.07, "y": 0.06, "color": "ff0000ff" }, + { "name": "indexL", "parent": "handL", "length": 22, "rotation": 99.18, "x": -13.07, "y": 20.89 }, + { "name": "indexR", "parent": "handR", "length": 18, "rotation": -11.04, "x": 6.82, "y": -13.85 }, + { "name": "irisL", "parent": "head", "rotation": -79.01, "x": 82.7, "y": -29.95 }, + { "name": "irisR", "parent": "head", "rotation": -79.01, "x": 72.86, "y": 40.02 }, + { "name": "middleL", "parent": "handL", "length": 23.21, "rotation": 75.15, "x": 4.54, "y": 20.96 }, + { "name": "middleR", "parent": "handR", "length": 19.24, "rotation": -23.52, "x": -3.3, "y": -17.06 }, + { "name": "mouth", "parent": "head", "rotation": -77.99, "x": 28.05, "y": 0.81 }, + { "name": "mouth opening", "parent": "mouth" }, + { "name": "pinkyL", "parent": "handL", "length": 12.17, "rotation": 37.78, "x": 22.03, "y": -15.19 }, + { "name": "pinkyR", "parent": "handR", "length": 20.98, "rotation": -38.56, "x": -15.17, "y": -0.62 }, + { "name": "pony1 1", "parent": "head", "length": 26.78, "rotation": -127.21, "x": 3.24, "y": -49.43 }, + { "name": "pony1 2", "parent": "pony1 1", "length": 20.86, "rotation": -14.7, "x": 29.89, "y": -1.1 }, + { "name": "pony1 3L", "parent": "pony1 2", "length": 36.26, "rotation": -26.46, "x": 27.65, "y": -8.15 }, + { "name": "pony1 3R", "parent": "pony1 2", "length": 37.66, "rotation": -2.95, "x": 34.01, "y": 6.79 }, + { "name": "pony2 1", "parent": "head", "length": 22.09, "rotation": -126.98, "x": 12.68, "y": -53.86 }, + { "name": "pony2 2", "parent": "pony2 1", "length": 24.31, "rotation": 2.08, "x": 25.67, "y": -0.29 }, + { "name": "pony2 3L", "parent": "pony2 2", "length": 33.37, "rotation": -9.21, "x": 31.3, "y": -1.21 }, + { "name": "pony2 3R", "parent": "pony2 2", "length": 43.41, "rotation": 15.37, "x": 27.7, "y": 0.83 }, + { "name": "ringL", "parent": "handL", "length": 15.27, "rotation": 62.01, "x": 21.05, "y": 12.5 }, + { "name": "ringR", "parent": "handR", "length": 18.11, "rotation": -31.44, "x": -10.21, "y": -16.03 }, + { "name": "rotateHandle", "parent": "root", "length": 55.27, "rotation": 124.8, "x": -152.63, "y": 153.44, "color": "ff0000ff" }, { "name": "rs", "parent": "rotateHandle", "scaleX": 1.294, "scaleY": 0.767, "color": "ff0000ff" }, { "name": "rr", "parent": "rs", "color": "ff0000ff" }, - { "name": "humerusL", "parent": "thorax", "length": 73.48, "x": 41.33, "y": -55.5, "rotation": -65.21 }, - { "name": "radiusL", "parent": "humerusL", "length": 65.38, "x": 75.72, "y": 1.83, "rotation": 43.11 }, - { "name": "handL", "parent": "radiusL", "x": 80.44, "y": 2.06, "rotation": -52.7 }, - { "name": "ringL", "parent": "handL", "length": 15.27, "x": 21.05, "y": 12.5, "rotation": 62.01 }, - { "name": "pinkyL", "parent": "handL", "length": 12.17, "x": 22.03, "y": -15.19, "rotation": 37.78 }, - { "name": "middleL", "parent": "handL", "length": 23.21, "x": 4.54, "y": 20.96, "rotation": 75.15 }, - { "name": "indexL", "parent": "handL", "length": 22, "x": -13.07, "y": 20.89, "rotation": 99.18 }, - { "name": "arrowOrigin", "parent": "root", "x": 172.99, "y": 292 }, - { "name": "arrowY", "parent": "arrowOrigin", "length": 71.44, "x": 37.77, "y": 44.72, "rotation": 49.81 }, - { "name": "arrowX", "parent": "arrowOrigin", "length": 71.44, "x": 47.68, "y": -3.92, "rotation": -4.7 }, - { "name": "head", "parent": "thorax", "length": 14.3, "x": 70.1, "y": -1.78, "rotation": 6.59 }, - { "name": "pony2 1", "parent": "head", "length": 22.09, "x": 12.68, "y": -53.86, "rotation": -126.98 }, - { "name": "pony2 2", "parent": "pony2 1", "length": 24.31, "x": 25.67, "y": -0.29, "rotation": 2.08 }, - { "name": "pony2 3R", "parent": "pony2 2", "length": 43.41, "x": 27.7, "y": 0.83, "rotation": 15.37 }, - { "name": "pony2 3L", "parent": "pony2 2", "length": 33.37, "x": 31.3, "y": -1.21, "rotation": -9.21 }, - { "name": "pony1 1", "parent": "head", "length": 26.78, "x": 3.24, "y": -49.43, "rotation": -127.21 }, - { "name": "pony1 2", "parent": "pony1 1", "length": 20.86, "x": 29.89, "y": -1.1, "rotation": -14.7 }, - { "name": "pony1 3R", "parent": "pony1 2", "length": 37.66, "x": 34.01, "y": 6.79, "rotation": -2.95 }, - { "name": "pony1 3L", "parent": "pony1 2", "length": 36.26, "x": 27.65, "y": -8.15, "rotation": -26.46 }, - { "name": "mouth", "parent": "head", "x": 28.05, "y": 0.81, "rotation": -77.99 }, - { "name": "mouth opening", "parent": "mouth" }, - { "name": "irisR", "parent": "head", "x": 72.86, "y": 40.02, "rotation": -79.01 }, - { "name": "irisL", "parent": "head", "x": 82.7, "y": -29.95, "rotation": -79.01 }, - { "name": "hairSide", "parent": "head", "length": 33.33, "x": 47.44, "y": -92.9, "rotation": 94.94 }, - { "name": "hairR2", "parent": "head", "length": 49.32, "x": 179.91, "y": 62.62, "rotation": 157.66 }, - { "name": "hairR2 2", "parent": "hairR2", "length": 28.91, "x": 45.74, "y": -13.91, "rotation": -50.6 }, - { "name": "hairR1", "parent": "head", "length": 43.15, "x": 157.15, "y": 74.61, "rotation": -178.89 }, - { "name": "hairM", "parent": "head", "length": 25.81, "x": 182.69, "y": 31.1, "rotation": -173.33 }, - { "name": "hairMR", "parent": "hairM", "length": 44.06, "x": 17, "y": -28.44, "rotation": -6.41 }, - { "name": "hairML", "parent": "hairM", "length": 46.41, "x": 13.83, "y": 24.11, "rotation": 32.57 }, - { "name": "hairL2", "parent": "head", "length": 35.09, "x": 173.5, "y": -26.26, "rotation": -135.32 }, - { "name": "hairL2 2", "parent": "hairL2", "length": 32.49, "x": 37.68, "y": -0.62, "rotation": 17.32 }, - { "name": "hairL1", "parent": "head", "length": 27.5, "x": 179.86, "y": -9.57, "rotation": -150.58 }, - { "name": "eyelids", "parent": "head", "length": 14.96, "x": 79.11, "y": 8.18, "rotation": -82.34 }, - { "name": "browR", "parent": "head", "length": 26.75, "x": 121.66, "y": 39.52, "rotation": 65.11 }, - { "name": "browL", "parent": "head", "length": 31.37, "x": 128.48, "y": -11.4, "rotation": -58.18 }, - { "name": "thumbL", "parent": "handL", "length": 16.61, "x": -29.83, "y": -12.11, "rotation": 150.77 }, - { "name": "thumbR", "parent": "handR", "length": 20.56, "x": 4.36, "y": 18.56, "rotation": -7.45 }, - { "name": "tibiaL", "parent": "femurL", "length": 83, "x": 107.79, "y": -1.31, "rotation": -24.72 }, - { "name": "footL", "parent": "tibiaL", "length": 54.47, "x": 82.83, "y": -20.62, "rotation": 37.77 }, - { "name": "tibiaR", "parent": "femurR", "length": 42.31, "x": 52.54, "y": 9.88, "rotation": 106.18 } -], -"transform": [ - { "name": "rotateHandleTarget", "bone": "rotateHandle", "target": "handleCenterTargetR", "translateMix": 1.0 }, - { "name": "translateHandleTarget", "bone": "arrowOrigin", "target": "handL", "translateMix": 1.0 } + { "name": "strap anchor", "parent": "hip", "length": 31.94, "rotation": -85.09, "x": 2.3, "y": 43.77, "color": "ff702eff" }, + { "name": "strap tie", "parent": "thorax", "length": 32.33, "rotation": 174.59, "x": 48.07, "y": 9.54, "color": "ff702eff" }, + { "name": "thumbL", "parent": "handL", "length": 16.61, "rotation": 150.77, "x": -29.83, "y": -12.11 }, + { "name": "thumbR", "parent": "handR", "length": 20.56, "rotation": -7.45, "x": 4.36, "y": 18.56 }, + { "name": "tibiaR", "parent": "femurR", "length": 42.31, "rotation": 106.18, "x": 52.54, "y": 9.88 } ], "slots": [ { "name": "rotate", "bone": "rr", "attachment": "rotate" }, @@ -110,14 +106,26 @@ { "name": "arrowY", "bone": "arrowY", "attachment": "arrowY" }, { "name": "arrowX", "bone": "arrowX", "attachment": "arrowX" } ], +"transform": [ + { + "name": "rotateHandleTarget", + "bones": [ "rotateHandle" ], + "target": "handleCenterTargetR" + }, + { + "name": "translateHandleTarget", + "bones": [ "arrowOrigin" ], + "target": "handL" + } +], "skins": { "default": { "armL": { "armL": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0, 0.53854, 0.04432, 0.51804, 0.12166, 0.54622, 0.18646, 0.55903, 0.30561, 0.55903, 0.3934, 0.5411, 0.46656, 0.44375, 0.51882, 0.33872, 0.57944, 0.20807, 0.63169, 0.09022, 0.71322, 0.02618, 0.79683, 5.6E-4, 0.91598, 0.01081, 0.98914, 0.11584, 1, 0.2798, 0.99332, 0.41045, 0.95778, 0.54622, 0.87626, 0.69993, 0.79265, 0.80497, 0.65887, 0.88438, 0.47701, 0.94843, 0.3077, 0.97405, 0.17601, 0.97149, 0.11748, 0.98429, 0.07149, 0.99967, 0.03386, 0.95355, 0, 0.8562, 0, 0.64614, 0.17852, 0.72842, 0.42193, 0.62878, 0.64362, 0.53195, 0.79941, 0.13446, 0.60451, 0.76196, 0.36098, 0.83549, 0.76897, 0.34426, 0.84802, 0.50653 ], "triangles": [ 24, 25, 23, 26, 23, 25, 26, 27, 28, 27, 1, 2, 27, 0, 1, 17, 30, 35, 17, 35, 16, 7, 8, 34, 16, 35, 15, 31, 8, 9, 34, 31, 14, 31, 9, 10, 31, 13, 14, 10, 11, 31, 31, 12, 13, 31, 11, 12, 15, 34, 14, 34, 8, 31, 35, 34, 15, 30, 34, 35, 30, 7, 34, 18, 32, 17, 30, 17, 32, 29, 6, 30, 6, 7, 30, 29, 5, 6, 33, 29, 32, 22, 23, 26, 21, 33, 20, 21, 22, 33, 22, 28, 33, 28, 22, 26, 20, 32, 19, 20, 33, 32, 29, 33, 28, 28, 3, 4, 4, 29, 28, 27, 2, 28, 28, 2, 3, 29, 4, 5, 19, 32, 18, 32, 29, 30 ], - "vertices": [ 1, 6, 72.47, -38.62, 1, 1, 6, 77.25, -44.69, 1, 3, 19, 17.27, 31.86, 0.8272, 20, -22.11, 61.87, 0.00479, 6, 77.49, -57.83, 0.16799, 2, 19, 27.54, 28.85, 0.95931, 20, -16.67, 52.66, 0.04067, 2, 19, 46.81, 26.42, 0.89979, 20, -4.27, 37.71, 0.1002, 2, 19, 61.3, 27, 0.58207, 20, 6.69, 28.22, 0.41792, 3, 19, 74.75, 38.36, 0.24874, 20, 24.27, 27.31, 0.62043, 21, -54.13, -29.38, 0.1308, 2, 20, 40.46, 29.68, 0.60754, 21, -46.2, -15.07, 0.39245, 1, 21, -37.05, 2.7, 1, 1, 21, -29.18, 18.70999, 1, 1, 21, -16.26, 27.78, 1, 1, 21, -2.78, 31.75, 1, 1, 21, 16.67, 31.19, 1, 2, 20, 112.22, -10.38, 0.00319, 21, 29.17, 17.71999, 0.9968, 1, 21, 31.84, -3.98, 1, 1, 21, 31.47, -21.39, 1, 2, 20, 64.9, -43, 0.34301, 21, 26.44, -39.68, 0.65698, 3, 19, 136.75, -3.77, 0.00362, 20, 40.68999, -45.83, 0.69388, 21, 14, -60.66, 0.30249, 3, 19, 121.48, -15.93, 0.19497, 20, 21.23, -44.26, 0.50686, 21, 0.96, -75.18, 0.29815, 2, 19, 98.53, -23.69, 0.6028, 20, -0.81, -34.22, 0.39719, 2, 19, 68.06, -28.44, 0.98196, 20, -26.29, -16.85, 0.01803, 1, 19, 40.25, -28.37, 1, 1, 19, 19, -25.35, 1, 2, 19, 9.32, -25.85, 0.82399, 6, 21.76, -74.8, 0.176, 1, 6, 17.54999, -68.26999, 1, 1, 6, 21.54, -60.58, 1, 1, 6, 32.21, -51.4, 1, 1, 6, 58.83, -42.95, 1, 2, 19, 23.44, 6.66, 0.99126, 20, -34.84, 39.27, 0.00873, 2, 19, 64.46, 14.85, 0.69542, 20, 0.68, 17.2, 0.30456, 2, 20, 33.66999, -2.38, 0.736, 21, -24.8, -39.9, 0.26399, 1, 21, -1.62, 13.97, 1, 2, 19, 91.77, -6.43, 0.73823, 20, 6.05, -17.01, 0.26176, 1, 19, 51.17, -11.17, 1, 2, 20, 65.92, -2.16, 0.336, 21, -5.42, -14.11, 0.66399, 1, 21, 8.34, -35.14, 1 ], + "vertices": [ 1, 3, 72.47, -38.62, 1, 1, 3, 77.25, -44.69, 1, 3, 4, 17.27, 31.86, 0.8272, 5, -22.11, 61.87, 0.00479, 3, 77.49, -57.83, 0.16799, 2, 4, 27.54, 28.85, 0.95931, 5, -16.67, 52.66, 0.04067, 2, 4, 46.81, 26.42, 0.89979, 5, -4.27, 37.71, 0.1002, 2, 4, 61.3, 27, 0.58207, 5, 6.69, 28.22, 0.41792, 3, 4, 74.75, 38.36, 0.24874, 5, 24.27, 27.31, 0.62043, 6, -54.13, -29.38, 0.1308, 2, 5, 40.46, 29.68, 0.60754, 6, -46.2, -15.07, 0.39245, 1, 6, -37.05, 2.7, 1, 1, 6, -29.18, 18.70999, 1, 1, 6, -16.26, 27.78, 1, 1, 6, -2.78, 31.75, 1, 1, 6, 16.67, 31.19, 1, 2, 5, 112.22, -10.38, 0.00319, 6, 29.17, 17.71999, 0.9968, 1, 6, 31.84, -3.98, 1, 1, 6, 31.47, -21.39, 1, 2, 5, 64.9, -43, 0.34301, 6, 26.44, -39.68, 0.65698, 3, 4, 136.75, -3.77, 0.00362, 5, 40.68999, -45.83, 0.69388, 6, 14, -60.66, 0.30249, 3, 4, 121.48, -15.93, 0.19497, 5, 21.23, -44.26, 0.50686, 6, 0.96, -75.18, 0.29815, 2, 4, 98.53, -23.69, 0.6028, 5, -0.81, -34.22, 0.39719, 2, 4, 68.06, -28.44, 0.98196, 5, -26.29, -16.85, 0.01803, 1, 4, 40.25, -28.37, 1, 1, 4, 19, -25.35, 1, 2, 4, 9.32, -25.85, 0.82399, 3, 21.76, -74.8, 0.176, 1, 3, 17.54999, -68.26999, 1, 1, 3, 21.54, -60.58, 1, 1, 3, 32.21, -51.4, 1, 1, 3, 58.83, -42.95, 1, 2, 4, 23.44, 6.66, 0.99126, 5, -34.84, 39.27, 0.00873, 2, 4, 64.46, 14.85, 0.69542, 5, 0.68, 17.2, 0.30456, 2, 5, 33.66999, -2.38, 0.736, 6, -24.8, -39.9, 0.26399, 1, 6, -1.62, 13.97, 1, 2, 4, 91.77, -6.43, 0.73823, 5, 6.05, -17.01, 0.26176, 1, 4, 51.17, -11.17, 1, 2, 5, 65.92, -2.16, 0.336, 6, -5.42, -14.11, 0.66399, 1, 6, 8.34, -35.14, 1 ], "hull": 28, "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, 30, 30, 32, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 46, 48, 48, 50, 50, 52, 52, 54, 54, 0 ], "width": 163, @@ -126,10 +134,10 @@ }, "armR": { "armR": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0, 0.7003, 0.04189, 0.50764, 0.19978, 0.38837, 0.34264, 0.32186, 0.43474, 0.29663, 0.53625, 0.22553, 0.75429, 0.06727, 0.88211, 0, 0.9761, 0.02828, 1, 0.22323, 0.96294, 0.34479, 0.86708, 0.46635, 0.68662, 0.60397, 0.60016, 0.67966, 0.51557, 0.75534, 0.39151, 0.86314, 0.27685, 0.97094, 0.18662, 1, 0.087, 0.96177, 0.03061, 0.87232, 0, 0.79434, 0.13963, 0.63837, 0.30505, 0.50764, 0.47422, 0.41819, 0.62647, 0.31039, 0.81068, 0.16131, 0.16783, 0.86314, 0.27685, 0.74158, 0.44038, 0.60626, 0.6152, 0.48012, 0.77121, 0.3425, 0.90843, 0.2347 ], "triangles": [ 22, 2, 3, 23, 22, 3, 23, 3, 4, 28, 22, 23, 13, 28, 29, 21, 1, 2, 21, 2, 22, 0, 1, 21, 27, 21, 22, 27, 22, 28, 14, 28, 13, 27, 28, 14, 20, 0, 21, 26, 21, 27, 20, 21, 26, 15, 27, 14, 26, 27, 15, 19, 20, 26, 18, 19, 26, 16, 26, 15, 17, 18, 26, 16, 17, 26, 25, 6, 7, 24, 5, 6, 8, 25, 7, 31, 8, 9, 31, 25, 8, 25, 24, 6, 30, 24, 25, 30, 25, 31, 10, 31, 9, 30, 31, 10, 24, 23, 4, 24, 4, 5, 11, 30, 10, 29, 23, 24, 29, 24, 30, 29, 30, 11, 12, 29, 11, 28, 23, 29, 12, 13, 29 ], - "vertices": [ 1, 9, 65.4, -17.71999, 1, 1, 9, 49.09, -32.07, 1, 2, 8, 85.41, -29.41, 0.00107, 9, 24.41, -31.2, 0.99892, 2, 8, 65.32, -26.27, 0.14336, 9, 4.59, -26.65, 0.85663, 2, 8, 53.32, -22.57, 0.51598, 9, -7.11, -22.13, 0.48401, 2, 8, 37.75999, -22.59, 0.92586, 9, -22.64, -21.06, 0.07413, 2, 8, 4.02, -23.16, 0.99998, 9, -56.34, -19.26, 1.0E-5, 2, 8, -14.37, -21.08, 0.99998, 9, -74.54, -15.9, 1.0E-5, 2, 8, -23.69, -12.19, 0.99998, 9, -83.21, -6.39, 1.0E-5, 2, 8, -15.89, 7.82, 0.99999, 9, -74.04, 13.03, 0, 1, 8, -5.03, 16.87, 1, 1, 8, 12.61, 22.04, 1, 2, 8, 40.89, 23.14, 0.90115, 9, -16.32, 24.34, 0.09884, 2, 8, 54.97, 24.58, 0.45832, 9, -2.17, 24.8, 0.54167, 2, 8, 68.83, 26.16, 0.06028, 9, 11.76, 25.4, 0.93971, 1, 9, 32, 25.98, 1, 1, 9, 51.21, 27.27, 1, 1, 9, 62.95, 23.22, 1, 1, 9, 71.64, 12.39, 1, 1, 9, 72.44999, 0.12, 1, 1, 9, 71.11, -9.2, 1, 1, 9, 46.22, -13, 1, 2, 8, 79.72, -11.18, 0.00278, 9, 20.01, -12.61, 0.99721, 2, 8, 55.35, -8.46, 0.56562, 9, -4.1, -8.18999, 0.43437, 2, 8, 31.94, -8.6, 0.9957, 9, -27.47, -6.7, 0.00429, 2, 8, 2.59999, -10.53, 0.99999, 9, -56.87, -6.57, 0, 1, 9, 56.73, 9.43999, 1, 1, 9, 37.31, 6.49, 1, 1, 9, 11.03, 6.33, 1, 2, 8, 42.43, 6.7, 0.94672, 9, -15.93, 7.83, 0.05327, 1, 8, 16.96999, 3.99, 1, 2, 8, -4.69999, 2.86, 0.99999, 9, -63.22, 7.3, 0 ], + "vertices": [ 1, 29, 65.4, -17.71999, 1, 1, 29, 49.09, -32.07, 1, 2, 28, 85.41, -29.41, 0.00107, 29, 24.41, -31.2, 0.99892, 2, 28, 65.32, -26.27, 0.14336, 29, 4.59, -26.65, 0.85663, 2, 28, 53.32, -22.57, 0.51598, 29, -7.11, -22.13, 0.48401, 2, 28, 37.75999, -22.59, 0.92586, 29, -22.64, -21.06, 0.07413, 2, 28, 4.02, -23.16, 0.99998, 29, -56.34, -19.26, 1.0E-5, 2, 28, -14.37, -21.08, 0.99998, 29, -74.54, -15.9, 1.0E-5, 2, 28, -23.69, -12.19, 0.99998, 29, -83.21, -6.39, 1.0E-5, 2, 28, -15.89, 7.82, 0.99999, 29, -74.04, 13.03, 0, 1, 28, -5.03, 16.87, 1, 1, 28, 12.61, 22.04, 1, 2, 28, 40.89, 23.14, 0.90115, 29, -16.32, 24.34, 0.09884, 2, 28, 54.97, 24.58, 0.45832, 29, -2.17, 24.8, 0.54167, 2, 28, 68.83, 26.16, 0.06028, 29, 11.76, 25.4, 0.93971, 1, 29, 32, 25.98, 1, 1, 29, 51.21, 27.27, 1, 1, 29, 62.95, 23.22, 1, 1, 29, 71.64, 12.39, 1, 1, 29, 72.44999, 0.12, 1, 1, 29, 71.11, -9.2, 1, 1, 29, 46.22, -13, 1, 2, 28, 79.72, -11.18, 0.00278, 29, 20.01, -12.61, 0.99721, 2, 28, 55.35, -8.46, 0.56562, 29, -4.1, -8.18999, 0.43437, 2, 28, 31.94, -8.6, 0.9957, 29, -27.47, -6.7, 0.00429, 2, 28, 2.59999, -10.53, 0.99999, 29, -56.87, -6.57, 0, 1, 29, 56.73, 9.43999, 1, 1, 29, 37.31, 6.49, 1, 1, 29, 11.03, 6.33, 1, 2, 28, 42.43, 6.7, 0.94672, 29, -15.93, 7.83, 0.05327, 1, 28, 16.96999, 3.99, 1, 2, 28, -4.69999, 2.86, 0.99999, 29, -63.22, 7.3, 0 ], "hull": 21, "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, 30, 30, 32, 32, 34, 34, 36, 36, 38, 38, 40, 0, 40, 42, 44, 44, 46, 46, 48, 48, 50, 52, 54, 54, 56, 56, 58, 58, 60, 60, 62 ], "width": 133, @@ -144,10 +152,10 @@ }, "body": { "body": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0.38823, 0, 0.3066, 0, 0.21707, 0.04123, 0.15987, 0.09148, 0.10764, 0.16385, 0.09272, 0.24023, 0.10142, 0.3116, 0.1151, 0.37391, 0.08153, 0.41512, 0.04919, 0.46638, 0, 0.58297, 0, 0.6684, 0.07531, 0.68548, 0.1723, 0.66538, 0.22329, 0.6091, 0.26929, 0.58096, 0.35261, 0.55583, 0.43841, 0.57593, 0.49561, 0.60206, 0.54535, 0.62116, 0.62867, 0.66639, 0.65354, 0.6885, 0.65851, 0.71765, 0.6697, 0.77594, 0.69955, 0.85231, 0.7468, 0.92568, 0.77665, 0.94678, 0.82639, 0.97292, 0.92587, 0.99704, 1, 1, 1, 0.95181, 1, 0.91796, 1, 0.88949, 0.99426, 0.84326, 0.96441, 0.73672, 0.92214, 0.66235, 0.88732, 0.62415, 0.86618, 0.60405, 0.84628, 0.58395, 0.76918, 0.51762, 0.661, 0.44726, 0.61002, 0.4151, 0.57768, 0.38595, 0.54038, 0.34675, 0.5267, 0.30756, 0.52581, 0.27771, 0.55068, 0.2566, 0.58425, 0.2375, 0.6228, 0.21037, 0.65389, 0.14705, 0.63897, 0.08674, 0.56933, 0.04252, 0.46985, 0, 0.21649, 0.53614, 0.2549, 0.38287, 0.38346, 0.24995, 0.24331, 0.30662, 0.69584, 0.53321, 0.48354, 0.10468, 0.33238, 0.32689, 0.37187, 0.1683, 0.7505, 0.7801, 0.2752, 0.11006, 0.28246, 0.22606, 0.63511, 0.56427, 0.12875, 0.57015, 0.79784, 0.67188, 0.16469, 0.44561, 0.50331, 0.42526, 0.17172, 0.25178, 0.57192, 0.16189, 0.45878, 0.31875, 0.47189, 0.20966, 0.29645, 0.47484, 0.9177, 0.90248, 0.71807, 0.60369, 0.3892, 0.07463, 0.17518, 0.34541, 0.87803, 0.78245, 0.38636, 0.40615, 0.40981, 0.49336, 0.79937, 0.88039, 0.42912, 0.13933, 0.19937, 0.16866, 0.56174, 0.51389, 0.48177, 0.52211, 0.3175, 0.39771, 0.7973, 0.91644, 0.94422, 0.96365 ], "triangles": [ 28, 88, 29, 88, 30, 29, 28, 27, 88, 26, 87, 27, 27, 87, 88, 87, 74, 88, 30, 88, 31, 88, 74, 31, 26, 25, 87, 71, 55, 72, 45, 72, 46, 47, 46, 70, 5, 4, 69, 69, 83, 63, 69, 4, 83, 63, 60, 55, 72, 60, 82, 72, 55, 60, 46, 72, 70, 47, 70, 48, 83, 62, 63, 63, 62, 60, 48, 70, 49, 72, 58, 70, 72, 82, 58, 4, 3, 83, 83, 3, 62, 60, 62, 76, 60, 76, 82, 76, 1, 0, 1, 76, 62, 58, 51, 70, 70, 50, 49, 70, 51, 50, 82, 76, 58, 3, 2, 62, 62, 2, 1, 76, 52, 58, 58, 52, 51, 76, 0, 52, 59, 63, 55, 87, 25, 81, 74, 32, 31, 87, 81, 74, 81, 25, 24, 81, 78, 74, 74, 33, 32, 74, 78, 33, 24, 61, 81, 81, 61, 78, 24, 23, 61, 78, 34, 33, 61, 66, 78, 35, 78, 66, 78, 35, 34, 35, 66, 36, 36, 66, 37, 66, 61, 22, 61, 23, 22, 22, 21, 66, 66, 38, 37, 21, 75, 66, 21, 20, 75, 66, 75, 38, 20, 64, 75, 20, 19, 64, 19, 84, 64, 19, 18, 84, 64, 57, 75, 75, 39, 38, 75, 57, 39, 17, 85, 18, 18, 85, 84, 57, 64, 40, 64, 84, 40, 57, 40, 39, 84, 85, 68, 85, 80, 68, 84, 41, 40, 41, 68, 42, 41, 84, 68, 65, 67, 53, 67, 9, 8, 13, 12, 65, 65, 12, 10, 12, 11, 10, 13, 65, 14, 65, 53, 14, 10, 9, 65, 65, 9, 67, 14, 53, 15, 16, 15, 73, 16, 80, 17, 17, 80, 85, 15, 53, 73, 16, 73, 80, 79, 73, 86, 73, 79, 80, 53, 67, 73, 80, 79, 68, 67, 54, 73, 73, 54, 86, 8, 7, 67, 67, 77, 54, 67, 7, 77, 79, 71, 68, 68, 43, 42, 43, 71, 44, 43, 68, 71, 86, 59, 79, 79, 59, 71, 86, 54, 59, 77, 56, 54, 54, 56, 59, 7, 6, 77, 6, 69, 77, 77, 69, 56, 56, 63, 59, 59, 55, 71, 71, 45, 44, 71, 72, 45, 6, 5, 69, 56, 69, 63 ], - "vertices": [ 1, 6, 77.69, -3.35, 1, 1, 6, 70.93, 17.96999, 1, 5, 1, 5.71, -100.8, 0.0145, 57, -247.48, -75.75, 0, 2, 94.39, 18.70999, 0.00385, 6, 50.19, 37.13, 0.98163, 19, -80.4, 46.88, 0, 5, 1, 23.74, -86.28, 0.08471, 57, -236.49, -96.13, 0, 2, 77.54, 34.58, 0.03571, 6, 29.21, 46.92, 0.87956, 19, -98.09, 31.93, 0, 5, 1, 41.53, -64.15, 0.26317, 57, -217.96, -117.66, 0, 2, 53.18, 49.18, 0.0809, 6, 1.5, 53.15, 0.65592, 19, -115.36, 9.38, 0, 5, 1, 49.42, -39.15, 0.58274, 57, -194.81, -129.97, 0, 2, 27.34, 53.58, 0.07701, 6, -24.41, 49.22, 0.34024, 19, -122.66, -15.8, 0, 3, 1, 50.65, -14.87, 0.84586, 2, 3.12, 51.48, 0.04506, 6, -46.76, 39.63, 0.10906, 2, 1, 50.08, 6.57, 0.99949, 6, -65.76, 29.68, 5.0E-4, 4, 1, 61.25, 19.02, 0.41233, 3, -8.97, -28.82, 0.58677, 2, -31.9, 57.35, 0, 6, -81.86, 34.22, 8.8E-4, 4, 1, 72.58999, 34.89, 0.07954, 3, 10.52, -28.41, 0.92009, 2, -49.17, 66.42, 0, 6, -101.1, 37.41999, 3.6E-4, 4, 1, 91.79, 71.97, 0.02573, 3, 51.72, -21.6, 0.97336, 2, -88.53, 80.37, 1.0E-5, 6, -142.86, 38.32, 8.9E-4, 4, 1, 96.09, 100.61, 1.0E-5, 3, 77.24, -7.91, 0.99997, 2, -117.49, 80.71, 0, 6, -170.47, 29.57, 1.0E-5, 3, 1, 76.54, 109.4, 1.0E-5, 3, 72.58999, 13, 0.99998, 2, -123.53, 60.14, 0, 2, 1, 49.25, 106.61, 0.14582, 3, 54.02, 33.2, 0.85417, 2, 1, 32.59999, 89.81, 0.31082, 3, 30.6, 36.49, 0.68917, 2, 1, 18.71999, 82.25, 0.83943, 3, 16.24, 43.09, 0.16056, 3, 1, -5.11, 77.22, 0.91391, 3, -2.05, 59.18, 0.048, 4, 3.04, -60.47, 0.03808, 2, 1, -27.35, 87.44, 0.75787, 4, 24.21, -48.2, 0.24212, 3, 1, -41.54, 98.53, 0.16242, 4, 41.45, -43, 0.83708, 57, -42.83, -65.61, 4.8E-4, 4, 1, -54.05, 106.96, 0.00263, 3, -7.5, 116.18, 0.02515, 4, 55.55, -37.64, 0.92652, 57, -32.27, -54.84, 0.04568, 4, 1, -74.35, 125.51, 1.4E-4, 3, -4.78, 143.55, 0.00627, 4, 82.41, -31.75, 0.81754, 57, -10.32, -38.25999, 0.17603, 3, 3, -1.4, 153.1, 2.5E-4, 4, 92.54, -32.00999, 0.60675, 57, -1.01, -34.25999, 0.39299, 2, 4, 100.62, -37.86, 0.33847, 57, 8.76, -36.18999, 0.66152, 2, 4, 117.02, -49.3, 0.13549, 57, 28.45, -39.74, 0.8645, 1, 57, 55.59, -40.45, 1, 2, 57, 83.33, -36.33, 0.92669, 58, -10.6, -11.59, 0.07329, 2, 57, 92.76, -30.93, 0.09793, 58, -0.08, -14.31, 0.90206, 1, 58, 16.06, -16.11, 1, 1, 58, 44.1, -11.17, 1, 1, 58, 62.7, -2.95, 1, 3, 4, 222.66, -25.15, 2.0E-5, 57, 114.34, 26.37, 0.13331, 58, 55.36, 11.64, 0.86666, 3, 4, 216.44, -20.19, 4.5E-4, 57, 106.6, 28.28, 0.42261, 58, 48.75, 24.08, 0.57693, 3, 4, 207.4, -10.55, 8.1E-4, 57, 94.36, 33.25999, 0.66584, 58, 45.88, 30.52, 0.33333, 3, 4, 195, -0.84, 0.00298, 57, 79.03, 36.88, 0.8859, 58, 37.43, 43.82, 0.11111, 2, 4, 163.25, 18.20999, 0.00655, 57, 42.22, 40.93, 0.99344, 2, 4, 137.03, 27.28, 0.05801, 57, 14.6, 38.21, 0.94198, 2, 4, 121.08, 29.34, 0.16158, 57, -0.74, 33.41, 0.83841, 2, 4, 112.15, 29.87, 0.33221, 57, -9.07, 30.16, 0.66778, 2, 4, 103.46, 30.64, 0.60759, 57, -17.29, 27.22, 0.39239, 2, 4, 72.6, 30.93, 0.83736, 57, -45.45, 14.59, 0.16263, 2, 4, 34.88, 26.01, 0.9936, 57, -77.67, -5.65, 0.00639, 3, 1, -81.94, 40.50999, 0.30239, 4, 17.34, 23.46, 0.6976, 57, -92.53, -15.3, 0, 3, 1, -74.65, 29.42, 0.60736, 4, 4.08, 23.89, 0.39263, 57, -104.76, -20.45, 0, 4, 1, -66.51, 14.76, 0.78491, 4, -12.58, 25.69, 0.21277, 57, -120.66, -25.78, 0, 6, -21.76, -78.62, 0.0023, 4, 1, -64.78, 1.05999, 0.77424, 4, -24.77, 32.16999, 0.13585, 57, -134.45, -24.99, 0, 6, -10.22999, -71.03, 0.08989, 4, 1, -66.04, -8.97, 0.68679, 57, -144.09, -21.92, 0, 6, -0.66, -67.74, 0.31202, 19, -6.48, -43.26, 0.00116, 4, 1, -73.83999, -15.03, 0.38179, 57, -148.63, -13.14, 0, 6, 8.22, -72.07, 0.49072, 19, 1.16999, -37.00999, 0.12748, 4, 1, -83.9, -20.07, 0.19577, 57, -151.75, -2.33, 0, 6, 17.17, -78.89, 0.55657, 19, 11.1, -31.74, 0.24764, 3, 1, -95.71, -27.6, 0.10164, 6, 29.13, -86.18, 0.54542, 19, 22.74, -23.93, 0.35293, 3, 1, -107.32, -47.56, 0.07677, 6, 52.17, -87.81, 0.57428, 19, 33.88, -3.69, 0.34892, 3, 1, -106.31, -68.39, 0.03831, 6, 70.42, -77.73, 0.62598, 19, 32.38, 17.1, 0.3357, 3, 1, -89.67, -86.04, 0.01311, 6, 78.94999, -55.01, 0.76821, 19, 15.32, 34.36, 0.21866, 1, 6, 84.45, -24.67, 1, 2, 1, 30.77, 65.08, 0.7233, 3, 9.68999, 23.15, 0.27669, 1, 1, 12.65, 15.26, 1, 3, 57, -165.71, -55.73, 0, 2, 23.09, -26.03, 0.72213, 6, -3.47, -27.71, 0.27785, 1, 1, 11.95, -10.77, 1, 1, 4, 62.53, 12.76, 1, 1, 6, 51.75, -38.97, 1, 3, 1, -11.15, -0.35, 0.71938, 4, -56.85, -10.81, 0.08552, 2, -2.81, -11.72, 0.19508, 3, 57, -192.92, -49.7, 0, 2, 50.81, -23.18, 0.05995, 6, 21.94, -16.32, 0.94004, 1, 57, 37, -19.27, 1, 1, 6, 32.75999, 14.89, 1, 2, 2, 31.52, 1.54, 0.468, 6, -4.12, 1.11, 0.53199, 2, 3, -36.13, 128.74, 1.1E-4, 4, 58.63, -6.53, 0.99988, 1, 3, 31.21, 7.42, 1, 1, 57, 6.55, 4.94999, 1, 3, 1, 40.25, 32.62, 0.73018, 3, -10.64, -3.85, 0.26962, 6, -84.83, 9.38, 1.8E-4, 2, 1, -52.52, 39.57, 0.42399, 4, -0.38, -0.04, 0.57599, 3, 1, 28.59, -32.06, 0.4151, 2, 23.16, 31.98, 0.19535, 6, -21.6, 27.4, 0.38953, 3, 1, -84.36, -45.92, 0.10306, 6, 40.58, -67.92, 0.5254, 19, 10.96, -5.87, 0.37152, 5, 1, -45.81, 2.06, 0.90915, 4, -34.9, 16.11, 0.04371, 57, -136.93, -43.82, 0, 2, -0.46, -46.39, 0.04497, 6, -19.46999, -54.44, 0.00215, 3, 1, -54.85, -33.97, 0.03193, 2, 36.46, -50.42, 0.01639, 6, 16.86, -46.68, 0.95165, 1, 1, 6.02, 47.78, 1, 2, 57, 91.17, 10.5, 0.91199, 58, 27.7, 16.45999, 0.088, 1, 4, 84, 0.64, 1, 1, 6, 53.65, -11.25, 1, 1, 1, 32.37, -0.52999, 1, 1, 57, 49.15, 13.5, 1, 1, 1, -21.79, 28.41, 1, 2, 1, -23.76, 58.6, 0.89677, 4, -1.41, -34.50999, 0.10322, 1, 57, 73.51, -17.7, 1, 1, 6, 36.05, -28.3, 1, 4, 1, 16.92, -58.8, 0.0867, 57, -208.22, -94.43, 0, 2, 51.25, 24.07, 0.04854, 6, 7.54, 28.7, 0.86475, 3, 1, -63.89, 71.66, 5.3E-4, 3, -41.66999, 102.95, 0.01015, 4, 32.39, -9.25, 0.9893, 2, 1, -41.81, 71.16, 0.017, 4, 19.25, -27, 0.98299, 1, 1, -3.56, 22.78, 1, 1, 58, -0.09, -2.88, 1, 1, 58, 43.03, 2.03, 1 ], + "vertices": [ 1, 3, 77.69, -3.35, 1, 1, 3, 70.93, 17.96999, 1, 5, 1, 5.71, -100.8, 0.0145, 16, -247.48, -75.75, 0, 2, 94.39, 18.70999, 0.00385, 3, 50.19, 37.13, 0.98163, 4, -80.4, 46.88, 0, 5, 1, 23.74, -86.28, 0.08471, 16, -236.49, -96.13, 0, 2, 77.54, 34.58, 0.03571, 3, 29.21, 46.92, 0.87956, 4, -98.09, 31.93, 0, 5, 1, 41.53, -64.15, 0.26317, 16, -217.96, -117.66, 0, 2, 53.18, 49.18, 0.0809, 3, 1.5, 53.15, 0.65592, 4, -115.36, 9.38, 0, 5, 1, 49.42, -39.15, 0.58274, 16, -194.81, -129.97, 0, 2, 27.34, 53.58, 0.07701, 3, -24.41, 49.22, 0.34024, 4, -122.66, -15.8, 0, 3, 1, 50.65, -14.87, 0.84586, 2, 3.12, 51.48, 0.04506, 3, -46.76, 39.63, 0.10906, 2, 1, 50.08, 6.57, 0.99949, 3, -65.76, 29.68, 5.0E-4, 4, 1, 61.25, 19.02, 0.41233, 15, -8.97, -28.82, 0.58677, 2, -31.9, 57.35, 0, 3, -81.86, 34.22, 8.8E-4, 4, 1, 72.58999, 34.89, 0.07954, 15, 10.52, -28.41, 0.92009, 2, -49.17, 66.42, 0, 3, -101.1, 37.41999, 3.6E-4, 4, 1, 91.79, 71.97, 0.02573, 15, 51.72, -21.6, 0.97336, 2, -88.53, 80.37, 1.0E-5, 3, -142.86, 38.32, 8.9E-4, 4, 1, 96.09, 100.61, 1.0E-5, 15, 77.24, -7.91, 0.99997, 2, -117.49, 80.71, 0, 3, -170.47, 29.57, 1.0E-5, 3, 1, 76.54, 109.4, 1.0E-5, 15, 72.58999, 13, 0.99998, 2, -123.53, 60.14, 0, 2, 1, 49.25, 106.61, 0.14582, 15, 54.02, 33.2, 0.85417, 2, 1, 32.59999, 89.81, 0.31082, 15, 30.6, 36.49, 0.68917, 2, 1, 18.71999, 82.25, 0.83943, 15, 16.24, 43.09, 0.16056, 3, 1, -5.11, 77.22, 0.91391, 15, -2.05, 59.18, 0.048, 14, 3.04, -60.47, 0.03808, 2, 1, -27.35, 87.44, 0.75787, 14, 24.21, -48.2, 0.24212, 3, 1, -41.54, 98.53, 0.16242, 14, 41.45, -43, 0.83708, 16, -42.83, -65.61, 4.8E-4, 4, 1, -54.05, 106.96, 0.00263, 15, -7.5, 116.18, 0.02515, 14, 55.55, -37.64, 0.92652, 16, -32.27, -54.84, 0.04568, 4, 1, -74.35, 125.51, 1.4E-4, 15, -4.78, 143.55, 0.00627, 14, 82.41, -31.75, 0.81754, 16, -10.32, -38.25999, 0.17603, 3, 15, -1.4, 153.1, 2.5E-4, 14, 92.54, -32.00999, 0.60675, 16, -1.01, -34.25999, 0.39299, 2, 14, 100.62, -37.86, 0.33847, 16, 8.76, -36.18999, 0.66152, 2, 14, 117.02, -49.3, 0.13549, 16, 28.45, -39.74, 0.8645, 1, 16, 55.59, -40.45, 1, 2, 16, 83.33, -36.33, 0.92669, 17, -10.6, -11.59, 0.07329, 2, 16, 92.76, -30.93, 0.09793, 17, -0.08, -14.31, 0.90206, 1, 17, 16.06, -16.11, 1, 1, 17, 44.1, -11.17, 1, 1, 17, 62.7, -2.95, 1, 3, 14, 222.66, -25.15, 2.0E-5, 16, 114.34, 26.37, 0.13331, 17, 55.36, 11.64, 0.86666, 3, 14, 216.44, -20.19, 4.5E-4, 16, 106.6, 28.28, 0.42261, 17, 48.75, 24.08, 0.57693, 3, 14, 207.4, -10.55, 8.1E-4, 16, 94.36, 33.25999, 0.66584, 17, 45.88, 30.52, 0.33333, 3, 14, 195, -0.84, 0.00298, 16, 79.03, 36.88, 0.8859, 17, 37.43, 43.82, 0.11111, 2, 14, 163.25, 18.20999, 0.00655, 16, 42.22, 40.93, 0.99344, 2, 14, 137.03, 27.28, 0.05801, 16, 14.6, 38.21, 0.94198, 2, 14, 121.08, 29.34, 0.16158, 16, -0.74, 33.41, 0.83841, 2, 14, 112.15, 29.87, 0.33221, 16, -9.07, 30.16, 0.66778, 2, 14, 103.46, 30.64, 0.60759, 16, -17.29, 27.22, 0.39239, 2, 14, 72.6, 30.93, 0.83736, 16, -45.45, 14.59, 0.16263, 2, 14, 34.88, 26.01, 0.9936, 16, -77.67, -5.65, 0.00639, 3, 1, -81.94, 40.50999, 0.30239, 14, 17.34, 23.46, 0.6976, 16, -92.53, -15.3, 0, 3, 1, -74.65, 29.42, 0.60736, 14, 4.08, 23.89, 0.39263, 16, -104.76, -20.45, 0, 4, 1, -66.51, 14.76, 0.78491, 14, -12.58, 25.69, 0.21277, 16, -120.66, -25.78, 0, 3, -21.76, -78.62, 0.0023, 4, 1, -64.78, 1.05999, 0.77424, 14, -24.77, 32.16999, 0.13585, 16, -134.45, -24.99, 0, 3, -10.22999, -71.03, 0.08989, 4, 1, -66.04, -8.97, 0.68679, 16, -144.09, -21.92, 0, 3, -0.66, -67.74, 0.31202, 4, -6.48, -43.26, 0.00116, 4, 1, -73.83999, -15.03, 0.38179, 16, -148.63, -13.14, 0, 3, 8.22, -72.07, 0.49072, 4, 1.16999, -37.00999, 0.12748, 4, 1, -83.9, -20.07, 0.19577, 16, -151.75, -2.33, 0, 3, 17.17, -78.89, 0.55657, 4, 11.1, -31.74, 0.24764, 3, 1, -95.71, -27.6, 0.10164, 3, 29.13, -86.18, 0.54542, 4, 22.74, -23.93, 0.35293, 3, 1, -107.32, -47.56, 0.07677, 3, 52.17, -87.81, 0.57428, 4, 33.88, -3.69, 0.34892, 3, 1, -106.31, -68.39, 0.03831, 3, 70.42, -77.73, 0.62598, 4, 32.38, 17.1, 0.3357, 3, 1, -89.67, -86.04, 0.01311, 3, 78.94999, -55.01, 0.76821, 4, 15.32, 34.36, 0.21866, 1, 3, 84.45, -24.67, 1, 2, 1, 30.77, 65.08, 0.7233, 15, 9.68999, 23.15, 0.27669, 1, 1, 12.65, 15.26, 1, 3, 16, -165.71, -55.73, 0, 2, 23.09, -26.03, 0.72213, 3, -3.47, -27.71, 0.27785, 1, 1, 11.95, -10.77, 1, 1, 14, 62.53, 12.76, 1, 1, 3, 51.75, -38.97, 1, 3, 1, -11.15, -0.35, 0.71938, 14, -56.85, -10.81, 0.08552, 2, -2.81, -11.72, 0.19508, 3, 16, -192.92, -49.7, 0, 2, 50.81, -23.18, 0.05995, 3, 21.94, -16.32, 0.94004, 1, 16, 37, -19.27, 1, 1, 3, 32.75999, 14.89, 1, 2, 2, 31.52, 1.54, 0.468, 3, -4.12, 1.11, 0.53199, 2, 15, -36.13, 128.74, 1.1E-4, 14, 58.63, -6.53, 0.99988, 1, 15, 31.21, 7.42, 1, 1, 16, 6.55, 4.94999, 1, 3, 1, 40.25, 32.62, 0.73018, 15, -10.64, -3.85, 0.26962, 3, -84.83, 9.38, 1.8E-4, 2, 1, -52.52, 39.57, 0.42399, 14, -0.38, -0.04, 0.57599, 3, 1, 28.59, -32.06, 0.4151, 2, 23.16, 31.98, 0.19535, 3, -21.6, 27.4, 0.38953, 3, 1, -84.36, -45.92, 0.10306, 3, 40.58, -67.92, 0.5254, 4, 10.96, -5.87, 0.37152, 5, 1, -45.81, 2.06, 0.90915, 14, -34.9, 16.11, 0.04371, 16, -136.93, -43.82, 0, 2, -0.46, -46.39, 0.04497, 3, -19.46999, -54.44, 0.00215, 3, 1, -54.85, -33.97, 0.03193, 2, 36.46, -50.42, 0.01639, 3, 16.86, -46.68, 0.95165, 1, 1, 6.02, 47.78, 1, 2, 16, 91.17, 10.5, 0.91199, 17, 27.7, 16.45999, 0.088, 1, 14, 84, 0.64, 1, 1, 3, 53.65, -11.25, 1, 1, 1, 32.37, -0.52999, 1, 1, 16, 49.15, 13.5, 1, 1, 1, -21.79, 28.41, 1, 2, 1, -23.76, 58.6, 0.89677, 14, -1.41, -34.50999, 0.10322, 1, 16, 73.51, -17.7, 1, 1, 3, 36.05, -28.3, 1, 4, 1, 16.92, -58.8, 0.0867, 16, -208.22, -94.43, 0, 2, 51.25, 24.07, 0.04854, 3, 7.54, 28.7, 0.86475, 3, 1, -63.89, 71.66, 5.3E-4, 15, -41.66999, 102.95, 0.01015, 14, 32.39, -9.25, 0.9893, 2, 1, -41.81, 71.16, 0.017, 14, 19.25, -27, 0.98299, 1, 1, -3.56, 22.78, 1, 1, 17, -0.09, -2.88, 1, 1, 17, 43.03, 2.03, 1 ], "hull": 53, "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, 30, 30, 32, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 46, 48, 48, 50, 50, 52, 52, 54, 54, 56, 56, 58, 58, 60, 64, 66, 66, 68, 68, 70, 70, 72, 72, 74, 74, 76, 76, 78, 78, 80, 80, 82, 82, 84, 84, 86, 86, 88, 88, 90, 90, 92, 92, 94, 94, 96, 96, 98, 98, 100, 100, 102, 102, 104, 104, 0, 174, 176, 60, 62, 62, 64 ], "width": 274, @@ -219,10 +227,10 @@ }, "hairL2": { "hairL2": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0, 0.35686, 0.08751, 0.53469, 0.27039, 0.74739, 0.4906, 0.8764, 0.74067, 0.94614, 0.95342, 1, 1, 0.9287, 0.82279, 0.78574, 0.6399, 0.59048, 0.51673, 0.35686, 0.37117, 0.09883, 0.26666, 0, 0, 0 ], "triangles": [ 3, 2, 8, 3, 8, 7, 4, 3, 7, 5, 4, 7, 6, 5, 7, 0, 12, 11, 0, 11, 10, 0, 10, 9, 1, 0, 9, 2, 1, 9, 2, 9, 8 ], - "vertices": [ 2, 49, 3.3, -16.42, 0.88765, 50, -37.53, -4.84, 0.11234, 2, 49, 17.99, -18.75, 0.67842, 50, -24.2, -11.44, 0.32157, 2, 49, 38.64, -16.93, 0.38403, 50, -3.94, -15.85, 0.61596, 2, 49, 55.47, -9.35999, 0.14944, 50, 14.38, -13.64, 0.85055, 2, 49, 69.74, 2.45, 0.02565, 50, 31.52, -6.6, 0.97434, 1, 50, 45.83, -0.28, 1, 2, 49, 78.86, 18.5, 0.03594, 50, 45, 6, 0.96405, 2, 49, 62.84, 14.07, 0.18299, 50, 28.38, 6.54, 0.817, 2, 49, 43.28, 11.5, 0.44116, 50, 8.96, 9.91, 0.55883, 2, 49, 23.66, 14.09, 0.73855, 50, -9, 18.21999, 0.26144, 2, 49, 1.61, 16.37999, 0.92483, 50, -29.36, 26.97, 0.07515, 2, 49, -8.74, 14.37, 0.99968, 50, -39.86, 28.15, 3.1E-4, 2, 49, -19.25, -1.37, 0.98639, 50, -54.58, 16.24, 0.0136 ], + "vertices": [ 2, 19, 3.3, -16.42, 0.88765, 20, -37.53, -4.84, 0.11234, 2, 19, 17.99, -18.75, 0.67842, 20, -24.2, -11.44, 0.32157, 2, 19, 38.64, -16.93, 0.38403, 20, -3.94, -15.85, 0.61596, 2, 19, 55.47, -9.35999, 0.14944, 20, 14.38, -13.64, 0.85055, 2, 19, 69.74, 2.45, 0.02565, 20, 31.52, -6.6, 0.97434, 1, 20, 45.83, -0.28, 1, 2, 19, 78.86, 18.5, 0.03594, 20, 45, 6, 0.96405, 2, 19, 62.84, 14.07, 0.18299, 20, 28.38, 6.54, 0.817, 2, 19, 43.28, 11.5, 0.44116, 20, 8.96, 9.91, 0.55883, 2, 19, 23.66, 14.09, 0.73855, 20, -9, 18.21999, 0.26144, 2, 19, 1.61, 16.37999, 0.92483, 20, -29.36, 26.97, 0.07515, 2, 19, -8.74, 14.37, 0.99968, 20, -39.86, 28.15, 3.1E-4, 2, 19, -19.25, -1.37, 0.98639, 20, -54.58, 16.24, 0.0136 ], "hull": 13, "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, 0, 24 ], "width": 71, @@ -231,10 +239,10 @@ }, "hairM": { "hairM": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0.12393, 0.10157, 0.05237, 0.3157, 0.00704, 0.53875, 0, 0.87482, 0.03805, 1, 0.10007, 1, 0.3577, 0.91645, 0.49881, 0.9119, 0.6344, 0.90753, 0.91588, 0.95512, 1, 0.97891, 0.94689, 0.76775, 0.87056, 0.5566, 0.86818, 0.33949, 0.83955, 0.09562, 0.67496, 0, 0.29568, 0, 0.50907, 0.24347, 0.34406, 0.60578, 0.22208, 0.30093, 0.67769, 0.45813, 0.58656, 0.67825, 0.16063, 0.73851 ], "triangles": [ 8, 21, 11, 7, 21, 8, 9, 8, 11, 9, 11, 10, 3, 2, 22, 6, 22, 18, 7, 6, 18, 5, 4, 3, 22, 5, 3, 6, 5, 22, 17, 16, 15, 19, 0, 16, 19, 16, 17, 1, 0, 19, 14, 17, 15, 13, 17, 14, 13, 20, 17, 20, 13, 12, 18, 19, 17, 18, 17, 20, 21, 18, 20, 21, 20, 12, 2, 19, 18, 19, 2, 1, 22, 2, 18, 21, 12, 11, 7, 18, 21 ], - "vertices": [ 1, 46, -2.06, -32.41999, 1, 1, 46, 14.88, -38.04, 1, 2, 46, 32.34, -41.09, 0.66666, 47, 16.65, -10.85, 0.33333, 2, 46, 58.19, -39.83, 0.33453, 47, 42.21, -6.71, 0.66546, 3, 46, 67.53, -35.46, 0.16544, 47, 51, -1.33, 0.82718, 48, 13.17, -79.12, 0.00736, 3, 46, 67.08, -29.52, 0.14636, 47, 49.89, 4.51, 0.76915, 48, 15.99, -73.87, 0.08447, 3, 46, 58.82, -5.34, 0.23615, 47, 38.98, 27.62, 0.49129, 48, 22.04, -49.05, 0.27254, 3, 46, 57.45, 8.13, 0.22896, 47, 36.12, 40.87, 0.35342, 48, 28.15, -36.95, 0.4176, 3, 46, 56.14, 21.09, 0.22206, 47, 33.37, 53.6, 0.22094, 48, 34.02, -25.33, 0.55699, 3, 46, 57.77, 48.31, 0.13017, 47, 31.95, 80.83, 0.05675, 48, 50.05, -3.27, 0.81307, 3, 46, 58.99, 56.5, 0.1503, 47, 32.25, 89.1, 0.00247, 48, 55.49, 2.97, 0.84722, 2, 46, 43.16, 50.19, 0.33347, 48, 38.75999, 6.18, 0.66652, 2, 46, 27.5, 41.66999, 0.66666, 48, 20.96999, 7.43, 0.33333, 1, 46, 10.85, 40.18999, 1, 1, 46, -7.66, 36.04, 1, 1, 46, -13.82, 19.73, 1, 1, 46, -11.1, -16.57, 1, 1, 46, 6.05, 5.26, 1, 3, 46, 35.06, -8.43999, 0.61317, 47, 15.72, 21.89, 0.38471, 48, 0.36, -38.87, 0.0021, 1, 46, 12.53, -21.88, 1, 1, 46, 21.32, 22.64, 1, 3, 46, 38.88, 15.18, 0.59023, 47, 16.87999, 45.8, 0.17654, 48, 16.29999, -21.01, 0.23321, 3, 46, 46.57, -25.23, 0.47519, 47, 29.03, 6.48, 0.52382, 48, 1.01, -59.22, 9.8E-4 ], + "vertices": [ 1, 21, -2.06, -32.41999, 1, 1, 21, 14.88, -38.04, 1, 2, 21, 32.34, -41.09, 0.66666, 23, 16.65, -10.85, 0.33333, 2, 21, 58.19, -39.83, 0.33453, 23, 42.21, -6.71, 0.66546, 3, 21, 67.53, -35.46, 0.16544, 23, 51, -1.33, 0.82718, 22, 13.17, -79.12, 0.00736, 3, 21, 67.08, -29.52, 0.14636, 23, 49.89, 4.51, 0.76915, 22, 15.99, -73.87, 0.08447, 3, 21, 58.82, -5.34, 0.23615, 23, 38.98, 27.62, 0.49129, 22, 22.04, -49.05, 0.27254, 3, 21, 57.45, 8.13, 0.22896, 23, 36.12, 40.87, 0.35342, 22, 28.15, -36.95, 0.4176, 3, 21, 56.14, 21.09, 0.22206, 23, 33.37, 53.6, 0.22094, 22, 34.02, -25.33, 0.55699, 3, 21, 57.77, 48.31, 0.13017, 23, 31.95, 80.83, 0.05675, 22, 50.05, -3.27, 0.81307, 3, 21, 58.99, 56.5, 0.1503, 23, 32.25, 89.1, 0.00247, 22, 55.49, 2.97, 0.84722, 2, 21, 43.16, 50.19, 0.33347, 22, 38.75999, 6.18, 0.66652, 2, 21, 27.5, 41.66999, 0.66666, 22, 20.96999, 7.43, 0.33333, 1, 21, 10.85, 40.18999, 1, 1, 21, -7.66, 36.04, 1, 1, 21, -13.82, 19.73, 1, 1, 21, -11.1, -16.57, 1, 1, 21, 6.05, 5.26, 1, 3, 21, 35.06, -8.43999, 0.61317, 23, 15.72, 21.89, 0.38471, 22, 0.36, -38.87, 0.0021, 1, 21, 12.53, -21.88, 1, 1, 21, 21.32, 22.64, 1, 3, 21, 38.88, 15.18, 0.59023, 23, 16.87999, 45.8, 0.17654, 22, 16.29999, -21.01, 0.23321, 3, 21, 46.57, -25.23, 0.47519, 23, 29.03, 6.48, 0.52382, 22, 1.01, -59.22, 9.8E-4 ], "hull": 17, "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 30, 30, 32, 32, 0, 12, 14, 14, 16 ], "width": 96, @@ -279,10 +287,10 @@ }, "hairR2": { "hairR2": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0.89239, 0, 0.74016, 0.07452, 0.55691, 0.2267, 0.44133, 0.29491, 0.29192, 0.33689, 0.16505, 0.33427, 0.00718, 0.31328, 0, 0.41036, 0.15378, 0.44972, 0.25245, 0.47333, 0.35394, 0.46546, 0.43875, 0.42724, 0.43287, 0.45234, 0.37085, 0.60714, 0.3483, 0.78818, 0.38213, 0.9666, 0.49207, 0.9666, 0.66686, 0.48907, 1, 0.14536, 1, 0, 0.60766, 0.30016, 0.51389, 0.3818 ], "triangles": [ 21, 3, 2, 8, 5, 9, 9, 4, 10, 9, 5, 4, 11, 10, 4, 8, 7, 5, 11, 4, 3, 7, 6, 5, 11, 3, 21, 21, 2, 20, 17, 16, 14, 16, 15, 14, 17, 14, 13, 13, 12, 17, 12, 21, 17, 18, 20, 1, 1, 0, 18, 21, 20, 17, 18, 17, 20, 20, 2, 1, 0, 19, 18, 12, 11, 21 ], - "vertices": [ 1, 43, -2.69, -5.03, 1, 2, 43, 11.45, -12.85, 0.97293, 44, -22.59, -25.83, 0.02706, 2, 43, 33.79, -19.14, 0.26299, 44, -3.55, -12.55, 0.737, 1, 44, 8.47999, -7.18, 1, 1, 44, 24.96, -5.77, 1, 1, 44, 37.43, -7.71, 1, 1, 44, 51.97, -11.39, 1, 1, 44, 53.68, -1.71, 1, 1, 44, 39.72, 3.77, 1, 1, 44, 30.55, 7.25, 1, 1, 44, 19.9, 8.16, 1, 2, 43, 56.79, -17.09, 0.18536, 44, 9.47, 6.51, 0.81463, 1, 43, 59.2, -16.03, 1, 1, 43, 75.47, -12.31, 1, 2, 43, 91.91, -4.04, 0.99835, 44, 21.69, 41.93999, 0.00164, 1, 43, 105.23, 8.51, 1, 1, 43, 99.55, 17.14, 1, 1, 43, 50.22, 4.38, 1, 2, 43, 4.01, 11.48, 0.99999, 44, -46.12, -16.11, 0, 2, 43, -8.25, 3.41, 1, 44, -47.68, -30.72, 0, 1, 43, 37.33, -10.74, 1, 1, 43, 49.07, -13.58, 1 ], + "vertices": [ 1, 25, -2.69, -5.03, 1, 2, 25, 11.45, -12.85, 0.97293, 26, -22.59, -25.83, 0.02706, 2, 25, 33.79, -19.14, 0.26299, 26, -3.55, -12.55, 0.737, 1, 26, 8.47999, -7.18, 1, 1, 26, 24.96, -5.77, 1, 1, 26, 37.43, -7.71, 1, 1, 26, 51.97, -11.39, 1, 1, 26, 53.68, -1.71, 1, 1, 26, 39.72, 3.77, 1, 1, 26, 30.55, 7.25, 1, 1, 26, 19.9, 8.16, 1, 2, 25, 56.79, -17.09, 0.18536, 26, 9.47, 6.51, 0.81463, 1, 25, 59.2, -16.03, 1, 1, 25, 75.47, -12.31, 1, 2, 25, 91.91, -4.04, 0.99835, 26, 21.69, 41.93999, 0.00164, 1, 25, 105.23, 8.51, 1, 1, 25, 99.55, 17.14, 1, 1, 25, 50.22, 4.38, 1, 2, 25, 4.01, 11.48, 0.99999, 26, -46.12, -16.11, 0, 2, 25, -8.25, 3.41, 1, 26, -47.68, -30.72, 0, 1, 25, 37.33, -10.74, 1, 1, 25, 49.07, -13.58, 1 ], "hull": 20, "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 24, 26, 26, 28, 28, 30, 30, 32, 32, 34, 34, 36, 36, 38, 0, 38, 40, 4, 20, 22, 24, 42, 42, 40, 22, 42, 22, 24 ], "width": 94, @@ -477,22 +485,22 @@ }, "pony1": { "pony1": { - "type": "weightedmesh", - "uvs": [ 0, 0.13329, 0.13824, 0.27986, 0.24274, 0.41991, 0.32824, 0.58277, 0.33792, 0.66575, 0.34724, 0.74563, 0.34724, 0.81699, 0.34724, 0.90197, 0.32824, 0.99969, 0.63699, 0.96711, 1, 0.94757, 1, 0.86614, 0.96762, 0.78148, 0.93149, 0.687, 0.8884, 0.60724, 0.83649, 0.51111, 0.74295, 0.41244, 0.65124, 0.31569, 0.50399, 0.19191, 0.29024, 0.0486, 0.17624, 0, 0.00524, 0, 0.67788, 0.7395, 0.59398, 0.54813, 0.47976, 0.69723 ], - "triangles": [ 22, 15, 14, 12, 9, 22, 22, 14, 13, 10, 9, 11, 12, 22, 13, 9, 12, 11, 22, 9, 8, 23, 24, 3, 22, 8, 7, 24, 4, 3, 24, 22, 7, 7, 6, 24, 6, 5, 24, 5, 4, 24, 24, 23, 22, 15, 23, 16, 15, 22, 23, 3, 2, 23, 2, 18, 23, 23, 17, 16, 23, 18, 17, 2, 1, 18, 1, 0, 20, 1, 19, 18, 1, 20, 19, 20, 0, 21 ], - "vertices": [ 1, 34, -2.75, -10.57, 1, 2, 34, 15.34, -13.42, 0.858, 35, -10.94, -15.6, 0.14199, 2, 34, 31.32, -17.62, 0.18389, 35, 5.57, -15.62, 0.8161, 2, 35, 23.6, -17.94, 0.66187, 37, 0.72, -10.56, 0.33812, 3, 34, 55.12, -29.73, 0.00875, 35, 31.67, -21.29, 0.48806, 37, 9.43999, -9.97, 0.50317, 3, 34, 61.82, -34.82, 0.00354, 35, 39.43999, -24.52, 0.32978, 37, 17.84, -9.39999, 0.66666, 3, 34, 67.4, -39.82, 0.00192, 35, 46.11, -27.94, 0.30605, 37, 25.33, -9.49, 0.69202, 1, 37, 34.25999, -9.6, 1, 1, 37, 44.51, -11.09, 1, 2, 37, 41.34999, 11.18, 0.45454, 36, 36.79, -21.5, 0.54544, 1, 36, 45.63, 3.18, 1, 1, 36, 37.83, 6.68, 1, 3, 34, 94.41, -4.04, 0.00256, 35, 63.16, 13.51, 0.27216, 36, 28.77, 8.2, 0.72526, 3, 34, 85.29, 0.62, 0.00542, 35, 53.15, 15.72, 0.3279, 36, 18.65, 9.89999, 0.66666, 3, 34, 76.98, 3.9, 0.01281, 35, 44.28, 16.78, 0.47168, 36, 9.74, 10.5, 0.51549, 2, 35, 33.59, 18.04999, 0.65926, 36, -0.99, 11.23, 0.34073, 2, 35, 21.3, 16.79, 0.8289, 36, -13.2, 9.33, 0.17109, 2, 34, 42.78, 11.59, 0.18399, 35, 9.24, 15.54, 0.816, 1, 34, 26.02, 12.35, 1, 2, 34, 4.55, 10.92, 0.99582, 35, -27.56, 5.19999, 0.00417, 2, 34, -4.71999, 8.21, 0.98425, 35, -35.84999, 0.22, 0.01574, 2, 34, -12.93, -0.96, 0.99487, 35, -41.46, -10.72, 0.00512, 2, 37, 17.48, 14.41, 0.52799, 36, 16.19, -9.01, 0.472, 3, 35, 29.09, 0.74, 0.73333, 37, -2.68, 8.60999, 0.14666, 36, -4.6, -6.28, 0.12, 1, 37, 12.87, 0.19, 1 ], - "hull": 22, - "edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 16, 18, 18, 20, 20, 22, 34, 36, 36, 38, 38, 40, 40, 42, 0, 42, 44, 46, 16, 44, 26, 28, 28, 30, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 30, 32, 32, 34 ], + "type": "mesh", + "uvs": [ 0, 0.13329, 0.13824, 0.27986, 0.24274, 0.41991, 0.32824, 0.58277, 0.33792, 0.66575, 0.34724, 0.74563, 0.34724, 0.81699, 0.34724, 0.90197, 0.32824, 0.99969, 0.45, 0.98684, 0.48609, 0.98303, 0.63699, 0.96711, 0.83259, 0.95658, 1, 0.94757, 1, 0.86614, 0.96762, 0.78148, 0.93149, 0.687, 0.8884, 0.60724, 0.83649, 0.51111, 0.74295, 0.41244, 0.65124, 0.31569, 0.50399, 0.19191, 0.29024, 0.0486, 0.17624, 0, 0.00524, 0, 0.67788, 0.7395, 0.59398, 0.54813, 0.47976, 0.69723, 0.8721, 0.85824, 0.5766, 0.86607, 0.50503, 0.80776, 0.47478, 0.81588 ], + "triangles": [ 10, 29, 11, 29, 30, 25, 25, 17, 16, 28, 25, 16, 28, 16, 15, 28, 15, 14, 28, 14, 13, 12, 25, 28, 12, 28, 13, 30, 29, 10, 11, 29, 25, 12, 11, 25, 27, 4, 3, 5, 4, 27, 30, 27, 25, 31, 5, 27, 30, 31, 27, 6, 5, 31, 7, 6, 31, 30, 10, 31, 9, 7, 31, 10, 9, 31, 8, 7, 9, 27, 26, 25, 26, 21, 20, 26, 20, 19, 2, 21, 26, 3, 2, 26, 26, 27, 3, 18, 25, 26, 18, 26, 19, 25, 18, 17, 23, 0, 24, 1, 23, 22, 1, 22, 21, 1, 0, 23, 2, 1, 21 ], + "vertices": [ 1, 42, -2.75, -10.57, 1, 1, 42, 15.34, -13.42, 1, 2, 42, 31.32, -17.62, 0.18389, 43, 5.57, -15.62, 0.8161, 2, 43, 23.6, -17.94, 0.66187, 44, 0.72, -10.56, 0.33812, 2, 43, 31.67, -21.29, 0.49237, 44, 9.43999, -9.97, 0.50761, 2, 43, 39.43999, -24.52, 0.33096, 44, 17.84, -9.39999, 0.66903, 2, 43, 46.11, -27.94, 0.30664, 44, 25.33, -9.49, 0.69335, 1, 44, 34.25999, -9.6, 1, 1, 44, 44.51, -11.09, 1, 1, 44, 43.26, -2.31, 1, 3, 43, 66.18, -27, 0.00552, 44, 42.89, 0.29, 0.30346, 45, 33.87, -32.09, 0.691, 2, 44, 41.34999, 11.18, 0.22585, 45, 36.79, -21.5, 0.77414, 2, 44, 40.41, 25.27, 0.09713, 45, 41.55, -8.2, 0.90286, 1, 45, 45.63, 3.18, 1, 1, 45, 37.83, 6.68, 1, 2, 43, 63.16, 13.51, 0.27286, 45, 28.77, 8.2, 0.72713, 2, 43, 53.15, 15.72, 0.32969, 45, 18.65, 9.89999, 0.6703, 2, 43, 44.28, 16.78, 0.4778, 45, 9.74, 10.5, 0.52218, 2, 43, 33.59, 18.04999, 0.65926, 45, -0.99, 11.23, 0.34073, 2, 43, 21.3, 16.79, 0.8289, 45, -13.2, 9.33, 0.17109, 2, 42, 42.78, 11.59, 0.18399, 43, 9.24, 15.54, 0.816, 1, 42, 26.02, 12.35, 1, 1, 42, 4.55, 10.92, 1, 1, 42, -4.71999, 8.21, 1, 1, 42, -12.93, -0.96, 1, 3, 43, 49.72, -3.04, 0.21699, 44, 17.48, 14.41, 0.57976, 45, 16.19, -9.01, 0.20323, 1, 43, 29.09, 0.74, 1, 3, 43, 39.27, -13.71, 0.04697, 44, 12.87, 0.19, 0.83093, 45, 6.3, -20.2, 0.12208, 2, 44, 30.11, 28.24, 0.06201, 45, 33.3, -1.36, 0.93798, 2, 44, 30.68, 6.95, 0.24265, 45, 25.33, -21.11, 0.75734, 3, 43, 50.43, -17.39, 0.00887, 44, 24.5, 1.87, 0.39099, 45, 17.64, -23.3, 0.60012, 3, 43, 50.19, -19.71999, 0.0276, 44, 25.33, -0.31, 0.91782, 45, 17.52, -25.64, 0.05457 ], + "hull": 25, + "edges": [ 0, 2, 2, 4, 4, 6, 14, 16, 26, 28, 40, 42, 42, 44, 44, 46, 46, 48, 0, 48, 50, 52, 32, 34, 34, 36, 6, 8, 8, 10, 10, 12, 12, 14, 28, 30, 30, 32, 36, 38, 38, 40, 22, 24, 24, 26, 20, 22, 26, 56, 20, 60, 60, 54, 54, 62, 16, 18, 18, 20, 62, 18 ], "width": 72, "height": 105 } }, "pony2": { "pony2": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0, 0.01225, 0, 0.16059, 0.07048, 0.25835, 0.10916, 0.31199, 0.14855, 0.36662, 0.20193, 0.43853, 0.24878, 0.50163, 0.28646, 0.55239, 0.31721, 0.5938, 0.34738, 0.63445, 0.38869, 0.68437, 0.42486, 0.7281, 0.47502, 0.78874, 0.51441, 0.83635, 0.68143, 1, 0.81664, 0.95172, 1, 0.88168, 1, 0.79515, 0.83255, 0.65917, 0.76214, 0.61585, 0.70529, 0.58088, 0.63899, 0.54009, 0.57803, 0.50259, 0.54048, 0.4656, 0.49529, 0.42107, 0.44368, 0.37023, 0.39267, 0.31997, 0.33545, 0.2636, 0.30394, 0.21751, 0.27183, 0.17054, 0.20024, 0.06582, 0.14457, 0.00401, 0.55254, 0.65391, 0.67684, 0.74492 ], "triangles": [ 32, 22, 21, 15, 33, 18, 16, 15, 17, 18, 33, 19, 15, 18, 17, 33, 32, 20, 33, 20, 19, 20, 32, 21, 11, 10, 32, 13, 33, 14, 14, 33, 15, 33, 13, 32, 13, 12, 32, 12, 11, 32, 4, 28, 27, 4, 3, 28, 3, 29, 28, 3, 2, 29, 2, 30, 29, 2, 1, 30, 1, 31, 30, 1, 0, 31, 10, 9, 32, 32, 9, 22, 9, 23, 22, 23, 8, 24, 23, 9, 8, 8, 7, 24, 7, 25, 24, 7, 6, 25, 6, 26, 25, 6, 5, 26, 5, 27, 26, 5, 4, 27 ], - "vertices": [ 1, 30, -8.14, 1.04999, 1, 1, 30, 0.99, -7.18, 1, 1, 30, 11.07, -8.10999, 1, 2, 31, -9.35, -8, 0.20667, 30, 16.61, -8.63, 0.79332, 2, 31, -3.74, -8.72999, 0.41715, 30, 22.24, -9.14999, 0.58284, 2, 31, 3.73, -9.59, 0.72759, 30, 29.75, -9.72999, 0.2724, 1, 31, 10.3, -10.34, 1, 3, 31, 15.58, -10.95, 0.94603, 33, -13.96, -12.12, 0.0429, 32, -14.81, -8.14, 0.01105, 3, 31, 19.89, -11.44, 0.85612, 33, -9.63, -11.92, 0.10558, 32, -10.78, -9.76, 0.03829, 3, 31, 24.12, -11.93, 0.71142, 33, -5.38, -11.72, 0.19561, 32, -6.84, -11.35, 0.09295, 3, 31, 29.56, -12.26, 0.5223, 33, 0.04, -11.18, 0.4394, 32, -1.67, -13.12, 0.03829, 3, 31, 34.33, -12.55, 0.31189, 33, 4.8, -10.71, 0.67703, 32, 2.84, -14.67, 0.01105, 3, 31, 40.95, -12.96, 0.13585, 33, 11.4, -10.05, 0.86243, 32, 9.10999, -16.81, 0.0017, 1, 33, 16.58, -9.54, 1, 1, 33, 35.93999, -5.53, 1, 2, 33, 39.31, 6.28, 0.50399, 32, 41.29, -13.55, 0.496, 1, 32, 51.93, -0.54, 1, 1, 32, 48.28, 5.64, 1, 1, 32, 30.14, 8.05, 1, 3, 31, 47.84, 14.74, 0.10666, 33, 13.77, 18.4, 6.6E-4, 32, 23.1, 8.08, 0.89267, 3, 31, 42.35, 13.25, 0.27184, 33, 8.59, 16.04999, 0.00626, 32, 17.42, 8.1, 0.72188, 3, 31, 35.95, 11.52, 0.49123, 33, 2.55, 13.32, 0.02539, 32, 10.78, 8.12, 0.48336, 3, 31, 30.07, 9.92, 0.69316, 33, -2.99, 10.8, 0.06975, 32, 4.69, 8.14, 0.23708, 3, 31, 25.62, 9.74, 0.82519, 33, -7.36, 9.91, 0.02539, 32, 0.35, 9.14, 0.1494, 4, 31, 20.26, 9.52, 0.89665, 30, 45.57, 9.96, 0.01837, 33, -12.62, 8.84, 0.00626, 32, -4.87, 10.35, 0.07869, 4, 31, 14.14, 9.28, 0.89545, 30, 39.47, 9.49, 0.0735, 33, -18.62, 7.62, 6.6E-4, 32, -10.83, 11.74, 0.03036, 2, 31, 8.09, 9.03, 0.8346, 30, 33.43, 9.03, 0.16539, 2, 31, 1.30999, 8.76, 0.64909, 30, 26.66, 8.51, 0.3509, 2, 31, -3.32, 9.47, 0.3443, 30, 22, 9.06, 0.65569, 2, 31, -8.04, 10.2, 0.0337, 30, 17.26, 9.60999, 0.96629, 1, 30, 6.68, 10.86, 1, 1, 30, -0.33, 10.74, 1, 2, 33, 6.04, 1.81, 0.51199, 32, 9.17, -3.79, 0.488, 3, 31, 50.42, 2.02, 0.00322, 33, 18.35, 6.25, 0.48683, 32, 22.22, -4.87, 0.50994 ], + "vertices": [ 1, 46, -8.14, 1.04999, 1, 1, 46, 0.99, -7.18, 1, 1, 46, 11.07, -8.10999, 1, 2, 47, -9.35, -8, 0.20667, 46, 16.61, -8.63, 0.79332, 2, 47, -3.74, -8.72999, 0.41715, 46, 22.24, -9.14999, 0.58284, 2, 47, 3.73, -9.59, 0.72759, 46, 29.75, -9.72999, 0.2724, 1, 47, 10.3, -10.34, 1, 3, 47, 15.58, -10.95, 0.94603, 48, -13.96, -12.12, 0.0429, 49, -14.81, -8.14, 0.01105, 3, 47, 19.89, -11.44, 0.85612, 48, -9.63, -11.92, 0.10558, 49, -10.78, -9.76, 0.03829, 3, 47, 24.12, -11.93, 0.71142, 48, -5.38, -11.72, 0.19561, 49, -6.84, -11.35, 0.09295, 3, 47, 29.56, -12.26, 0.5223, 48, 0.04, -11.18, 0.4394, 49, -1.67, -13.12, 0.03829, 3, 47, 34.33, -12.55, 0.31189, 48, 4.8, -10.71, 0.67703, 49, 2.84, -14.67, 0.01105, 3, 47, 40.95, -12.96, 0.13585, 48, 11.4, -10.05, 0.86243, 49, 9.10999, -16.81, 0.0017, 1, 48, 16.58, -9.54, 1, 1, 48, 35.93999, -5.53, 1, 2, 48, 39.31, 6.28, 0.50399, 49, 41.29, -13.55, 0.496, 1, 49, 51.93, -0.54, 1, 1, 49, 48.28, 5.64, 1, 1, 49, 30.14, 8.05, 1, 3, 47, 47.84, 14.74, 0.10666, 48, 13.77, 18.4, 6.6E-4, 49, 23.1, 8.08, 0.89267, 3, 47, 42.35, 13.25, 0.27184, 48, 8.59, 16.04999, 0.00626, 49, 17.42, 8.1, 0.72188, 3, 47, 35.95, 11.52, 0.49123, 48, 2.55, 13.32, 0.02539, 49, 10.78, 8.12, 0.48336, 3, 47, 30.07, 9.92, 0.69316, 48, -2.99, 10.8, 0.06975, 49, 4.69, 8.14, 0.23708, 3, 47, 25.62, 9.74, 0.82519, 48, -7.36, 9.91, 0.02539, 49, 0.35, 9.14, 0.1494, 4, 47, 20.26, 9.52, 0.89665, 46, 45.57, 9.96, 0.01837, 48, -12.62, 8.84, 0.00626, 49, -4.87, 10.35, 0.07869, 4, 47, 14.14, 9.28, 0.89545, 46, 39.47, 9.49, 0.0735, 48, -18.62, 7.62, 6.6E-4, 49, -10.83, 11.74, 0.03036, 2, 47, 8.09, 9.03, 0.8346, 46, 33.43, 9.03, 0.16539, 2, 47, 1.30999, 8.76, 0.64909, 46, 26.66, 8.51, 0.3509, 2, 47, -3.32, 9.47, 0.3443, 46, 22, 9.06, 0.65569, 2, 47, -8.04, 10.2, 0.0337, 46, 17.26, 9.60999, 0.96629, 1, 46, 6.68, 10.86, 1, 1, 46, -0.33, 10.74, 1, 2, 48, 6.04, 1.81, 0.51199, 49, 9.17, -3.79, 0.488, 3, 47, 50.42, 2.02, 0.00322, 48, 18.35, 6.25, 0.48683, 49, 22.22, -4.87, 0.50994 ], "hull": 32, "edges": [ 0, 2, 26, 28, 28, 30, 30, 32, 32, 34, 34, 36, 60, 62, 0, 62, 2, 4, 58, 60, 18, 20, 20, 22, 22, 24, 24, 26, 40, 42, 42, 44, 36, 38, 38, 40, 66, 64, 54, 56, 56, 58, 50, 52, 52, 54, 8, 10, 10, 12, 4, 6, 6, 8, 12, 14, 48, 50, 14, 16, 16, 18, 44, 46, 46, 48, 44, 18 ], "width": 86, @@ -538,10 +546,10 @@ }, "strap": { "strap": { - "type": "weightedmesh", + "type": "mesh", "uvs": [ 0.34969, 0, 0.20076, 0.08266, 0.03528, 0.21905, 0.02424, 0.46741, 0.10147, 0.76869, 0, 0.82773, 0, 0.93562, 0.23386, 1, 0.83511, 1, 1, 0.87862, 1, 0.82773, 0.64757, 0.72187, 0.4545, 0.43891, 0.47657, 0.24348, 0.64205, 0.08673, 0.66963, 0.01752 ], "triangles": [ 12, 2, 13, 13, 2, 1, 1, 0, 13, 13, 0, 14, 14, 0, 15, 3, 2, 12, 4, 3, 12, 7, 4, 11, 4, 12, 11, 7, 11, 8, 9, 8, 10, 6, 4, 7, 6, 5, 4, 8, 11, 10 ], - "vertices": [ 1, 7, -7.67, -10.93, 1, 1, 7, 8.72, -14, 1, 2, 2, 58.57, 20.03, 0.02146, 7, 33.82, -14.48, 0.97853, 3, 5, 69.28, 10.57, 0.00935, 2, 16.86, 21.19, 0.97687, 7, 72.49, 1.2, 0.01376, 1, 5, 18.94, 17.69, 1, 1, 5, 10.76, 26.12, 1, 1, 5, -6.86, 30.34, 1, 1, 5, -20.75, 18.75, 1, 1, 5, -29.42, -17.5, 1, 1, 5, -11.97, -32.18, 1, 1, 5, -3.65, -34.16999, 1, 2, 5, 18.71999, -17.06, 0.98247, 2, -26.33, -16.92, 0.01751, 1, 2, 21.34, -5.53, 1, 2, 2, 54.15, -7.27, 0.10496, 7, 26.89, 12.3, 0.89503, 1, 7, -1.35, 11.44, 1, 1, 7, -12.72, 8.46, 1 ], + "vertices": [ 1, 56, -7.67, -10.93, 1, 1, 56, 8.72, -14, 1, 2, 2, 58.57, 20.03, 0.02146, 56, 33.82, -14.48, 0.97853, 3, 55, 69.28, 10.57, 0.00935, 2, 16.86, 21.19, 0.97687, 56, 72.49, 1.2, 0.01376, 1, 55, 18.94, 17.69, 1, 1, 55, 10.76, 26.12, 1, 1, 55, -6.86, 30.34, 1, 1, 55, -20.75, 18.75, 1, 1, 55, -29.42, -17.5, 1, 1, 55, -11.97, -32.18, 1, 1, 55, -3.65, -34.16999, 1, 2, 55, 18.71999, -17.06, 0.98247, 2, -26.33, -16.92, 0.01751, 1, 2, 21.34, -5.53, 1, 2, 2, 54.15, -7.27, 0.10496, 56, 26.89, 12.3, 0.89503, 1, 56, -1.35, 11.44, 1, 1, 56, -12.72, 8.46, 1 ], "hull": 16, "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, 30, 0, 30 ], "width": 62, @@ -631,6 +639,21 @@ "curve": [ 0.353, 0, 0.635, 1 ] }, { "time": 2, "x": 1, "y": 1 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.583, 1 ] + }, + { + "time": 1.0333, + "x": -1.76, + "y": 0, + "curve": [ 0.25, 0, 0.583, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "femurR": { @@ -692,6 +715,21 @@ "curve": [ 0.357, 0, 0.672, 0.55 ] }, { "time": 2, "angle": 2.93 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.429, 0, 0.452, 1 ] + }, + { + "time": 1.1666, + "x": 6.16, + "y": 6.93, + "curve": [ 0.429, 0, 0.452, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "femurL": { @@ -707,6 +745,21 @@ "curve": [ 0.353, 0, 0.635, 1 ] }, { "time": 2, "angle": 0 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.9333, + "x": 0, + "y": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "tibiaL": { @@ -727,6 +780,27 @@ "curve": [ 0.25, 0, 0.625, 0.5 ] }, { "time": 2, "angle": 3.48 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.442, 1 ] + }, + { + "time": 0.6, + "x": 0, + "y": -3.74, + "curve": [ 0.25, 0, 0.442, 1 ] + }, + { + "time": 1.4, + "x": 0, + "y": 3.77, + "curve": [ 0.25, 0, 0.442, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "lumbar": { @@ -818,6 +892,21 @@ "curve": [ 0.542, 0, 0.482, 1 ] }, { "time": 2, "x": 0, "y": 0 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.59, 1 ] + }, + { + "time": 0.9666, + "x": 0, + "y": 2.87, + "curve": [ 0.25, 0, 0.59, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "radiusR": { @@ -904,6 +993,21 @@ "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 2, "x": 0, "y": 0 } + ], + "shear": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.487, 1 ] + }, + { + "time": 0.9666, + "x": 0, + "y": 3.38, + "curve": [ 0.25, 0, 0.487, 1 ] + }, + { "time": 2, "x": 0, "y": 0 } ] }, "head": { @@ -1169,6 +1273,11 @@ "curve": [ 0.25, 0, 0.794, 0.75 ] }, { "time": 2, "angle": 0 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.2, "x": 5.99, "y": 0 }, + { "time": 2, "x": 0, "y": 0 } ] }, "hairL1": { @@ -1281,6 +1390,11 @@ "curve": [ 0.353, 0, 0.655, 1 ] }, { "time": 2, "angle": 0 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.0666, "x": 9.12, "y": 0 }, + { "time": 2, "x": 0, "y": 0 } ] }, "eyelids": { @@ -1408,6 +1522,11 @@ { "time": 1, "x": 1.004, "y": 0.95 }, { "time": 1.5, "x": 1.059, "y": 0.925 }, { "time": 2, "x": 1, "y": 1 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.2, "x": 5, "y": -5.19 }, + { "time": 2, "x": 0, "y": 0 } ] }, "thumbL": { @@ -1480,6 +1599,11 @@ "curve": [ 0.243, 0, 0.648, 0.6 ] }, { "time": 2, "x": -0.9, "y": -0.8 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.4, "x": -2.26, "y": -8.67 }, + { "time": 2, "x": 0, "y": 0 } ] }, "middleL": { @@ -1612,6 +1736,11 @@ "curve": [ 0.243, 0, 0.648, 0.6 ] }, { "time": 2, "x": 0.969, "y": 0.993 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 0.8666, "x": -8.46, "y": 0 }, + { "time": 2, "x": 0, "y": 0 } ] }, "handL": { @@ -1961,6 +2090,11 @@ "curve": [ 0.424, 0, 0.747, 0.38 ] }, { "time": 2, "angle": -7.59 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.2, "x": 0, "y": -10.63 }, + { "time": 2, "x": 0, "y": 0 } ] }, "pony1 3L": { @@ -1981,6 +2115,11 @@ "curve": [ 0.521, 0, 0.772, 0.48 ] }, { "time": 2, "angle": -0.17 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1.3, "x": 0, "y": 12.73 }, + { "time": 2, "x": 0, "y": 0 } ] }, "pony2 1": { @@ -2111,10 +2250,15 @@ "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 2, "angle": 0 } + ], + "shear": [ + { "time": 0, "x": 0, "y": 0 }, + { "time": 1, "x": 8.26, "y": 0 }, + { "time": 2, "x": 0, "y": 0 } ] } }, - "ffd": { + "deform": { "default": { "armL": { "armL": [ diff --git a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.png.meta b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.png.meta index de9e94891..442d8e367 100644 --- a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.png.meta +++ b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi.png.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 33e128e17951b4a42b17608ff79ba5c5 -timeCreated: 1455501336 +timeCreated: 1467205225 licenseType: Free TextureImporter: fileIDToRecycleName: {} diff --git a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Atlas.asset b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Atlas.asset index 56f28290c..8546d47cc 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Atlas.asset and b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Atlas.asset differ diff --git a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Material.mat b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Material.mat index 346c1951b..a5e03cbe5 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Material.mat and b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_Material.mat differ diff --git a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_SkeletonData.asset b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_SkeletonData.asset index a9640336f..085fa6f3a 100644 Binary files a/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_SkeletonData.asset and b/spine-unity/Assets/Examples/Spine/Spineunitygirl/Doi_SkeletonData.asset differ diff --git a/spine-unity/Assets/Examples/Spine/dragon.prefab b/spine-unity/Assets/Examples/Spine/dragon.prefab index 788e55953..7c25866ff 100644 Binary files a/spine-unity/Assets/Examples/Spine/dragon.prefab and b/spine-unity/Assets/Examples/Spine/dragon.prefab differ diff --git a/spine-unity/Assets/Examples/Spine/eyes.prefab b/spine-unity/Assets/Examples/Spine/eyes.prefab index 94652a9d4..42ef7d0d9 100644 Binary files a/spine-unity/Assets/Examples/Spine/eyes.prefab and b/spine-unity/Assets/Examples/Spine/eyes.prefab differ diff --git a/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab b/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab deleted file mode 100644 index 64ed2d39d..000000000 Binary files a/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab and /dev/null differ diff --git a/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab.meta b/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab.meta deleted file mode 100644 index 128faa129..000000000 --- a/spine-unity/Assets/Examples/Spine/goblins-mesh.prefab.meta +++ /dev/null @@ -1,4 +0,0 @@ -fileFormatVersion: 2 -guid: 700a0a62306a8954b8933538790e20a5 -NativeFormatImporter: - userData: diff --git a/spine-unity/Assets/Examples/Spine/raptor.prefab b/spine-unity/Assets/Examples/Spine/raptor.prefab index 8eda80ce4..bbab077da 100644 Binary files a/spine-unity/Assets/Examples/Spine/raptor.prefab and b/spine-unity/Assets/Examples/Spine/raptor.prefab differ diff --git a/spine-unity/Assets/Examples/Spine/spineboy.prefab b/spine-unity/Assets/Examples/Spine/spineboy.prefab index 02b6c3a39..da53e35e7 100644 Binary files a/spine-unity/Assets/Examples/Spine/spineboy.prefab and b/spine-unity/Assets/Examples/Spine/spineboy.prefab differ diff --git a/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs b/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs index b991889d6..ffeb3b113 100644 --- a/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs +++ b/spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs @@ -411,10 +411,11 @@ namespace Spine.Unity.Editor { icon = SpineEditorUtilities.Icons.mesh; else if (type == typeof(BoundingBoxAttachment)) icon = SpineEditorUtilities.Icons.boundingBox; - else if (type == typeof(WeightedMeshAttachment)) - icon = SpineEditorUtilities.Icons.weights; + else if (type == typeof(PathAttachment)) + icon = SpineEditorUtilities.Icons.boundingBox; else icon = SpineEditorUtilities.Icons.warning; + //JOHN: left todo: Icon for paths. Generic icon for unidentified attachments. // MITCH: left todo: Waterboard Nate //if (name != attachment.Name) @@ -560,20 +561,19 @@ namespace Spine.Unity.Editor { if (this.m_previewInstance == null) { string skinName = EditorPrefs.GetString(m_skeletonDataAssetGUID + "_lastSkin", ""); - m_previewInstance = SpineEditorUtilities.InstantiateSkeletonAnimation(skeletonDataAsset, skinName).gameObject; - m_previewInstance.hideFlags = HideFlags.HideAndDontSave; - m_previewInstance.layer = 0x1f; - m_skeletonAnimation = m_previewInstance.GetComponent(); - m_skeletonAnimation.initialSkinName = skinName; - m_skeletonAnimation.LateUpdate(); + if (m_previewInstance != null) { + m_previewInstance.hideFlags = HideFlags.HideAndDontSave; + m_previewInstance.layer = 0x1f; + m_skeletonAnimation = m_previewInstance.GetComponent(); + m_skeletonAnimation.initialSkinName = skinName; + m_skeletonAnimation.LateUpdate(); + m_skeletonData = m_skeletonAnimation.skeletonDataAsset.GetSkeletonData(true); + m_previewInstance.GetComponent().enabled = false; + m_initialized = true; + } - m_skeletonData = m_skeletonAnimation.skeletonDataAsset.GetSkeletonData(true); - - m_previewInstance.GetComponent().enabled = false; - - m_initialized = true; AdjustCameraGoals(true); } } @@ -694,7 +694,7 @@ namespace Spine.Unity.Editor { foreach (var slot in m_skeletonAnimation.skeleton.Slots) { var boundingBoxAttachment = slot.Attachment as BoundingBoxAttachment; if (boundingBoxAttachment != null) - DrawBoundingBox (slot.Bone, boundingBoxAttachment); + DrawBoundingBox (slot, boundingBoxAttachment); } } @@ -703,11 +703,11 @@ namespace Spine.Unity.Editor { } - static void DrawBoundingBox (Bone bone, BoundingBoxAttachment box) { + static void DrawBoundingBox (Slot slot, BoundingBoxAttachment box) { if (box.Vertices.Length <= 0) return; // Handle cases where user creates a BoundingBoxAttachment but doesn't actually define it. var worldVerts = new float[box.Vertices.Length]; - box.ComputeWorldVertices(bone, worldVerts); + box.ComputeWorldVertices(slot, worldVerts); Handles.color = Color.green; Vector3 lastVert = Vector3.back; diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonBaker.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonBaker.cs index 8759ac0f4..035ffd4cd 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonBaker.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonBaker.cs @@ -1,5 +1,3 @@ - - /***************************************************************************** * SkeletonBaker added by Mitch Thompson * Full irrevocable rights and permissions granted to Esoteric Software @@ -373,6 +371,7 @@ namespace Spine.Unity.Editor { float rotation = 0; Mesh mesh = null; Material material = null; + bool isWeightedMesh = false; if (meshTable.ContainsKey(attachmentMeshName)) mesh = meshTable[attachmentMeshName]; @@ -382,32 +381,28 @@ namespace Spine.Unity.Editor { offset.y = regionAttachment.Y; rotation = regionAttachment.Rotation; mesh = ExtractRegionAttachment(attachmentMeshName, regionAttachment, mesh); - material = ExtractMaterial((RegionAttachment)attachment); + material = ExtractMaterial(attachment); unusedMeshNames.Remove(attachmentMeshName); if (newPrefab || meshTable.ContainsKey(attachmentMeshName) == false) AssetDatabase.AddObjectToAsset(mesh, prefab); } else if (attachment is MeshAttachment) { var meshAttachment = (MeshAttachment)attachment; + isWeightedMesh = (meshAttachment.Bones != null); offset.x = 0; offset.y = 0; rotation = 0; - mesh = ExtractMeshAttachment(attachmentMeshName, meshAttachment, mesh); - material = ExtractMaterial((MeshAttachment)attachment); - unusedMeshNames.Remove(attachmentMeshName); - if (newPrefab || meshTable.ContainsKey(attachmentMeshName) == false) - AssetDatabase.AddObjectToAsset(mesh, prefab); - } else if (attachment is WeightedMeshAttachment) { - var meshAttachment = (WeightedMeshAttachment)attachment; - offset.x = 0; - offset.y = 0; - rotation = 0; - mesh = ExtractSkinnedMeshAttachment(attachmentMeshName, meshAttachment, i, skeletonData, boneList, mesh); - material = ExtractMaterial((WeightedMeshAttachment)attachment); + + if (isWeightedMesh) + mesh = ExtractWeightedMeshAttachment(attachmentMeshName, meshAttachment, i, skeletonData, boneList, mesh); + else + mesh = ExtractMeshAttachment(attachmentMeshName, meshAttachment, mesh); + + material = ExtractMaterial(attachment); unusedMeshNames.Remove(attachmentMeshName); if (newPrefab || meshTable.ContainsKey(attachmentMeshName) == false) AssetDatabase.AddObjectToAsset(mesh, prefab); } else - continue; //disregard unsupported types for now + continue; Transform attachmentTransform = new GameObject(attachmentName).transform; @@ -415,14 +410,13 @@ namespace Spine.Unity.Editor { attachmentTransform.localPosition = offset; attachmentTransform.localRotation = Quaternion.Euler(0, 0, rotation); - if (attachment is WeightedMeshAttachment) { + if (isWeightedMesh) { attachmentTransform.position = Vector3.zero; attachmentTransform.rotation = Quaternion.identity; var skinnedMeshRenderer = attachmentTransform.gameObject.AddComponent(); skinnedMeshRenderer.rootBone = boneList[0]; skinnedMeshRenderer.bones = boneList.ToArray(); skinnedMeshRenderer.sharedMesh = mesh; - } else { attachmentTransform.gameObject.AddComponent().sharedMesh = mesh; attachmentTransform.gameObject.AddComponent(); @@ -482,7 +476,7 @@ namespace Spine.Unity.Editor { return extractionBone; SkeletonData skelData = new SkeletonData(); - BoneData data = new BoneData("temp", null); + BoneData data = new BoneData(0, "temp", null); data.ScaleX = 1; data.ScaleY = 1; data.Length = 100; @@ -505,7 +499,7 @@ namespace Spine.Unity.Editor { Bone bone = GetExtractionBone(); - SlotData data = new SlotData("temp", bone.Data); + SlotData data = new SlotData(0, "temp", bone.Data); Slot slot = new Slot(data, bone); extractionSlot = slot; return extractionSlot; @@ -521,9 +515,6 @@ namespace Spine.Unity.Editor { } else if (attachment is MeshAttachment) { var att = (MeshAttachment)attachment; return (Material)((AtlasRegion)att.RendererObject).page.rendererObject; - } else if (attachment is WeightedMeshAttachment) { - var att = (WeightedMeshAttachment)attachment; - return (Material)((AtlasRegion)att.RendererObject).page.rendererObject; } else { return null; } @@ -573,7 +564,7 @@ namespace Spine.Unity.Editor { slot.Bone.UpdateWorldTransform(); Vector2[] uvs = ExtractUV(attachment.UVs); - float[] floatVerts = new float[attachment.Vertices.Length]; + float[] floatVerts = new float[attachment.WorldVerticesLength]; attachment.ComputeWorldVertices(slot, floatVerts); Vector3[] verts = ExtractVerts(floatVerts); @@ -630,12 +621,14 @@ namespace Spine.Unity.Editor { } } - static Mesh ExtractSkinnedMeshAttachment (string name, WeightedMeshAttachment attachment, int slotIndex, SkeletonData skeletonData, List boneList, Mesh mesh = null) { + static Mesh ExtractWeightedMeshAttachment (string name, MeshAttachment attachment, int slotIndex, SkeletonData skeletonData, List boneList, Mesh mesh = null) { + if (attachment.Bones == null) + throw new System.ArgumentException("Mesh is not weighted.", "attachment"); Skeleton skeleton = new Skeleton(skeletonData); skeleton.UpdateWorldTransform(); - float[] floatVerts = new float[attachment.UVs.Length]; + float[] floatVerts = new float[attachment.WorldVerticesLength]; attachment.ComputeWorldVertices(skeleton.Slots.Items[slotIndex], floatVerts); Vector2[] uvs = ExtractUV(attachment.UVs); @@ -644,8 +637,7 @@ namespace Spine.Unity.Editor { int[] triangles = attachment.Triangles; Color color = new Color(attachment.R, attachment.G, attachment.B, attachment.A); - if (mesh == null) - mesh = new Mesh(); + mesh = mesh ?? new Mesh(); mesh.triangles = new int[0]; @@ -661,21 +653,18 @@ namespace Spine.Unity.Editor { mesh.RecalculateNormals(); mesh.RecalculateBounds(); - //Handle weights and binding - Dictionary weightTable = new Dictionary(); - System.Text.StringBuilder warningBuilder = new System.Text.StringBuilder(); + // Handle weights and binding + var weightTable = new Dictionary(); + var warningBuilder = new System.Text.StringBuilder(); int[] bones = attachment.Bones; - float[] weights = attachment.Weights; + float[] weights = attachment.Vertices; for (int w = 0, v = 0, b = 0, n = bones.Length; v < n; w += 2) { int nn = bones[v++] + v; for (; v < nn; v++, b += 3) { Transform boneTransform = boneList[bones[v]]; int vIndex = w / 2; - - float weight = weights[b + 2]; - BoneWeightContainer container; if (weightTable.ContainsKey(vIndex)) container = weightTable[vIndex]; @@ -684,7 +673,7 @@ namespace Spine.Unity.Editor { weightTable.Add(vIndex, container); } - + float weight = weights[b + 2]; container.Add(boneTransform, weight); } } @@ -700,7 +689,7 @@ namespace Spine.Unity.Editor { for (int b = 0; b < pairs.Count; b++) { if (b > 3) { if (warningBuilder.Length == 0) - warningBuilder.Insert(0, "[SkinnedMeshAttachment " + name + "]\r\nUnity only supports 4 weight influences per vertex! The 4 strongest influences will be used.\r\n"); + warningBuilder.Insert(0, "[Weighted Mesh: " + name + "]\r\nUnity only supports 4 weight influences per vertex! The 4 strongest influences will be used.\r\n"); warningBuilder.AppendFormat("{0} ignored on vertex {1}!\r\n", pairs[b].bone.name, i); continue; @@ -844,6 +833,7 @@ namespace Spine.Unity.Editor { return clip; } + static int BinarySearch (float[] values, float target) { int low = 0; int high = values.Length - 2; @@ -869,7 +859,7 @@ namespace Spine.Unity.Editor { var ev = events[i]; AnimationEvent ae = new AnimationEvent(); - //TODO: Deal with Mecanim's zero-time missed event + //MITCH: left todo: Deal with Mecanim's zero-time missed event ae.time = frames[i]; ae.functionName = ev.Data.Name; ae.messageOptions = eventOptions; @@ -968,6 +958,7 @@ namespace Spine.Unity.Editor { return angle; } + static void BakeBone (Bone bone, Spine.Animation animation, AnimationClip clip) { Skeleton skeleton = bone.Skeleton; bool inheritRotation = bone.Data.InheritRotation; @@ -1178,7 +1169,7 @@ namespace Spine.Unity.Editor { string path = GetPath(boneData); - string propertyName = "localPosition"; + const string propertyName = "localPosition"; clip.SetCurve(path, typeof(Transform), propertyName + ".x", xCurve); clip.SetCurve(path, typeof(Transform), propertyName + ".y", yCurve); diff --git a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs index d0f08cfae..b08e097ad 100644 --- a/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs +++ b/spine-unity/Assets/spine-unity/Editor/SpineEditorUtilities.cs @@ -28,7 +28,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ - #pragma warning disable 0219 /***************************************************************************** @@ -38,7 +37,6 @@ #define SPINE_SKELETONANIMATOR using UnityEngine; using UnityEditor; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; @@ -369,9 +367,9 @@ namespace Spine.Unity.Editor { var filename = Path.GetFileNameWithoutExtension(sp); int result = EditorUtility.DisplayDialogComplex( - string.Format("Missing AtlasAsset for \"{0}\"", filename), - string.Format("Could not find matching AtlasAsset for \"{0}\"", filename), - "Choose AtlaseAssets...", "Skip this", "Stop importing all" + string.Format("AtlasAsset for \"{0}\"", filename), + string.Format("Could not automatically set the AtlasAsset for \"{0}\". You may set it manually.", filename), + "Choose AtlasAssets...", "Skip this", "Stop importing all" ); switch (result) { @@ -388,7 +386,7 @@ namespace Spine.Unity.Editor { } } break; - case 0: // Choose AtlaseAssets... + case 0: // Choose AtlasAssets... var atlasList = MultiAtlasDialog(requiredPaths, Path.GetDirectoryName(sp), Path.GetFileNameWithoutExtension(sp)); if (atlasList != null) IngestSpineProject(AssetDatabase.LoadAssetAtPath(sp, typeof(TextAsset)) as TextAsset, atlasList.ToArray()); @@ -471,6 +469,8 @@ namespace Spine.Unity.Editor { #endregion #region Match SkeletonData with Atlases + static readonly AttachmentType[] NonAtlasTypes = { AttachmentType.Boundingbox, AttachmentType.Path }; + static List MultiAtlasDialog (List requiredPaths, string initialDirectory, string filename = "") { List atlasAssets = new List(); bool resolved = false; @@ -552,7 +552,6 @@ namespace Spine.Unity.Editor { static AtlasAsset GetAtlasDialog (string dirPath) { string path = EditorUtility.OpenFilePanel("Select AtlasAsset...", dirPath, "asset"); - if (path == "") return null; // Canceled or closed by user. int subLen = Application.dataPath.Length - 6; @@ -587,15 +586,29 @@ namespace Spine.Unity.Editor { StringReader reader = new StringReader(spineJson.text); var root = Json.Deserialize(reader) as Dictionary; + foreach (KeyValuePair entry in (Dictionary)root["skins"]) { foreach (KeyValuePair slotEntry in (Dictionary)entry.Value) { foreach (KeyValuePair attachmentEntry in ((Dictionary)slotEntry.Value)) { var data = ((Dictionary)attachmentEntry.Value); + + // Ignore non-atlas-requiring types. if (data.ContainsKey("type")) { - if ((string)data["type"] == "boundingbox") + AttachmentType attachmentType; + string typeString = (string)data["type"]; + try { + attachmentType = (AttachmentType)System.Enum.Parse(typeof(AttachmentType), typeString, true); + } catch (System.ArgumentException e) { + // For more info, visit: http://esotericsoftware.com/forum/Spine-editor-and-runtime-version-management-6534 + Debug.LogWarning(string.Format("Unidentified Attachment type: \"{0}\". Skeleton may have been exported from an incompatible Spine version.", typeString)); + throw e; + } + + if (NonAtlasTypes.Contains(attachmentType)) continue; } + if (data.ContainsKey("path")) requiredPaths.Add((string)data["path"]); else if (data.ContainsKey("name")) @@ -633,6 +646,7 @@ namespace Spine.Unity.Editor { public class AtlasRequirementLoader : AttachmentLoader { List requirementList; + public AtlasRequirementLoader (List requirementList) { this.requirementList = requirementList; } @@ -647,14 +661,13 @@ namespace Spine.Unity.Editor { return new MeshAttachment(name); } - public WeightedMeshAttachment NewWeightedMeshAttachment(Skin skin, string name, string path) { - requirementList.Add(path); - return new WeightedMeshAttachment(name); - } - public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { return new BoundingBoxAttachment(name); } + + public PathAttachment NewPathAttachment (Skin skin, string name) { + return new PathAttachment(name); + } } #endregion @@ -897,6 +910,8 @@ namespace Spine.Unity.Editor { #endregion #region Checking Methods + static int[] runtimeVersion = { 3, 3 }; + static bool CheckForValidSkeletonData (string skeletonJSONPath) { string dir = Path.GetDirectoryName(skeletonJSONPath); TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset)); @@ -931,11 +946,23 @@ namespace Spine.Unity.Editor { return false; } + // Version warning + { + var skeletonInfo = (Dictionary)root["skeleton"]; + string spineVersion = (string)skeletonInfo["spine"]; + if (!string.IsNullOrEmpty(spineVersion)) { + var splitVersion = spineVersion.Split('.'); + bool primaryMismatch = runtimeVersion[0] != int.Parse(splitVersion[0]); + bool secondaryMismatch = runtimeVersion[1] != int.Parse(splitVersion[1]); + if (primaryMismatch || secondaryMismatch) + Debug.LogWarning(string.Format("Skeleton '{0}' (exported with Spine {1}) may be incompatible with your runtime version: spine-unity v{2}", asset.name, spineVersion, runtimeVersion[0] + "." + runtimeVersion[1])); + } + } + + return root.ContainsKey("skeleton"); - // TODO: Warn users of old version incompatibility. - // var skeletonInfo = (Dictionary)root["skeleton"]; - // string spineVersion = (string)skeletonInfo["spine"]; + } #endregion @@ -947,7 +974,7 @@ namespace Spine.Unity.Editor { string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(o)); string skinName = EditorPrefs.GetString(guid + "_lastSkin", ""); - InstantiateSkeletonAnimation((SkeletonDataAsset)o, skinName); + InstantiateSkeletonAnimation((SkeletonDataAsset)o, skinName, false); SceneView.RepaintAll(); } } @@ -967,31 +994,13 @@ namespace Spine.Unity.Editor { return true; } - public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, string skinName) { + public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, string skinName, bool destroyInvalid = true) { var skeletonData = skeletonDataAsset.GetSkeletonData(true); var skin = skeletonData != null ? skeletonData.FindSkin(skinName) : null; - return InstantiateSkeletonAnimation(skeletonDataAsset, skin); + return InstantiateSkeletonAnimation(skeletonDataAsset, skin, destroyInvalid); } - public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, Skin skin = null) { - string spineGameObjectName = string.Format("Spine GameObject ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); - GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(SkeletonAnimation)); - SkeletonAnimation newSkeletonAnimation = go.GetComponent(); - newSkeletonAnimation.skeletonDataAsset = skeletonDataAsset; - - bool requiresNormals = false; - - foreach (AtlasAsset atlasAsset in newSkeletonAnimation.skeletonDataAsset.atlasAssets) { - foreach (Material m in atlasAsset.materials) { - if (m.shader.name.Contains("Lit")) { - requiresNormals = true; - break; - } - } - } - - newSkeletonAnimation.calculateNormals = requiresNormals; - + public static SkeletonAnimation InstantiateSkeletonAnimation (SkeletonDataAsset skeletonDataAsset, Skin skin = null, bool destroyInvalid = true) { SkeletonData data = skeletonDataAsset.GetSkeletonData(true); if (data == null) { @@ -1003,17 +1012,40 @@ namespace Spine.Unity.Editor { } if (data == null) { - Debug.LogWarning("Tried to instantiate a skeleton from an invalid SkeletonDataAsset."); + Debug.LogWarning("InstantiateSkeletonAnimation tried to instantiate a skeleton from an invalid SkeletonDataAsset."); return null; } - if (skin == null) - skin = data.DefaultSkin; + if (skin == null) skin = data.DefaultSkin; + if (skin == null) skin = data.Skins.Items[0]; - if (skin == null) - skin = data.Skins.Items[0]; + string spineGameObjectName = string.Format("Spine GameObject ({0})", skeletonDataAsset.name.Replace("_SkeletonData", "")); + GameObject go = new GameObject(spineGameObjectName, typeof(MeshFilter), typeof(MeshRenderer), typeof(SkeletonAnimation)); + SkeletonAnimation newSkeletonAnimation = go.GetComponent(); + newSkeletonAnimation.skeletonDataAsset = skeletonDataAsset; - newSkeletonAnimation.Initialize(false); + { + bool requiresNormals = false; + foreach (AtlasAsset atlasAsset in skeletonDataAsset.atlasAssets) { + foreach (Material m in atlasAsset.materials) { + if (m.shader.name.Contains("Lit")) { + requiresNormals = true; + break; + } + } + } + newSkeletonAnimation.calculateNormals = requiresNormals; + } + + try { + newSkeletonAnimation.Initialize(false); + } catch (System.Exception e) { + if (destroyInvalid) { + Debug.LogWarning("Editor-instantiated SkeletonAnimation threw an Exception. Destroying GameObject to prevent orphaned GameObject."); + GameObject.DestroyImmediate(go); + } + throw e; + } newSkeletonAnimation.skeleton.SetSkin(skin); newSkeletonAnimation.initialSkinName = skin.Name; diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysMeshGenerator.cs b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysMeshGenerator.cs index f71feb554..e5e9811a2 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysMeshGenerator.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysMeshGenerator.cs @@ -186,7 +186,7 @@ namespace Spine.Unity.MeshGeneration { } else { var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { - int meshVertexCount = meshAttachment.vertices.Length; + int meshVertexCount = meshAttachment.worldVerticesLength; if (tempVerts.Length < meshVertexCount) tempVerts = new float[meshVertexCount]; meshAttachment.ComputeWorldVertices(slot, tempVerts); @@ -217,41 +217,6 @@ namespace Spine.Unity.MeshGeneration { vi++; } - } else { - var weightedMeshAttachment = attachment as WeightedMeshAttachment; - if (weightedMeshAttachment != null) { - int meshVertexCount = weightedMeshAttachment.uvs.Length; - if (tempVerts.Length < meshVertexCount) tempVerts = new float[meshVertexCount]; - weightedMeshAttachment.ComputeWorldVertices(slot, tempVerts); - - if (pmaColors) { - color.a = (byte)(a * slot.a * weightedMeshAttachment.a); - color.r = (byte)(r * slot.r * weightedMeshAttachment.r * color.a); - color.g = (byte)(g * slot.g * weightedMeshAttachment.g * color.a); - color.b = (byte)(b * slot.b * weightedMeshAttachment.b * color.a); - if (slot.data.blendMode == BlendMode.additive) color.a = 0; - } else { - color.a = (byte)(a * slot.a * weightedMeshAttachment.a); - color.r = (byte)(r * slot.r * weightedMeshAttachment.r * 255); - color.g = (byte)(g * slot.g * weightedMeshAttachment.g * 255); - color.b = (byte)(b * slot.b * weightedMeshAttachment.b * 255); - } - - float[] attachmentUVs = weightedMeshAttachment.uvs; - for (int iii = 0; iii < meshVertexCount; iii += 2) { - float x = tempVerts[iii], y = tempVerts[iii + 1]; - verts[vi].x = x; verts[vi].y = y; verts[vi].z = z; - colors[vi] = color; - uvs[vi].x = attachmentUVs[iii]; uvs[vi].y = attachmentUVs[iii + 1]; - - if (x < bmin.x) bmin.x = x; - else if (x > bmax.x) bmax.x = x; - if (y < bmin.y) bmin.y = y; - else if (y > bmax.y) bmax.y = y; - - vi++; - } - } } } } @@ -301,7 +266,6 @@ namespace Spine.Unity.MeshGeneration { if (attachment is RegionAttachment) { tris[triangleIndex] = afv; tris[triangleIndex + 1] = afv + 2; tris[triangleIndex + 2] = afv + 1; tris[triangleIndex + 3] = afv + 2; tris[triangleIndex + 4] = afv + 3; tris[triangleIndex + 5] = afv + 1; - triangleIndex += 6; afv += 4; } else { @@ -309,21 +273,13 @@ namespace Spine.Unity.MeshGeneration { int attachmentVertexCount; var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { - attachmentVertexCount = meshAttachment.vertices.Length >> 1; // length/2 + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; // length/2 attachmentTriangles = meshAttachment.triangles; - } else { - var weightedMeshAttachment = attachment as WeightedMeshAttachment; - if (weightedMeshAttachment != null) { - attachmentVertexCount = weightedMeshAttachment.uvs.Length >> 1; // length/2 - attachmentTriangles = weightedMeshAttachment.triangles; - } else - continue; + for (int ii = 0, nn = attachmentTriangles.Length; ii < nn; ii++, triangleIndex++) + tris[triangleIndex] = afv + attachmentTriangles[ii]; + + afv += attachmentVertexCount; } - - for (int ii = 0, nn = attachmentTriangles.Length; ii < nn; ii++, triangleIndex++) - tris[triangleIndex] = afv + attachmentTriangles[ii]; - - afv += attachmentVertexCount; } } // Done adding current submesh triangles } diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs index ae3c70e58..de388d3c5 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSimpleMeshGenerator.cs @@ -65,15 +65,10 @@ namespace Spine.Unity.MeshGeneration { } else { var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { - attachmentVertexCount = meshAttachment.vertices.Length >> 1; + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; attachmentTriangleCount = meshAttachment.triangles.Length; } else { - var skinnedMeshAttachment = attachment as WeightedMeshAttachment; - if (skinnedMeshAttachment != null) { - attachmentVertexCount = skinnedMeshAttachment.uvs.Length >> 1; - attachmentTriangleCount = skinnedMeshAttachment.triangles.Length; - } else - continue; + continue; } } totalTriangleCount += attachmentTriangleCount; diff --git a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSubmeshedMeshGenerator.cs b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSubmeshedMeshGenerator.cs index 6c9ef8d57..a7c48a207 100644 --- a/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSubmeshedMeshGenerator.cs +++ b/spine-unity/Assets/spine-unity/Mesh Generation/Arrays/ArraysSubmeshedMeshGenerator.cs @@ -91,16 +91,10 @@ namespace Spine.Unity.MeshGeneration { var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { rendererObject = meshAttachment.RendererObject; - attachmentVertexCount = meshAttachment.vertices.Length >> 1; + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; attachmentTriangleCount = meshAttachment.triangles.Length; } else { - var skinnedMeshAttachment = attachment as WeightedMeshAttachment; - if (skinnedMeshAttachment != null) { - rendererObject = skinnedMeshAttachment.RendererObject; - attachmentVertexCount = skinnedMeshAttachment.uvs.Length >> 1; - attachmentTriangleCount = skinnedMeshAttachment.triangles.Length; - } else - continue; + continue; } } diff --git a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs index c3269e13a..0573b5ace 100644 --- a/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs +++ b/spine-unity/Assets/spine-unity/Modules/BoundingBoxFollower/BoundingBoxFollower.cs @@ -40,36 +40,20 @@ namespace Spine.Unity { [SpineSlot(dataField: "skeletonRenderer", containsBoundingBoxes: true)] public string slotName; - //TODO: not this - [Tooltip("LOL JK, Someone else do it!")] - public bool use3DMeshCollider; - - private Slot slot; - private BoundingBoxAttachment currentAttachment; - private PolygonCollider2D currentCollider; - private string currentAttachmentName; - private bool valid = false; - private bool hasReset; + Slot slot; + BoundingBoxAttachment currentAttachment; + PolygonCollider2D currentCollider; + string currentAttachmentName; + bool valid = false; + bool hasReset; public Dictionary colliderTable = new Dictionary(); public Dictionary attachmentNameTable = new Dictionary(); - public string CurrentAttachmentName { - get { return currentAttachmentName; } - } - - public BoundingBoxAttachment CurrentAttachment { - get { return currentAttachment; } - } - - public PolygonCollider2D CurrentCollider { - get { return currentCollider; } - } - - public Slot Slot { - get { return slot; } - } - + public string CurrentAttachmentName { get { return currentAttachmentName; } } + public BoundingBoxAttachment CurrentAttachment { get { return currentAttachment; } } + public PolygonCollider2D CurrentCollider { get { return currentCollider; } } + public Slot Slot { get { return slot; } } void OnEnable () { ClearColliders(); @@ -96,7 +80,7 @@ namespace Spine.Unity { } public void HandleReset (SkeletonRenderer renderer) { - if (slotName == null || slotName == "") + if (string.IsNullOrEmpty(slotName)) return; hasReset = true; @@ -110,31 +94,28 @@ namespace Spine.Unity { skeletonRenderer.OnRebuild += HandleReset; } - var skeleton = skeletonRenderer.skeleton; slot = skeleton.FindSlot(slotName); int slotIndex = skeleton.FindSlotIndex(slotName); foreach (var skin in skeleton.Data.Skins) { - List attachmentNames = new List(); + var attachmentNames = new List(); skin.FindNamesForSlot(slotIndex, attachmentNames); - foreach (var name in attachmentNames) { - var attachment = skin.GetAttachment(slotIndex, name); - if (attachment is BoundingBoxAttachment) { - var collider = SkeletonUtility.AddBoundingBoxAsComponent((BoundingBoxAttachment)attachment, gameObject, true); - collider.enabled = false; - collider.hideFlags = HideFlags.HideInInspector; - colliderTable.Add((BoundingBoxAttachment)attachment, collider); - attachmentNameTable.Add((BoundingBoxAttachment)attachment, name); + foreach (var attachmentName in attachmentNames) { + var attachment = skin.GetAttachment(slotIndex, attachmentName); + var boundingBoxAttachment = attachment as BoundingBoxAttachment; + if (boundingBoxAttachment != null) { + var bbCollider = SkeletonUtility.AddBoundingBoxAsComponent(boundingBoxAttachment, gameObject, true); + bbCollider.enabled = false; + bbCollider.hideFlags = HideFlags.HideInInspector; + colliderTable.Add(boundingBoxAttachment, bbCollider); + attachmentNameTable.Add(boundingBoxAttachment, attachmentName); } } } - if (colliderTable.Count == 0) - valid = false; - else - valid = true; + valid = colliderTable.Count != 0; if (!valid) Debug.LogWarning("Bounding Box Follower not valid! Slot [" + slotName + "] does not contain any Bounding Box Attachments!"); @@ -143,13 +124,11 @@ namespace Spine.Unity { void ClearColliders () { var colliders = GetComponents(); if (Application.isPlaying) { - foreach (var c in colliders) { + foreach (var c in colliders) Destroy(c); - } } else { - foreach (var c in colliders) { + foreach (var c in colliders) DestroyImmediate(c); - } } colliderTable.Clear(); @@ -178,7 +157,6 @@ namespace Spine.Unity { } currentAttachment = attachment; - currentAttachmentName = currentAttachment == null ? null : attachmentNameTable[attachment]; } } diff --git a/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs b/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs index b8674180b..5fdf93743 100644 --- a/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs +++ b/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll.cs @@ -21,13 +21,15 @@ namespace Spine.Unity.Modules { [Header("Parameters")] public bool applyOnStart; + [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] + public bool disableIK = true; + public bool disableOtherConstraints = false; + [Space] [Tooltip("Set RootRigidbody IsKinematic to true when Apply is called.")] public bool pinStartBone; [Tooltip("Enable Collision between adjacent ragdoll elements (IE: Neck and Head)")] public bool enableJointCollision; public bool useGravity = true; - [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] - public bool disableIK = true; [Tooltip("If no BoundingBox Attachment is attached to a bone, this becomes the default Width or Radius of a Bone's ragdoll Rigidbody")] public float thickness = 0.125f; [Tooltip("Default rotational limit value. Min is negative this value, Max is this value.")] @@ -108,10 +110,6 @@ namespace Spine.Unity.Modules { Transform parentTransform; boneColliders.Add(t.GetComponent()); if (b == StartingBone) { -// skeletonSpaceTransform = new GameObject("Spine World Space Transform").transform; -// skeletonSpaceTransform.hideFlags = HideFlags.NotEditable; -// skeletonSpaceTransform.localScale = FlipScale(skeleton.flipX, skeleton.flipY); -// skeletonSpaceTransform.SetParent(this.transform, false); ragdollRoot = new GameObject("RagdollRoot").transform; ragdollRoot.SetParent(transform, false); if (b == skeleton.RootBone) { // RagdollRoot is skeleton root. @@ -176,11 +174,28 @@ namespace Spine.Unity.Modules { Debug.LogWarning(msg); } } - - // Disable IK constraints. + + // Disable skeleton constraints. if (disableIK) { - foreach (IkConstraint ik in skeleton.IkConstraints) - ik.Mix = 0; + var ikConstraints = skeleton.IkConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) + ikConstraints.Items[i].mix = 0; + } + + if (disableOtherConstraints) { + var transformConstraints = skeleton.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + transformConstraints.Items[i].rotateMix = 0; + transformConstraints.Items[i].scaleMix = 0; + transformConstraints.Items[i].shearMix = 0; + transformConstraints.Items[i].translateMix = 0; + } + + var pathConstraints = skeleton.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + pathConstraints.Items[i].rotateMix = 0; + pathConstraints.Items[i].translateMix = 0; + } } targetSkeletonComponent.UpdateWorld += UpdateSpineSkeleton; @@ -209,9 +224,8 @@ namespace Spine.Unity.Modules { Vector3 offset = worldPosition - transform.position; transform.position = worldPosition; - foreach (Transform t in boneTable.Values) { + foreach (Transform t in boneTable.Values) t.position -= offset; - } UpdateSpineSkeleton(null); skeleton.UpdateWorldTransform(); @@ -220,9 +234,9 @@ namespace Spine.Unity.Modules { /// Removes the ragdoll instance and effect from the animated skeleton. public void Remove () { isActive = false; - foreach (var t in boneTable.Values) { + foreach (var t in boneTable.Values) Destroy(t.gameObject); - } + Destroy(ragdollRoot.gameObject); boneTable.Clear(); @@ -247,7 +261,7 @@ namespace Spine.Unity.Modules { t.parent = transform; t.localPosition = new Vector3(b.WorldX, b.WorldY, 0); - t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX); + t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX); t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 1); // MITCH: You left "todo: proper ragdoll branching" @@ -266,9 +280,8 @@ namespace Spine.Unity.Modules { var rb = boneGameObject.AddComponent(); rb.constraints = RigidbodyConstraints.FreezePositionZ; - foreach (Bone child in b.Children) { + foreach (Bone child in b.Children) RecursivelyCreateBoneProxies(child); - } } void UpdateSpineSkeleton (ISkeletonAnimation skeletonRenderer) { diff --git a/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs b/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs index 2972d3fae..c245f7003 100644 --- a/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs +++ b/spine-unity/Assets/spine-unity/Modules/Ragdoll/SkeletonRagdoll2D.cs @@ -32,11 +32,13 @@ namespace Spine.Unity.Modules { [Header("Parameters")] public bool applyOnStart; + [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] + public bool disableIK = true; + public bool disableOtherConstraints = false; + [Space] [Tooltip("Set RootRigidbody IsKinematic to true when Apply is called.")] public bool pinStartBone; public float gravityScale = 1; - [Tooltip("Warning! You will have to re-enable and tune mix values manually if attempting to remove the ragdoll system.")] - public bool disableIK = true; [Tooltip("If no BoundingBox Attachment is attached to a bone, this becomes the default Width or Radius of a Bone's ragdoll Rigidbody")] public float thickness = 0.125f; [Tooltip("Default rotational limit value. Min is negative this value, Max is this value.")] @@ -62,7 +64,6 @@ namespace Spine.Unity.Modules { public Vector3 RootOffset { get { return this.rootOffset; } } bool isActive; public bool IsActive { get { return this.isActive; } } -// public Transform skeletonSpaceTransform; IEnumerator Start () { if (parentSpaceHelper == null) { @@ -129,10 +130,6 @@ namespace Spine.Unity.Modules { Transform parentTransform; boneColliders.Add(t.GetComponent()); if (b == startingBone) { -// skeletonSpaceTransform = new GameObject("Spine World Space Transform").transform; -// skeletonSpaceTransform.hideFlags = HideFlags.NotEditable; -// skeletonSpaceTransform.localScale = FlipScale(skeleton.flipX, skeleton.flipY); -// skeletonSpaceTransform.SetParent(this.transform, false); ragdollRoot = new GameObject("RagdollRoot").transform; ragdollRoot.SetParent(transform, false); if (b == skeleton.RootBone) { // RagdollRoot is skeleton root. @@ -194,11 +191,30 @@ namespace Spine.Unity.Modules { Debug.LogWarning(msg); } } - // Disable IK constraints. + + // Disable skeleton constraints. if (disableIK) { - foreach (IkConstraint ik in skeleton.IkConstraints) - ik.Mix = 0; + var ikConstraints = skeleton.IkConstraints; + for (int i = 0, n = ikConstraints.Count; i < n; i++) + ikConstraints.Items[i].mix = 0; } + + if (disableOtherConstraints) { + var transformConstraints = skeleton.transformConstraints; + for (int i = 0, n = transformConstraints.Count; i < n; i++) { + transformConstraints.Items[i].rotateMix = 0; + transformConstraints.Items[i].scaleMix = 0; + transformConstraints.Items[i].shearMix = 0; + transformConstraints.Items[i].translateMix = 0; + } + + var pathConstraints = skeleton.pathConstraints; + for (int i = 0, n = pathConstraints.Count; i < n; i++) { + pathConstraints.Items[i].rotateMix = 0; + pathConstraints.Items[i].translateMix = 0; + } + } + targetSkeletonComponent.UpdateWorld += UpdateSpineSkeleton; } @@ -222,11 +238,12 @@ namespace Spine.Unity.Modules { Debug.LogWarning("Can't call SetSkeletonPosition while Ragdoll is not active!"); return; } + Vector3 offset = worldPosition - transform.position; transform.position = worldPosition; - foreach (Transform t in boneTable.Values) { + foreach (Transform t in boneTable.Values) t.position -= offset; - } + UpdateSpineSkeleton(null); skeleton.UpdateWorldTransform(); } @@ -234,9 +251,9 @@ namespace Spine.Unity.Modules { /// Removes the ragdoll instance and effect from the animated skeleton. public void Remove () { isActive = false; - foreach (var t in boneTable.Values) { + foreach (var t in boneTable.Values) Destroy(t.gameObject); - } + Destroy(ragdollRoot.gameObject); boneTable.Clear(); targetSkeletonComponent.UpdateWorld -= UpdateSpineSkeleton; @@ -261,7 +278,7 @@ namespace Spine.Unity.Modules { t.parent = transform; t.localPosition = new Vector3(b.WorldX, b.WorldY, 0); - t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX); + t.localRotation = Quaternion.Euler(0, 0, b.WorldRotationX - b.shearX); t.localScale = new Vector3(b.WorldScaleX, b.WorldScaleY, 0); // MITCH: You left "todo: proper ragdoll branching" @@ -284,9 +301,8 @@ namespace Spine.Unity.Modules { rb.isKinematic = spawnKinematic; #endif - foreach (Bone child in b.Children) { + foreach (Bone child in b.Children) RecursivelyCreateBoneProxies(child); - } } /// Performed every skeleton animation update to translate Unity Transforms positions into Spine bone transforms. @@ -337,19 +353,6 @@ namespace Spine.Unity.Modules { b.y = Mathf.Lerp(b.y, boneLocalPosition.y, mix); b.rotation = Mathf.Lerp(b.rotation, boneLocalRotation, mix); b.appliedRotation = Mathf.Lerp(b.appliedRotation, boneLocalRotation, mix); - -// Mitch Original Code: -// Vector3 right = parentSpaceHelper.InverseTransformDirection(t.right); -// float a = Mathf.Atan2(right.y, right.x) * Mathf.Rad2Deg; -// if (b.worldSignX ^ b.worldSignY) { -// a *= -1; -// } -// if (parentBone != null) { -// if ((b.WorldFlipX ^ b.WorldFlipY) != flip) { -// a -= GetCompensatedRotationIK(parentBone) * 2; -// } -// } -// b.Rotation = Mathf.Lerp(b.Rotation, a, mix); } } diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs index 552f5987e..7e7c1b7f0 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonGraphic/SkeletonGraphic.cs @@ -209,7 +209,7 @@ namespace Spine.Unity { if (this.IsValid) { skeleton.SetColor(this.color); if (canvas != null) - spineMeshGenerator.Scale = canvas.referencePixelsPerUnit; // TODO: move this to a listener to of the canvas? + spineMeshGenerator.Scale = canvas.referencePixelsPerUnit; //JOHN: left a todo: move this to a listener to of the canvas? canvasRenderer.SetMesh(spineMeshGenerator.GenerateMesh(skeleton)); //this.UpdateMaterial(); // TODO: This allocates memory. diff --git a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs index a8e75cf7f..26455fe5f 100644 --- a/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs +++ b/spine-unity/Assets/spine-unity/Modules/SkeletonRenderSeparator/Editor/SkeletonRenderSeparatorInspector.cs @@ -76,7 +76,7 @@ namespace Spine.Unity.Modules { } public override void OnInspectorGUI () { - // TODO: Add Undo support + //JOHN: left todo: Add Undo support var componentRenderers = component.partsRenderers; int totalParts; diff --git a/spine-unity/Assets/spine-unity/Modules/SpriteAttacher.cs b/spine-unity/Assets/spine-unity/Modules/SpriteAttacher.cs index ceb4d2601..1b2dba0f9 100644 --- a/spine-unity/Assets/spine-unity/Modules/SpriteAttacher.cs +++ b/spine-unity/Assets/spine-unity/Modules/SpriteAttacher.cs @@ -70,7 +70,7 @@ namespace Spine.Unity.Modules { public class SpriteAttachmentLoader : AttachmentLoader { - //TODO: Memory cleanup functions + //MITCH: left a todo: Memory cleanup functions //IMPORTANT: Make sure you clear this when you don't need it anymore. Goodluck. public static Dictionary atlasTable = new Dictionary(); @@ -125,25 +125,25 @@ namespace Spine.Unity.Modules { int instanceId = tex.GetInstanceID(); AtlasRegion atlasRegion; - //check cache first + // Check cache first if (atlasTable.ContainsKey(instanceId)) { atlasRegion = atlasTable[instanceId]; } else { - //Setup new material - Material mat = new Material(shader); + // Setup new material. + var material = new Material(shader); if (sprite.packed) - mat.name = "Unity Packed Sprite Material"; + material.name = "Unity Packed Sprite Material"; else - mat.name = sprite.name + " Sprite Material"; - mat.mainTexture = tex; + material.name = sprite.name + " Sprite Material"; + material.mainTexture = tex; - //create faux-region to play nice with SkeletonRenderer + // Create faux-region to play nice with SkeletonRenderer. atlasRegion = new AtlasRegion(); AtlasPage page = new AtlasPage(); - page.rendererObject = mat; + page.rendererObject = material; atlasRegion.page = page; - //cache it + // Cache it. atlasTable[instanceId] = atlasRegion; } @@ -158,12 +158,11 @@ namespace Spine.Unity.Modules { Bounds bounds = sprite.bounds; Vector3 size = bounds.size; - //TODO: make sure this rotation thing actually works + //MITCH: left todo: make sure this rotation thing actually works bool rotated = false; if (sprite.packed) rotated = sprite.packingRotation == SpritePackingRotation.Any; - //do some math and assign UVs and sizes attachment.SetUVs(texRect.xMin, texRect.yMax, texRect.xMax, texRect.yMin, rotated); attachment.RendererObject = atlasRegion; attachment.SetColor(Color.white); @@ -183,16 +182,16 @@ namespace Spine.Unity.Modules { } public MeshAttachment NewMeshAttachment (Skin skin, string name, string path) { - //TODO: Unity 5 only - throw new System.NotImplementedException(); + //MITCH : Left todo: Unity 5 only + return null; } - public WeightedMeshAttachment NewWeightedMeshAttachment(Skin skin, string name, string path) { - throw new System.NotImplementedException(); + public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { + return null; } - public BoundingBoxAttachment NewBoundingBoxAttachment (Skin skin, string name) { - throw new System.NotImplementedException(); + public PathAttachment NewPathAttachment (Skin skin, string name) { + return null; } private float InverseLerp(float a, float b, float value) diff --git a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs index bfeb523ba..edf5756d1 100644 --- a/spine-unity/Assets/spine-unity/SkeletonExtensions.cs +++ b/spine-unity/Assets/spine-unity/SkeletonExtensions.cs @@ -15,7 +15,6 @@ namespace Spine.Unity { public static Color GetColor (this Skeleton s) { return new Color(s.r, s.g, s.b, s.a); } public static Color GetColor (this RegionAttachment a) { return new Color(a.r, a.g, a.b, a.a); } public static Color GetColor (this MeshAttachment a) { return new Color(a.r, a.g, a.b, a.a); } - public static Color GetColor (this WeightedMeshAttachment a) { return new Color(a.r, a.g, a.b, a.a); } public static void SetColor (this Skeleton skeleton, Color color) { skeleton.A = color.a; @@ -72,23 +71,9 @@ namespace Spine.Unity { attachment.G = color.g * ByteToFloat; attachment.B = color.b * ByteToFloat; } - - public static void SetColor (this WeightedMeshAttachment attachment, Color color) { - attachment.A = color.a; - attachment.R = color.r; - attachment.G = color.g; - attachment.B = color.b; - } - - public static void SetColor (this WeightedMeshAttachment attachment, Color32 color) { - attachment.A = color.a * ByteToFloat; - attachment.R = color.r * ByteToFloat; - attachment.G = color.g * ByteToFloat; - attachment.B = color.b * ByteToFloat; - } #endregion - #region Bone Position + #region Bone public static void SetPosition (this Bone bone, Vector2 position) { bone.X = position.x; bone.Y = position.y; @@ -106,8 +91,21 @@ namespace Spine.Unity { public static Vector3 GetWorldPosition (this Bone bone, UnityEngine.Transform parentTransform) { return parentTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY)); } + + public static Matrix4x4 GetMatrix4x4 (this Bone bone) { + return new Matrix4x4 { + m00 = bone.a, m01 = bone.b, m03 = bone.worldX, + m10 = bone.c, m11 = bone.d, m13 = bone.worldY, + m33 = 1 + }; + } #endregion + } +} + +namespace Spine { + public static class SkeletonExtensions { #region Posing /// /// Shortcut for posing a skeleton at a specific time. Time is in seconds. (frameNumber / 30f) will give you seconds. @@ -161,7 +159,7 @@ namespace Spine.Unity { for (int i = 0, n = timelinesItems.Length; i < n; i++) timelinesItems[i].SetToSetupPose(skeleton); } - + public static void SetToSetupPose (this Timeline timeline, Skeleton skeleton) { if (timeline != null) { // sorted according to assumed likelihood here @@ -181,10 +179,10 @@ namespace Spine.Unity { // Attachment - } else if (timeline is FfdTimeline) { - var slot = skeleton.slots.Items[((FfdTimeline)timeline).slotIndex]; - slot.attachmentVerticesCount = 0; - + } else if (timeline is DeformTimeline) { + var slot = skeleton.slots.Items[((DeformTimeline)timeline).slotIndex]; + slot.attachmentVertices.Clear(false); + // Slot } else if (timeline is AttachmentTimeline) { skeleton.SetSlotAttachmentToSetupPose(((AttachmentTimeline)timeline).slotIndex); diff --git a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs index 341713ac5..697483f07 100644 --- a/spine-unity/Assets/spine-unity/SkeletonRenderer.cs +++ b/spine-unity/Assets/spine-unity/SkeletonRenderer.cs @@ -29,9 +29,9 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ #define SPINE_OPTIONAL_NORMALS -#define SPINE_OPTIONAL_FRONTFACING #define SPINE_OPTIONAL_RENDEROVERRIDE #define SPINE_OPTIONAL_MATERIALOVERRIDE +//#define SPINE_OPTIONAL_FRONTFACING //#define SPINE_OPTIONAL_SUBMESHRENDERER // Deprecated using System; @@ -290,16 +290,10 @@ namespace Spine.Unity { var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { rendererObject = meshAttachment.RendererObject; - attachmentVertexCount = meshAttachment.vertices.Length >> 1; + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; attachmentTriangleCount = meshAttachment.triangles.Length; } else { - var skinnedMeshAttachment = attachment as WeightedMeshAttachment; - if (skinnedMeshAttachment != null) { - rendererObject = skinnedMeshAttachment.RendererObject; - attachmentVertexCount = skinnedMeshAttachment.uvs.Length >> 1; - attachmentTriangleCount = skinnedMeshAttachment.triangles.Length; - } else - continue; + continue; } } @@ -549,7 +543,7 @@ namespace Spine.Unity { continue; MeshAttachment meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { - int meshVertexCount = meshAttachment.vertices.Length; + int meshVertexCount = meshAttachment.worldVerticesLength; if (tempVertices.Length < meshVertexCount) this.tempVertices = tempVertices = new float[meshVertexCount]; meshAttachment.ComputeWorldVertices(slot, tempVertices); @@ -587,48 +581,6 @@ namespace Spine.Unity { else if (y > meshBoundsMax.y) meshBoundsMax.y = y; } - } else { - WeightedMeshAttachment weightedMeshAttachment = attachment as WeightedMeshAttachment; - if (weightedMeshAttachment != null) { - int meshVertexCount = weightedMeshAttachment.uvs.Length; - if (tempVertices.Length < meshVertexCount) - this.tempVertices = tempVertices = new float[meshVertexCount]; - weightedMeshAttachment.ComputeWorldVertices(slot, tempVertices); - - if (pmaVertexColors) { - color.a = (byte)(a * slot.a * weightedMeshAttachment.a); - color.r = (byte)(r * slot.r * weightedMeshAttachment.r * color.a); - color.g = (byte)(g * slot.g * weightedMeshAttachment.g * color.a); - color.b = (byte)(b * slot.b * weightedMeshAttachment.b * color.a); - if (slot.data.blendMode == BlendMode.additive) color.a = 0; - } else { - color.a = (byte)(a * slot.a * weightedMeshAttachment.a); - color.r = (byte)(r * slot.r * weightedMeshAttachment.r * 255); - color.g = (byte)(g * slot.g * weightedMeshAttachment.g * 255); - color.b = (byte)(b * slot.b * weightedMeshAttachment.b * 255); - } - - float[] meshUVs = weightedMeshAttachment.uvs; - float z = i * zSpacing; - for (int ii = 0; ii < meshVertexCount; ii += 2, vertexIndex++) { - float x = tempVertices[ii], y = tempVertices[ii + 1]; - vertices[vertexIndex].x = x; - vertices[vertexIndex].y = y; - vertices[vertexIndex].z = z; - colors[vertexIndex] = color; - uvs[vertexIndex].x = meshUVs[ii]; - uvs[vertexIndex].y = meshUVs[ii + 1]; - - if (x < meshBoundsMin.x) - meshBoundsMin.x = x; - else if (x > meshBoundsMax.x) - meshBoundsMax.x = x; - if (y < meshBoundsMin.y) - meshBoundsMin.y = y; - else if (y > meshBoundsMax.y) - meshBoundsMax.y = y; - } - } } } } while (++i < drawOrderCount); @@ -887,16 +839,16 @@ namespace Spine.Unity { } #else if (attachment is RegionAttachment) { - triangles[triangleIndex] = firstVertex; - triangles[triangleIndex + 1] = firstVertex + 2; - triangles[triangleIndex + 2] = firstVertex + 1; - triangles[triangleIndex + 3] = firstVertex + 2; - triangles[triangleIndex + 4] = firstVertex + 3; - triangles[triangleIndex + 5] = firstVertex + 1; + triangles[triangleIndex] = firstVertex; + triangles[triangleIndex + 1] = firstVertex + 2; + triangles[triangleIndex + 2] = firstVertex + 1; + triangles[triangleIndex + 3] = firstVertex + 2; + triangles[triangleIndex + 4] = firstVertex + 3; + triangles[triangleIndex + 5] = firstVertex + 1; - triangleIndex += 6; - firstVertex += 4; - continue; + triangleIndex += 6; + firstVertex += 4; + continue; } #endif @@ -905,15 +857,10 @@ namespace Spine.Unity { int attachmentVertexCount; var meshAttachment = attachment as MeshAttachment; if (meshAttachment != null) { - attachmentVertexCount = meshAttachment.vertices.Length >> 1; // length/2 + attachmentVertexCount = meshAttachment.worldVerticesLength >> 1; // length/2 attachmentTriangles = meshAttachment.triangles; } else { - var weightedMeshAttachment = attachment as WeightedMeshAttachment; - if (weightedMeshAttachment != null) { - attachmentVertexCount = weightedMeshAttachment.uvs.Length >> 1; // length/2 - attachmentTriangles = weightedMeshAttachment.triangles; - } else - continue; + continue; } #if SPINE_OPTIONAL_FRONTFACING diff --git a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs index 42e346d9b..3506fb2b3 100644 --- a/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs +++ b/spine-unity/Assets/spine-unity/SkeletonUtility/Editor/SkeletonUtilityInspector.cs @@ -211,7 +211,7 @@ namespace Spine.Unity.Editor { Texture2D icon = null; - if (attachment is MeshAttachment || attachment is WeightedMeshAttachment) + if (attachment is MeshAttachment) icon = SpineEditorUtilities.Icons.mesh; else icon = SpineEditorUtilities.Icons.image; diff --git a/spine-unity/Assets/spine-unity/SpineAttributes.cs b/spine-unity/Assets/spine-unity/SpineAttributes.cs index 269f37ae9..d6c0ab34c 100644 --- a/spine-unity/Assets/spine-unity/SpineAttributes.cs +++ b/spine-unity/Assets/spine-unity/SpineAttributes.cs @@ -170,8 +170,7 @@ namespace Spine.Unity { } public class SpineAtlasRegion : PropertyAttribute { - //TODO: Standardize with Skeleton attributes - //NOTE: For now, relies on locally scoped field named "atlasAsset" for source. + } } diff --git a/spine-unity/README.md b/spine-unity/README.md index 9274b05d7..04d63f5f7 100644 --- a/spine-unity/README.md +++ b/spine-unity/README.md @@ -2,7 +2,7 @@ The **spine-unity** runtime provides functionality to load, manipulate and render [Spine](http://esotericsoftware.com) skeletal animation data using [Unity](http://unity3d.com/). spine-unity is based on [spine-csharp](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-csharp). -For more documentation, see [spine-unity Documentation](https://github.com/pharan/spine-unity-docs/blob/master/README.md). +For more documentation, see [spine-unity Documentation](http://esotericsoftware.com/spine-unity). While spine-unity can render directly with Unity, without the need for any other plugins, it also works with [2D Toolkit](http://www.2dtoolkit.com/) and can render skeletons using a TK2D texture atlas. @@ -14,7 +14,7 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-unity works with data exported from Spine 3.2.01. Updating spine-unity to [v3.3](https://github.com/EsotericSoftware/spine-runtimes/issues/613) is in progress. +spine-unity works with data exported from Spine 3.3.07. spine-unity supports all Spine features. @@ -32,9 +32,7 @@ For more documentation, see [spine-unity Documentation](http://esotericsoftware. ## Quick installation -Download and run this Unity package: - -[spine-unity.unitypackage](http://esotericsoftware.com/files/runtimes/unity/spine-unity.unitypackage) +Download the latest Spine-Unity unitypackage from the download page: http://esotericsoftware.com/spine-unity-download/ In the `Assets/Examples/Scenes` folder you will find many example scenes that demonstrate various spine-unity features. @@ -52,23 +50,13 @@ You can also choose to setup and run from the Git files: > - `Gizmos` is a [special folder](http://docs.unity3d.com/Manual/SpecialFolders.html) in Unity. It needs to be at the root of your assets folder to function correctly. (ie. `Assets/Gizmos` - `spine-csharp` and `spine-unity` can be placed in any subfolder you want. +For more information on importing the runtime into your Unity project, see the documentation sections on [installing](http://esotericsoftware.com/spine-unity#Installing) and [updating](http://esotericsoftware.com/spine-unity#Updating-Your-Projects-SpineUnity-Runtime), + ---------- -## Importing skeleton data - -1. Add your `.json`, `.atlas.txt` and `.png` into your Unity project. - - You can do this through Unity's Project View: Drag and drop a folder containing the `.json`, `.atlas.txt` and `.png` files exported from Spine directly into the Unity Project view. - - ... or you can opt to do this through Windows File Explorer or OSX Finder. Move or copy your `.json`, `.atlas.txt` and `.png` files into your Unity project's `Assets` folder, ideally in its own subfolder. -2. spine-unity will automatically detect the `.json` and `.atlas.txt` and attempt to generate the necessary spine-unity assets. -3. To start using your Spine assets, right-click on the SkeletonDataAsset (the asset with the orange Spine logo on it) and choose `Spine > Instantiate(SkeletonAnimation)`. This will add a GameObject with a `SkeletonAnimation` component on it. - - If you are more familiar with Mecanim, you may choose `Spine > Instantiate(Mecanim)` instead. -4. For more info on how to control the animation, see the [spine-unity Animation Control documentation](https://github.com/pharan/spine-unity-docs/blob/master/Animation.md). - -> The original [manual setup video](https://www.youtube.com/watch?v=-V84OIvZdQc) to shows which assets belong where and what spine-unity's automatic import actually does for you under the hood. In case you have a specialized asset setup, this video will be useful for understanding how assets fit together. - > More resources: -- [Drag and drop video](http://www.youtube.com/watch?v=-Gk_zJsY1Ms) -- [readme PDF](https://raw.githubusercontent.com/EsotericSoftware/spine-runtimes/master/spine-unity/README.pdf) +- [Spine-Unity Documentation](http://esotericsoftware.com/spine-unity) +- [Importing Spine Skeletons into Unity](http://esotericsoftware.com/spine-unity#Importing-into-Unity) ---------- diff --git a/spine-xna/README.md b/spine-xna/README.md index 2afbd013f..b86f0c835 100644 --- a/spine-xna/README.md +++ b/spine-xna/README.md @@ -10,14 +10,17 @@ The Spine Runtimes are developed with the intent to be used with data exported f ## Spine version -spine-xna works with data exported from Spine 3.2.01. Updating spine-xna to [v3.3](https://github.com/EsotericSoftware/spine-runtimes/issues/613) is in progress. +spine-xna works with data exported from Spine 3.7.07. spine-xna supports all Spine features. ## Setup 1. Download the Spine Runtimes source using [git](https://help.github.com/articles/set-up-git) or by downloading it [as a zip](https://github.com/EsotericSoftware/spine-runtimes/archive/master.zip). -1. If necessary, install [Microsoft XNA Game Studio 4.0](https://mxa.codeplex.com/releases/view/618279). +1. For XNA with Visual Studio 2015, download [XNA 4.0 refresh for Visual Studio 2015](https://mxa.codeplex.com/releases/view/618279). Install each subfolder as per the README file. 1. Open the `spine-xna.sln` project file with Visual Studio. +1. Set `spine-xna-example` as the startup project +1. Set the working directory of `spine-xna-example` to `spine-runtimes/spine-xna/example` +1. Run the example! Alternatively, the contents of the `spine-csharp/src` and `spine-xna/src` directories can be copied into your project. diff --git a/spine-xna/example/data/goblins-mesh.atlas b/spine-xna/example/data/goblins-mesh.atlas index b928522f8..d674db469 100644 --- a/spine-xna/example/data/goblins-mesh.atlas +++ b/spine-xna/example/data/goblins-mesh.atlas @@ -1,291 +1,292 @@ goblins-mesh.png +size: 1024,128 format: RGBA8888 filter: Linear,Linear repeat: none dagger - rotate: false - xy: 2, 28 + rotate: true + xy: 372, 100 size: 26, 108 orig: 26, 108 offset: 0, 0 index: -1 goblin/eyes-closed rotate: false - xy: 137, 29 + xy: 2, 7 size: 34, 12 orig: 34, 12 offset: 0, 0 index: -1 goblin/head rotate: false - xy: 26, 357 + xy: 107, 36 size: 103, 66 orig: 103, 66 offset: 0, 0 index: -1 goblin/left-arm rotate: false - xy: 30, 28 + xy: 901, 56 size: 37, 35 orig: 37, 35 offset: 0, 0 index: -1 goblin/left-foot rotate: false - xy: 134, 260 + xy: 929, 95 size: 65, 31 orig: 65, 31 offset: 0, 0 index: -1 goblin/left-hand rotate: false - xy: 69, 25 + xy: 452, 2 size: 36, 41 orig: 36, 41 offset: 0, 0 index: -1 goblin/left-lower-leg - rotate: false - xy: 134, 293 + rotate: true + xy: 713, 93 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblin/left-shoulder rotate: false - xy: 137, 43 + xy: 610, 44 size: 29, 44 orig: 29, 44 offset: 0, 0 index: -1 goblin/left-upper-leg - rotate: false - xy: 30, 65 + rotate: true + xy: 638, 93 size: 33, 73 orig: 33, 73 offset: 0, 0 index: -1 goblin/neck rotate: false - xy: 201, 387 + xy: 490, 2 size: 36, 41 orig: 36, 41 offset: 0, 0 index: -1 goblin/pelvis rotate: false - xy: 26, 140 + xy: 482, 45 size: 62, 43 orig: 62, 43 offset: 0, 0 index: -1 goblin/right-arm - rotate: false - xy: 171, 84 + rotate: true + xy: 690, 2 size: 23, 50 orig: 23, 50 offset: 0, 0 index: -1 goblin/right-foot rotate: false - xy: 134, 225 + xy: 771, 58 size: 63, 33 orig: 63, 33 offset: 0, 0 index: -1 goblin/right-hand rotate: false - xy: 204, 258 + xy: 940, 56 size: 36, 37 orig: 36, 37 offset: 0, 0 index: -1 goblin/right-lower-leg - rotate: false - xy: 201, 430 + rotate: true + xy: 482, 90 size: 36, 76 orig: 36, 76 offset: 0, 0 index: -1 goblin/right-shoulder - rotate: false - xy: 130, 89 + rotate: true + xy: 602, 3 size: 39, 45 orig: 39, 45 offset: 0, 0 index: -1 goblin/right-upper-leg - rotate: false - xy: 98, 214 + rotate: true + xy: 641, 57 size: 34, 63 orig: 34, 63 offset: 0, 0 index: -1 goblin/torso - rotate: false - xy: 131, 410 + rotate: true + xy: 212, 34 size: 68, 96 orig: 68, 96 offset: 0, 0 index: -1 goblin/undie-straps rotate: false - xy: 2, 7 + xy: 380, 5 size: 55, 19 orig: 55, 19 offset: 0, 0 index: -1 goblin/undies rotate: false - xy: 199, 227 + xy: 174, 5 size: 36, 29 orig: 36, 29 offset: 0, 0 index: -1 goblingirl/eyes-closed rotate: false - xy: 59, 2 + xy: 269, 11 size: 37, 21 orig: 37, 21 offset: 0, 0 index: -1 goblingirl/head rotate: false - xy: 26, 425 + xy: 2, 21 size: 103, 81 orig: 103, 81 offset: 0, 0 index: -1 goblingirl/left-arm - rotate: false - xy: 201, 190 + rotate: true + xy: 978, 56 size: 37, 35 orig: 37, 35 offset: 0, 0 index: -1 goblingirl/left-foot rotate: false - xy: 134, 192 + xy: 107, 3 size: 65, 31 orig: 65, 31 offset: 0, 0 index: -1 goblingirl/left-hand rotate: false - xy: 196, 109 + xy: 565, 2 size: 35, 40 orig: 35, 40 offset: 0, 0 index: -1 goblingirl/left-lower-leg - rotate: false - xy: 169, 293 + rotate: true + xy: 785, 93 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblingirl/left-shoulder - rotate: false - xy: 107, 30 + rotate: true + xy: 690, 27 size: 28, 46 orig: 28, 46 offset: 0, 0 index: -1 goblingirl/left-upper-leg - rotate: false - xy: 65, 68 + rotate: true + xy: 857, 93 size: 33, 70 orig: 33, 70 offset: 0, 0 index: -1 goblingirl/neck rotate: false - xy: 204, 297 + xy: 528, 2 size: 35, 41 orig: 35, 41 offset: 0, 0 index: -1 goblingirl/pelvis rotate: false - xy: 131, 365 + xy: 546, 45 size: 62, 43 orig: 62, 43 offset: 0, 0 index: -1 goblingirl/right-arm rotate: false - xy: 100, 97 + xy: 452, 48 size: 28, 50 orig: 28, 50 offset: 0, 0 index: -1 goblingirl/right-foot rotate: false - xy: 134, 157 + xy: 836, 58 size: 63, 33 orig: 63, 33 offset: 0, 0 index: -1 goblingirl/right-hand - rotate: false - xy: 199, 151 + rotate: true + xy: 771, 20 size: 36, 37 orig: 36, 37 offset: 0, 0 index: -1 goblingirl/right-lower-leg - rotate: false - xy: 96, 279 + rotate: true + xy: 560, 90 size: 36, 76 orig: 36, 76 offset: 0, 0 index: -1 goblingirl/right-shoulder rotate: false - xy: 204, 340 + xy: 649, 10 size: 39, 45 orig: 39, 45 offset: 0, 0 index: -1 goblingirl/right-upper-leg - rotate: false - xy: 98, 149 + rotate: true + xy: 706, 57 size: 34, 63 orig: 34, 63 offset: 0, 0 index: -1 goblingirl/torso rotate: false - xy: 26, 259 + xy: 310, 2 size: 68, 96 orig: 68, 96 offset: 0, 0 index: -1 goblingirl/undie-straps rotate: false - xy: 134, 136 + xy: 212, 13 size: 55, 19 orig: 55, 19 offset: 0, 0 index: -1 goblingirl/undies rotate: false - xy: 196, 78 + xy: 810, 27 size: 36, 29 orig: 36, 29 offset: 0, 0 index: -1 shield rotate: false - xy: 26, 185 + xy: 380, 26 size: 70, 72 orig: 70, 72 offset: 0, 0 index: -1 spear - rotate: false - xy: 2, 138 + rotate: true + xy: 2, 104 size: 22, 368 orig: 22, 368 offset: 0, 0 diff --git a/spine-xna/example/data/goblins-mesh.json b/spine-xna/example/data/goblins-mesh.json index 163060444..8443eee97 100644 --- a/spine-xna/example/data/goblins-mesh.json +++ b/spine-xna/example/data/goblins-mesh.json @@ -1,26 +1,27 @@ { +"skeleton": { "hash": "P7CQ4ImK+tcAICATgSttlZ5HOSM", "spine": "3.3.07", "width": 266.93, "height": 349.6, "images": "./images/" }, "bones": [ { "name": "root" }, { "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 }, - { "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 }, + { "name": "torso", "parent": "hip", "length": 85.82, "rotation": 93.92, "x": -6.42, "y": 1.97 }, + { "name": "neck", "parent": "torso", "length": 18.38, "rotation": -1.51, "x": 81.67, "y": -6.34 }, + { "name": "head", "parent": "neck", "length": 68.28, "rotation": -13.92, "x": 20.93, "y": 11.59 }, + { "name": "left shoulder", "parent": "torso", "length": 35.43, "rotation": -156.96, "x": 74.04, "y": -20.38 }, + { "name": "left arm", "parent": "left shoulder", "length": 35.62, "rotation": 28.16, "x": 37.85, "y": -2.34 }, + { "name": "left upper leg", "parent": "hip", "length": 50.39, "rotation": -89.09, "x": 14.45, "y": 2.81 }, + { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "rotation": -16.65, "x": 56.34, "y": 0.98 }, + { "name": "left foot", "parent": "left lower leg", "length": 46.5, "rotation": 102.43, "x": 58.94, "y": -7.61 }, + { "name": "left hand", "parent": "left arm", "length": 11.52, "rotation": 2.7, "x": 35.62, "y": 0.07 }, { "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 }, - { "name": "right upper leg", "parent": "hip", "length": 42.45, "x": -20.07, "y": -6.83, "rotation": -97.49 }, - { "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 93.92 }, - { "name": "left lower leg", "parent": "left upper leg", "length": 49.89, "x": 56.34, "y": 0.98, "rotation": -16.65 }, - { "name": "left shoulder", "parent": "torso", "length": 35.43, "x": 74.04, "y": -20.38, "rotation": -156.96 }, - { "name": "neck", "parent": "torso", "length": 18.38, "x": 81.67, "y": -6.34, "rotation": -1.51 }, - { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 42.99, "y": -0.61, "rotation": -14.34 }, - { "name": "right shoulder", "parent": "torso", "length": 37.24, "x": 76.02, "y": 18.14, "rotation": 133.88 }, - { "name": "head", "parent": "neck", "length": 68.28, "x": 20.93, "y": 11.59, "rotation": -13.92 }, - { "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 37.85, "y": -2.34, "rotation": 28.16 }, - { "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 58.94, "y": -7.61, "rotation": 102.43 }, - { "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 37.6, "y": 0.31, "rotation": 36.32 }, - { "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 }, - { "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 }, - { "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }, - { "name": "spear1", "parent": "left hand", "length": 65.06, "x": 0.48, "y": 17.03, "rotation": 102.43 }, - { "name": "spear2", "parent": "spear1", "length": 61.41, "x": 65.05, "y": 0.04, "rotation": 0.9 }, - { "name": "spear3", "parent": "spear2", "length": 76.79, "x": 61.88, "y": 0.57, "rotation": -0.9 } + { "name": "right shoulder", "parent": "torso", "length": 37.24, "rotation": 133.88, "x": 76.02, "y": 18.14 }, + { "name": "right arm", "parent": "right shoulder", "length": 36.74, "rotation": 36.32, "x": 37.6, "y": 0.31 }, + { "name": "right upper leg", "parent": "hip", "length": 42.45, "rotation": -97.49, "x": -20.07, "y": -6.83 }, + { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "rotation": -14.34, "x": 42.99, "y": -0.61 }, + { "name": "right foot", "parent": "right lower leg", "length": 45.45, "rotation": 110.3, "x": 64.88, "y": 0.04 }, + { "name": "right hand", "parent": "right arm", "length": 15.32, "rotation": 2.35, "x": 36.9, "y": 0.34 }, + { "name": "spear1", "parent": "left hand", "length": 65.06, "rotation": 102.43, "x": 0.48, "y": 17.03 }, + { "name": "spear2", "parent": "spear1", "length": 61.41, "rotation": 0.9, "x": 65.05, "y": 0.04 }, + { "name": "spear3", "parent": "spear2", "length": 76.79, "rotation": -0.9, "x": 61.88, "y": 0.57 } ], "slots": [ { "name": "left shoulder", "bone": "left shoulder", "attachment": "left shoulder" }, @@ -52,12 +53,12 @@ "left hand item": { "dagger": { "x": 7.88, "y": -23.45, "rotation": 10.47, "width": 26, "height": 108 }, "spear": { - "type": "skinnedmesh", + "type": "mesh", "uvs": [ 1, 0.11236, 0.77096, 0.13278, 0.76608, 0.21781, 0.75642, 0.386, 0.74723, 0.54607, 0.72117, 1, 0.28838, 1, 0.24208, 0.54327, 0.22589, 0.38361, 0.2089, 0.21605, 0.20043, 0.13242, 0, 0.11519, 0.4527, 0, 0.58399, 0 ], "triangles": [ 4, 7, 3, 6, 7, 4, 5, 6, 4, 10, 11, 12, 1, 13, 0, 12, 13, 1, 10, 12, 1, 9, 10, 1, 2, 9, 1, 8, 9, 2, 3, 8, 2, 7, 8, 3 ], - "vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.51, 20, -0.31, -6.16, 0.48, 2, 18, 64.73, -5.03, 0.5, 19, -0.4, -5.06, 0.49, 1, 16, 4.56, 23.91, 1, 1, 16, 41.7, -138.95, 1, 1, 16, 32.42, -141.1, 1, 1, 16, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.5, 19, 0.53, 6.59, 0.49, 2, 19, 62.18, 6.66, 0.51, 20, 0.2, 6.09, 0.48, 1, 20, 30.96, 6.61, 1, 1, 20, 37.26, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ], - "edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ], + "vertices": [ 1, 20, 38.54, -10.88, 1, 1, 20, 30.97, -5.93, 1, 2, 19, 61.48, -5.58, 0.5116, 20, -0.31, -6.16, 0.48839, 2, 18, 64.73, -5.03, 0.50272, 19, -0.4, -5.06, 0.49728, 1, 10, 4.56, 23.91, 1, 1, 10, 41.7, -138.95, 1, 1, 10, 32.41999, -141.1, 1, 1, 10, -6.49, 22.4, 1, 2, 18, 65.48, 6.64, 0.50272, 19, 0.52999, 6.59, 0.49728, 2, 19, 62.18, 6.66, 0.5116, 20, 0.2, 6.09, 0.48839, 1, 20, 30.96, 6.61, 1, 1, 20, 37.25999, 11.09, 1, 1, 20, 79.75, 1.59, 1, 1, 20, 79.78, -1.29, 1 ], "hull": 14, + "edges": [ 24, 22, 22, 20, 10, 12, 2, 0, 24, 26, 0, 26, 8, 10, 12, 14, 6, 8, 14, 16, 2, 4, 4, 6, 16, 18, 18, 20, 20, 2 ], "width": 22, "height": 368 } @@ -66,10 +67,10 @@ "dagger": { "type": "mesh", "uvs": [ 0.78091, 0.38453, 1, 0.38405, 1, 0.44881, 0.73953, 0.4687, 0.74641, 0.81344, 0.34022, 1, 0.15434, 1, 0.11303, 0.78858, 0.23007, 0.47367, 0, 0.45047, 0, 0.38621, 0.22367, 0.38573, 0.24384, 0, 1, 0 ], - "triangles": [ 5, 7, 8, 4, 8, 3, 4, 5, 8, 5, 6, 7, 9, 11, 8, 8, 11, 3, 3, 0, 2, 3, 11, 0, 9, 10, 11, 0, 1, 2, 11, 12, 0, 0, 12, 13 ], + "triangles": [ 0, 12, 13, 11, 12, 0, 0, 1, 2, 9, 10, 11, 3, 11, 0, 3, 0, 2, 8, 11, 3, 9, 11, 8, 5, 6, 7, 4, 5, 8, 4, 8, 3, 5, 7, 8 ], "vertices": [ 15.49, -12.82, 21.13, -13.57, 20.16, -20.49, 13.15, -21.67, 8.13, -58.56, -5.13, -77.04, -9.92, -76.36, -7.79, -53.6, -0.03, -20.36, -5.6, -17.04, -4.63, -10.17, 1.12, -10.93, 7.46, 30.24, 26.93, 27.49 ], - "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], "hull": 14, + "edges": [ 22, 20, 24, 26, 22, 24, 2, 0, 0, 22, 0, 26, 12, 14, 14, 16, 18, 20, 16, 18, 2, 4, 4, 6, 6, 8, 10, 12, 8, 10 ], "width": 26, "height": 108 } @@ -88,9 +89,9 @@ "type": "mesh", "uvs": [ 0, 0.60494, 0.14172, 0.5145, 0.24218, 0.55229, 0.32667, 0.67806, 0.37969, 0.79352, 0.53505, 0.93014, 0.86056, 1, 0.94071, 0.94169, 0.92098, 0.69923, 0.9888, 0.65497, 0.99003, 0.51643, 0.89632, 0.43561, 0.94487, 0.41916, 1, 0.39713, 1, 0.2836, 0.94017, 0.27027, 0.87906, 0.25666, 0.80754, 0.16044, 0.66698, 0.01997, 0.4734, 0.01805, 0.29215, 0.19893, 0.25392, 0.31823, 0.09117, 0.324, 0, 0.44331, 0.43271, 0.69153, 0.466, 0.47794, 0.35996, 0.31246, 0.73473, 0.68593, 0.72215, 0.57425, 0.88179, 0.5583, 0.80267, 0.51015 ], "triangles": [ 5, 27, 6, 7, 27, 8, 7, 6, 27, 4, 24, 5, 5, 24, 27, 4, 3, 24, 27, 29, 8, 8, 29, 9, 24, 28, 27, 24, 25, 28, 24, 3, 25, 29, 28, 30, 29, 27, 28, 25, 2, 26, 25, 3, 2, 9, 29, 10, 0, 23, 1, 28, 25, 30, 29, 11, 10, 29, 30, 11, 2, 21, 26, 2, 1, 21, 23, 22, 1, 1, 22, 21, 30, 16, 11, 30, 17, 16, 30, 25, 17, 17, 26, 18, 18, 26, 19, 26, 17, 25, 11, 15, 12, 11, 16, 15, 12, 15, 13, 15, 14, 13, 21, 20, 26, 26, 20, 19 ], - "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.46, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.6, 23.41, 35.89, 40.17, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.8, -24.31, 17.2, -40.65, 20.68, -33.02 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], + "vertices": [ 14.56, 50.42, 23.12, 35.47, 17.45999, 26.36, 11.57, 16.86, 3.74, 11.71, -5.89, -3.91, -11.83, -37.23, -8.31, -45.63, 7.75, -44.24, 10.39, -51.33, 19.52, -51.82, 25.21, -43.15, 26.12, -47.43, 27.35, -53.16, 34.84, -53.46, 35.96, -47.33, 37.11, -41.08, 43.75, -33.97, 53.58, -19.87, 54.5, 0.03, 43.31, 19.16, 35.59999, 23.41, 35.89, 40.16999, 28.39, 49.87, 10.25, 5.99, 24.2, 2, 35.55, 12.48, 9.39, -25.1, 16.79999, -24.31, 17.2, -40.65, 20.68, -33.02 ], "hull": 24, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 26, 28, 32, 34, 34, 36, 36, 38, 38, 40, 40, 42, 42, 44, 44, 46, 0, 46, 6, 48, 48, 50, 50, 52, 52, 42, 2, 4, 4, 6, 4, 52, 2, 44, 22, 32, 22, 24, 24, 26, 28, 30, 30, 32, 24, 30, 16, 54, 54, 56, 20, 58, 58, 54, 16, 58, 22, 60, 60, 56, 58, 60 ], "width": 103, "height": 66 } @@ -101,9 +102,9 @@ "type": "mesh", "uvs": [ 0.68992, 0.29284, 1, 0.46364, 1, 0.74643, 0.84089, 1, 0.66344, 1, 0.33765, 0.64284, 0, 0.44124, 0, 0, 0.34295, 0 ], "triangles": [ 3, 4, 2, 4, 5, 2, 5, 0, 2, 0, 1, 2, 0, 5, 8, 5, 6, 8, 6, 7, 8 ], - "vertices": [ 18.6, 8.81, 32.19, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], + "vertices": [ 18.6, 8.81, 32.18999, 10.31, 38.02, 1.62, 38.08, -9.63, 32.31, -13.49, 14.37, -9.62, -0.75, -10.78, -9.84, 2.77, 1.29, 10.25 ], "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 6, 4, 6, 8, 8, 10, 12, 14, 10, 12 ], "width": 37, "height": 35 } @@ -113,10 +114,10 @@ "name": "goblin/left-foot", "type": "mesh", "uvs": [ 0.15733, 0.31873, 0.08195, 0.78502, 0.15884, 0.99366, 0.41633, 0.96804, 0.68822, 0.97636, 1, 0.96388, 0.99385, 0.73501, 0.85294, 0.51862, 0.61479, 0.31056, 0.46991, 0, 0.48032, 0.75604, 0.75994, 0.77706 ], - "triangles": [ 2, 1, 3, 3, 10, 4, 4, 11, 5, 4, 10, 11, 3, 1, 10, 11, 6, 5, 1, 0, 10, 11, 7, 6, 11, 10, 7, 10, 8, 7, 10, 0, 8, 0, 9, 8 ], + "triangles": [ 0, 9, 8, 10, 0, 8, 10, 8, 7, 11, 10, 7, 11, 7, 6, 1, 0, 10, 11, 6, 5, 3, 1, 10, 4, 10, 11, 4, 11, 5, 3, 10, 4, 2, 1, 3 ], "vertices": [ 2.28, 13.07, -1.76, -1.64, 3.59, -7.8, 20.25, -6.04, 37.91, -5.27, 58.12, -3.71, 57.31, 3.34, 47.78, 9.51, 31.95, 15.05, 21.99, 24.11, 24.03, 0.75, 42.21, 1.16 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 6, 20, 20, 16, 2, 20, 8, 22, 22, 14, 20, 22, 22, 10 ], "width": 65, "height": 31 } @@ -126,10 +127,10 @@ "name": "goblin/left-hand", "type": "mesh", "uvs": [ 0.518, 0.12578, 1, 0.16285, 0.99788, 0.50578, 0.69745, 1, 0.37445, 1, 0, 0.80051, 0, 0.42792, 0.17601, 0, 0.43567, 0 ], - "triangles": [ 2, 3, 0, 4, 5, 0, 3, 4, 0, 0, 7, 8, 6, 7, 0, 0, 5, 6, 2, 0, 1 ], - "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.48, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], - "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], + "triangles": [ 2, 0, 1, 0, 5, 6, 6, 7, 0, 0, 7, 8, 3, 4, 0, 4, 5, 0, 2, 3, 0 ], + "vertices": [ -3.11, 15.42, 10.83, 22.27, 15.5, 14.55, 18.35, -8.96, 9.47999, -14.32, -4.58, -14.3, -11.63, -2.63, -14.89, 13.68, -7.75, 17.99 ], "hull": 9, + "edges": [ 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 14, 16, 12, 14 ], "width": 36, "height": 41 } @@ -139,10 +140,10 @@ "name": "goblin/left-lower-leg", "type": "mesh", "uvs": [ 0.95508, 0.20749, 0.81927, 0.65213, 0.94754, 0.77308, 0.67842, 0.97346, 0.46463, 1, 0.26845, 1, 0.04963, 0.90706, 0.2106, 0.60115, 0.07478, 0.40195, 0.18545, 0, 0.28857, 0 ], - "triangles": [ 1, 3, 4, 7, 4, 5, 5, 6, 7, 3, 1, 2, 1, 4, 7, 0, 1, 10, 7, 8, 10, 1, 7, 10, 10, 8, 9 ], - "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.19, -18.29 ], - "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], + "triangles": [ 10, 8, 9, 1, 7, 10, 7, 8, 10, 0, 1, 10, 1, 4, 7, 3, 1, 2, 5, 6, 7, 7, 4, 5, 1, 3, 4 ], + "vertices": [ -0.19, 6.82, 30.97, 10.96, 37.97, 17.33, 53.88, 12.6, 57.58, 6.31, 59.34, 0.08, 55.04, -8.63, 32.99, -9.33, 20.79, -17.43, -7.27, -21.56, -8.18999, -18.29 ], "hull": 11, + "edges": [ 20, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 18, 20, 16, 18 ], "width": 33, "height": 70 } @@ -153,9 +154,9 @@ "type": "mesh", "uvs": [ 0.7377, 0.40692, 1, 0.75237, 1, 1, 0.62046, 1, 0.26184, 0.56601, 0, 0.29783, 0, 0, 0.44115, 0 ], "triangles": [ 3, 1, 2, 3, 0, 1, 3, 4, 0, 4, 7, 0, 4, 5, 7, 5, 6, 7 ], - "vertices": [ 15.18, 5.74, 32.17, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.74, -4.66, 6.54 ], - "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], + "vertices": [ 15.18, 5.74, 32.16999, 5.32, 41.79, 0.21, 36.63, -9.5, 14.88, -9.72, 0.9, -10.89, -10.66, -4.73999, -4.66, 6.54 ], "hull": 8, + "edges": [ 12, 14, 14, 0, 4, 2, 0, 2, 4, 6, 6, 8, 10, 12, 8, 10 ], "width": 29, "height": 44 } @@ -165,10 +166,10 @@ "name": "goblin/left-upper-leg", "type": "mesh", "uvs": [ 1, 0.12167, 1, 0.54873, 0.91067, 0.78907, 0.76567, 1, 0.3087, 0.9579, 0, 0.68777, 0, 0.219, 0.51961, 0, 0.87552, 0 ], - "triangles": [ 3, 4, 2, 2, 4, 1, 1, 4, 7, 4, 5, 7, 0, 1, 7, 5, 6, 7, 7, 8, 0 ], + "triangles": [ 7, 8, 0, 5, 6, 7, 0, 1, 7, 4, 5, 7, 1, 4, 7, 2, 4, 1, 3, 4, 2 ], "vertices": [ 2.33, 13.06, 33.5, 12.57, 51, 9.34, 66.32, 4.31, 63, -10.71, 43.13, -20.58, 8.91, -20.04, -6.79, -2.64, -6.61, 9.1 ], - "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], "hull": 9, + "edges": [ 10, 8, 8, 6, 6, 4, 4, 2, 10, 12, 12, 14, 14, 16, 2, 0, 16, 0 ], "width": 33, "height": 73 } @@ -179,9 +180,9 @@ "type": "mesh", "uvs": [ 0.81967, 0.27365, 0.92101, 0.82048, 0.47134, 1, 0.15679, 0.9354, 0, 0.7556, 0.19268, 0.51833, 0.15468, 0.35706, 0, 0.21989, 0.13568, 0, 0.68878, 0, 0.70145, 0.53872 ], "triangles": [ 3, 5, 2, 2, 10, 1, 2, 5, 10, 3, 4, 5, 10, 0, 1, 0, 10, 6, 10, 5, 6, 7, 8, 6, 6, 9, 0, 6, 8, 9 ], - "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.05, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], - "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], + "vertices": [ 18.62, -11.65, -3.98, -13.85, -10.28, 2.76, -6.91, 13.89, 0.8, 19.04999, 10.06, 11.51, 16.74, 12.45, 22.71, 17.64, 31.4, 12.19, 30.12, -7.67, 8.05, -6.71 ], "hull": 10, + "edges": [ 14, 12, 12, 10, 10, 8, 8, 6, 6, 4, 4, 2, 2, 20, 20, 0, 0, 18, 16, 18, 14, 16, 0, 2 ], "width": 36, "height": 41 } @@ -191,10 +192,10 @@ "name": "goblin/pelvis", "type": "mesh", "uvs": [ 1, 1, 0, 1, 0, 0, 1, 0 ], - "triangles": [ 1, 3, 0, 1, 2, 3 ], + "triangles": [ 1, 2, 3, 1, 3, 0 ], "vertices": [ 25.38, -20.73, -36.61, -20.73, -36.61, 22.26, 25.38, 22.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], "hull": 4, + "edges": [ 0, 2, 2, 4, 4, 6, 0, 6 ], "width": 62, "height": 43 } @@ -205,9 +206,9 @@ "type": "mesh", "uvs": [ 1, 0.09223, 1, 0.8501, 0.72058, 1, 0.24384, 1, 0, 0.86558, 0.20822, 0.10919, 0.50903, 0, 0.85342, 0 ], "triangles": [ 1, 2, 6, 6, 2, 5, 1, 6, 0, 4, 5, 3, 2, 3, 5, 6, 7, 0 ], - "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.18 ], - "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], + "vertices": [ -4.75, 8.89, 33.03, 11.74, 40.99, 5.89, 41.81, -5.03, 35.53, -11.13, -2.53, -9.2, -8.5, -2.71, -9.09, 5.17999 ], "hull": 8, + "edges": [ 8, 6, 4, 6, 4, 2, 12, 14, 2, 0, 14, 0, 10, 12, 8, 10 ], "width": 23, "height": 50 } @@ -217,10 +218,10 @@ "name": "goblin/right-foot", "type": "mesh", "uvs": [ 0.40851, 0.0047, 0.59087, 0.33404, 0.75959, 0.48311, 0.88907, 0.59751, 0.97532, 0.89391, 0.90385, 1, 0.6722, 1, 0.38633, 1, 0.08074, 1, 0, 0.88921, 0, 0.65984, 0, 0.46577, 0.0906, 0.0988, 0.305, 0, 0.47461, 0.71257, 0.715, 0.74681 ], - "triangles": [ 4, 5, 15, 7, 14, 6, 5, 6, 15, 6, 14, 15, 14, 7, 9, 7, 8, 9, 15, 3, 4, 9, 10, 14, 15, 2, 3, 15, 14, 2, 14, 10, 1, 12, 1, 11, 1, 12, 13, 14, 1, 2, 1, 13, 0, 1, 10, 11 ], + "triangles": [ 1, 10, 11, 1, 13, 0, 14, 1, 2, 1, 12, 13, 12, 1, 11, 14, 10, 1, 15, 14, 2, 15, 2, 3, 9, 10, 14, 15, 3, 4, 7, 8, 9, 14, 7, 9, 6, 14, 15, 5, 6, 15, 7, 14, 6, 4, 5, 15 ], "vertices": [ 17.36, 25.99, 29.13, 15.44, 39.89, 10.8, 48.14, 7.24, 53.84, -2.38, 49.43, -6, 34.84, -6.39, 16.84, -6.87, -2.4, -7.38, -7.58, -3.86, -7.78, 3.7, -7.95, 10.1, -2.57, 22.36, 10.84, 25.97, 22.14, 2.75, 37.31, 2.03 ], - "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], "hull": 14, + "edges": [ 0, 2, 6, 8, 8, 10, 16, 18, 22, 24, 24, 26, 0, 26, 10, 12, 2, 4, 4, 6, 12, 14, 14, 16, 18, 20, 20, 22, 2, 28, 28, 14, 20, 28, 4, 30, 30, 12, 28, 30, 30, 8 ], "width": 63, "height": 33 } @@ -230,10 +231,10 @@ "name": "goblin/right-hand", "type": "mesh", "uvs": [ 0.17957, 0, 0, 0.44772, 0, 0.79734, 0.20057, 0.94264, 0.55057, 1, 0.8539, 1, 0.89823, 0.82004, 0.8259, 0.74285, 0.84223, 0.49993, 0.96356, 0.34102, 0.66023, 0 ], - "triangles": [ 4, 7, 5, 5, 7, 6, 4, 3, 7, 3, 2, 8, 7, 3, 8, 8, 1, 10, 8, 2, 1, 0, 10, 1, 8, 10, 9 ], - "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.88, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], + "triangles": [ 8, 10, 9, 0, 10, 1, 8, 2, 1, 8, 1, 10, 7, 3, 8, 3, 2, 8, 4, 3, 7, 5, 7, 6, 4, 7, 5 ], + "vertices": [ -10.82, -9.45, 5.95, -15.34, 18.87999, -14.9, 24, -7.5, 25.69, 5.16, 25.31, 16.07, 18.61, 17.44, 15.84, 14.74, 6.84, 15.02, 0.81, 19.18, -11.41, 7.83 ], "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 0, 20 ], "width": 36, "height": 37 } @@ -243,10 +244,10 @@ "name": "goblin/right-hand", "type": "mesh", "uvs": [ 0.88538, 0.22262, 0.76167, 0.3594, 0.75088, 0.78308, 0.95326, 0.84981, 1, 0.60302 ], - "triangles": [ 3, 2, 4, 2, 1, 4, 1, 0, 4 ], + "triangles": [ 1, 0, 4, 2, 1, 4, 3, 2, 4 ], "vertices": [ -2.82, 15.97, 2.4, 11.71, 18.08, 11.9, 20.27, 19.27, 11.09, 20.62 ], - "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], "hull": 5, + "edges": [ 2, 4, 4, 6, 6, 8, 2, 0, 0, 8 ], "width": 36, "height": 37 } @@ -256,10 +257,10 @@ "name": "goblin/right-lower-leg", "type": "mesh", "uvs": [ 1, 0.27261, 0.81312, 0.52592, 0.79587, 0.71795, 0.95544, 0.80988, 0.85193, 0.95493, 0.47241, 1, 0.14033, 1, 0, 0.8773, 0.14896, 0.67914, 0.1619, 0.30325, 0.60611, 0 ], - "triangles": [ 4, 5, 2, 2, 5, 8, 5, 6, 8, 6, 7, 8, 4, 2, 3, 2, 8, 1, 8, 9, 1, 9, 10, 1, 1, 10, 0 ], - "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.1, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.77, -1.03, 58.99, -9.19, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], + "triangles": [ 1, 10, 0, 9, 10, 1, 8, 9, 1, 2, 8, 1, 4, 2, 3, 6, 7, 8, 5, 6, 8, 2, 5, 8, 4, 5, 2 ], + "vertices": [ 6.26, 8.46, 23.32, 8.04, 37.09999, 12.89, 41.45, 20.82, 53.07, 21.46, 61.33, 10.06, 65.76999, -1.03, 58.99, -9.18999, 43.02, -9.81, 16.33, -20, -12.79, -9.26 ], "hull": 11, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 20, 18, 20 ], "width": 36, "height": 76 } @@ -271,8 +272,8 @@ "uvs": [ 0.62008, 0.03708, 0.92131, 0.09048, 1, 0.38319, 0.72049, 0.6937, 0.31656, 1, 0, 1, 0, 0.75106, 0.28233, 0.49988 ], "triangles": [ 4, 6, 7, 4, 7, 3, 4, 5, 6, 7, 0, 3, 2, 0, 1, 2, 3, 0 ], "vertices": [ -3.17, -11.05, -9, -0.57, -1.01, 10.33, 16.69, 11.17, 37.41, 8.2, 45.45, -1.16, 36.95, -8.46, 21.2, -7.47 ], - "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], "hull": 8, + "edges": [ 10, 12, 12, 14, 14, 0, 0, 2, 2, 4, 4, 6, 8, 10, 6, 8 ], "width": 39, "height": 45 } @@ -282,10 +283,10 @@ "name": "goblin/right-upper-leg", "type": "mesh", "uvs": [ 0.27018, 0, 0.11618, 0.18177, 0, 0.70688, 0, 0.89577, 0.26668, 1, 0.48718, 1, 0.67618, 0.83532, 1, 0.5161, 1, 0.25543, 0.74618, 0.0571 ], - "triangles": [ 5, 4, 6, 6, 4, 2, 4, 3, 2, 2, 1, 6, 6, 1, 9, 6, 9, 7, 9, 1, 0, 9, 8, 7 ], - "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.51, 10.18, 19.13, 18.47, 2.85, 16.32, -8.4, 6.14 ], - "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], + "triangles": [ 9, 8, 7, 9, 1, 0, 6, 9, 7, 6, 1, 9, 2, 1, 6, 4, 3, 2, 6, 4, 2, 5, 4, 6 ], + "vertices": [ -9.85, -10.37, 2.17, -14.07, 35.49, -13.66, 47.29, -12.11, 52.61, -2.26, 51.63, 5.16, 40.50999, 10.18, 19.12999, 18.46999, 2.85, 16.32, -8.39999, 6.14 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18 ], "width": 34, "height": 63 } @@ -296,9 +297,9 @@ "type": "mesh", "uvs": [ 0, 0.33287, 0.15945, 0.46488, 0.15761, 0.60314, 0.15502, 0.79806, 0.32807, 0.93478, 0.6875, 1, 0.80731, 1, 1, 0.77763, 1, 0.66147, 1, 0.56703, 0.93207, 0.4771, 0.86944, 0.39416, 0.83837, 0.226, 0.68085, 0, 0.14836, 0, 0, 0.07199, 0.78734, 0.86249, 0.43679, 0.79649, 0.76738, 0.61733, 0.44345, 0.58747, 0.54329, 0.38316, 0.77692, 0.73446, 0.66478, 0.51012 ], "triangles": [ 5, 16, 6, 6, 16, 7, 4, 17, 5, 5, 17, 16, 4, 3, 17, 17, 21, 16, 16, 21, 7, 3, 2, 17, 21, 19, 18, 21, 17, 19, 17, 2, 19, 21, 8, 7, 21, 18, 8, 18, 9, 8, 19, 22, 18, 18, 10, 9, 18, 22, 10, 2, 1, 19, 19, 20, 22, 19, 1, 20, 22, 11, 10, 22, 20, 11, 20, 1, 14, 20, 12, 11, 1, 0, 14, 20, 13, 12, 20, 14, 13, 0, 15, 14 ], - "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.88, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], - "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], + "vertices": [ 56.93, 27.95, 43.37, 18.23, 30.16, 19.5, 11.53, 21.28, -2.55, 10.69, -10.89, -13.12, -11.59, -21.23, 8.54, -36.12, 19.65, -37.08, 28.68, -37.86, 37.68, -34, 45.98, -30.44, 56.4, -29.07, 84.78, -20.92, 87.9, 15.15, 81.87999, 25.79, 1.67, -21.01, 10.03, 2.18, 25.23, -18.25, 29.98, 0, 48.54, -8.39, 13.98, -21.36, 35.9, -15.6 ], "hull": 16, + "edges": [ 0, 2, 6, 8, 8, 10, 10, 12, 12, 14, 22, 24, 24, 26, 26, 28, 28, 30, 0, 30, 14, 32, 32, 34, 34, 6, 18, 36, 36, 38, 2, 4, 4, 6, 38, 4, 2, 40, 40, 22, 40, 38, 38, 34, 32, 10, 34, 8, 40, 28, 14, 16, 16, 18, 32, 42, 42, 36, 16, 42, 42, 34, 18, 20, 20, 22, 36, 44, 44, 40, 20, 44 ], "width": 68, "height": 96 } @@ -308,10 +309,10 @@ "name": "goblin/undie-straps", "type": "mesh", "uvs": [ 0.36097, 0.44959, 0.66297, 0.60591, 1, 0.19486, 1, 0.57117, 0.75897, 1, 0.38697, 1, 0, 0.26433, 0, 0, 0.12497, 0 ], - "triangles": [ 5, 1, 4, 4, 1, 3, 6, 0, 5, 5, 0, 1, 3, 1, 2, 6, 8, 0, 6, 7, 8 ], - "vertices": [ -10.56, 12.87, 6.53, 9.9, 25.62, 17.71, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], - "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], + "triangles": [ 6, 7, 8, 6, 8, 0, 3, 1, 2, 5, 0, 1, 6, 0, 5, 4, 1, 3, 5, 1, 4 ], + "vertices": [ -10.56, 12.87, 6.53, 9.89999, 25.62, 17.70999, 25.62, 10.56, 11.97, 2.41, -9.09, 2.41, -31, 16.39, -31, 21.41, -23.92, 21.41 ], "hull": 9, + "edges": [ 14, 16, 16, 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 12, 14, 10, 12, 0, 10, 2, 8 ], "width": 55, "height": 19 } @@ -321,10 +322,10 @@ "name": "goblin/undies", "type": "mesh", "uvs": [ 0, 0.32029, 0.14893, 0.59457, 0.22437, 1, 0.35909, 1, 0.50998, 1, 0.79559, 0.58453, 0.9842, 0.28015, 1, 0.00588, 0.46957, 0.17646, 0, 0.03933, 0.48843, 0.59122, 0.48114, 0.43099 ], - "triangles": [ 3, 10, 4, 4, 10, 5, 10, 3, 1, 3, 2, 1, 1, 11, 10, 1, 0, 11, 10, 11, 5, 5, 11, 6, 0, 8, 11, 11, 8, 6, 0, 9, 8, 6, 8, 7 ], - "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.59, 22.22, 6.11, 22.92, 14.05, 3.75, 9.44, -13.08, 13.71, 4.21, -2.59, 4.03, 2.05 ], - "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], + "triangles": [ 6, 8, 7, 0, 9, 8, 11, 8, 6, 0, 8, 11, 5, 11, 6, 10, 11, 5, 1, 0, 11, 1, 11, 10, 3, 2, 1, 10, 3, 1, 4, 10, 5, 3, 10, 4 ], + "vertices": [ -13.22, 5.56, -8, -2.47, -5.49, -14.27, -0.64, -14.36, 4.78, -14.45, 15.27, -2.58999, 22.22, 6.11, 22.92, 14.05, 3.75, 9.43999, -13.08, 13.71, 4.21, -2.58999, 4.03, 2.05 ], "hull": 10, + "edges": [ 0, 2, 2, 4, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 0, 18, 4, 6, 6, 8, 6, 20, 16, 22, 22, 20, 0, 22, 22, 12, 2, 20, 20, 10 ], "width": 36, "height": 29 } @@ -757,26 +758,31 @@ ] } }, - "ffd": { + "deform": { "default": { + "left hand item": { + "spear": [ + { "time": 0 } + ] + }, "right hand item": { "dagger": [ { "time": 0, "offset": 26, - "vertices": [ 2.34, 0.14 ], + "vertices": [ 2.34754, 0.14469 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.5, "offset": 8, - "vertices": [ -1.19, 4.31, 0.07, 6.41, 1.66, 6.18, 1.75, 3.59 ], + "vertices": [ -1.19415, 4.31531, 0.07279, 6.41351, 1.66048, 6.18882, 1.75232, 3.59555 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1, "offset": 26, - "vertices": [ 2.34, 0.14 ] + "vertices": [ 2.34754, 0.14469 ] } ] } @@ -790,22 +796,22 @@ }, { "time": 0.2, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08, -1.08, 0.08, -1.08, 0.08, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08, 0.08 ], + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391, -1.08534, 0.08391, -1.08534, 0.08391, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.08534, 0.08391 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.3666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09, 1.47, 0.09, 1.47, 0.09, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47, 0.09 ], + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017, 1.47305, 0.09017, 1.47305, 0.09017, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47305, 0.09017 ], "curve": [ 0.621, 0, 0.75, 1 ] }, { "time": 0.7, - "vertices": [ -10.97, -6.68, -4.68, -2.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17, -1.17, -0.17, -1.17, -0.17, 0, 0, -2.22, 2.66, -4.83, 2.7, -5.7, -0.51, -3.15, -1.61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64, 0.81, -11.82, -1.34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.17, -0.17 ], + "vertices": [ -10.97826, -6.68962, -4.68015, -2.46175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183, -1.1755, -0.17182, -1.1755, -0.17183, 0, 0, -2.22324, 2.66465, -4.83295, 2.70084, -5.70553, -0.51941, -3.15962, -1.61501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.64741, 0.81612, -11.82285, -1.34955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1755, -0.17183 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 0.8666, - "vertices": [ 10.69, 4.05, 3.66, 1.85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08, 0.38, 0.08, 0.38, 0.08, 0, 0, 2.69, -0.22, 3.77, 0.11, 3.68, 1.55, 2.49, 1.65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.45, -3.91, 9.19, -1.66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38, 0.08 ], + "vertices": [ 10.69275, 4.05949, 3.66373, 1.85426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446, 0.38687, 0.08446, 0.38687, 0.08446, 0, 0, 2.69652, -0.22738, 3.77135, 0.11417, 3.6893, 1.55352, 2.49594, 1.65501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.4588, -3.9113, 9.19593, -1.66854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.38687, 0.08446 ], "curve": [ 0.25, 0, 0.75, 1 ] }, { "time": 1 } @@ -816,35 +822,35 @@ { "time": 0, "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] }, { "time": 0.1333 }, { "time": 0.2333, "offset": 8, - "vertices": [ -3.96, -2.34, -5.8, -12.47, -2.23, -12.99, 2.02, -9.1, 0, 0, 0, 0, 0, 0, -1.35, -5.28 ] + "vertices": [ -3.96072, -2.34594, -5.80445, -12.47629, -2.23129, -12.99037, 2.02941, -9.1036, 0, 0, 0, 0, 0, 0, -1.35254, -5.2883 ] }, { "time": 0.3666, "offset": 8, - "vertices": [ 0.66, 0.33, 0.33, 2.69, -0.48, 2.54, -1.13, 1.38, 0, 0, 0, 0, 0, 0, -0.11, 0.79 ] + "vertices": [ 0.66504, 0.33548, 0.33902, 2.69014, -0.4817, 2.54524, -1.13592, 1.38562, 0, 0, 0, 0, 0, 0, -0.11907, 0.79273 ] }, { "time": 0.5, "curve": "stepped" }, { "time": 0.6333 }, { "time": 0.7333, "offset": 8, - "vertices": [ -2.97, 9.4, -6.91, 19.92, -10.55, 18.41, -12.37, 12.38, -4.72, 6.3, 0, 0, -1.48, 4.88, -7.06, 10.7 ] + "vertices": [ -2.97737, 9.40254, -6.91661, 19.92794, -10.55287, 18.41085, -12.37161, 12.38473, -4.72606, 6.30798, 0, 0, -1.48902, 4.88944, -7.06773, 10.70101 ] }, { "time": 0.8333, "offset": 6, - "vertices": [ 1.05, 1.56, -2.52, 7.99, -5.52, 17.14, -8.93, 15.79, -10.73, 10.22, -4.23, 5.36, 0, 0, 0, 0, -5.83, 8.55 ] + "vertices": [ 1.05318, 1.56361, -2.52722, 7.9974, -5.5203, 17.14136, -8.93317, 15.79635, -10.73747, 10.22055, -4.23801, 5.36992, 0, 0, 0, 0, -5.83147, 8.55531 ] }, { "time": 1, "offset": 8, - "vertices": [ 3.69, 2.37, -7.16, 18.79, -12.78, 14.77, -12.75, 6.5, -3.13, 1.98, -0.44, 0.36, 0, 0, -3.8, 2.98 ] + "vertices": [ 3.69298, 2.37572, -7.16969, 18.79732, -12.78161, 14.7778, -12.75775, 6.50514, -3.13475, 1.98906, -0.44401, 0.36629, 0, 0, -3.80085, 2.98474 ] } ] }, @@ -854,22 +860,22 @@ { "time": 0.1333, "offset": 6, - "vertices": [ -0.68, -4.13 ] + "vertices": [ -0.68989, -4.13283 ] }, { "time": 0.3333, "offset": 6, - "vertices": [ -1.04, -3.1 ] + "vertices": [ -1.04945, -3.10476 ] }, { "time": 0.7, "offset": 6, - "vertices": [ -1.42, -6.3 ] + "vertices": [ -1.4245, -6.30616 ] }, { "time": 0.8666, "offset": 6, - "vertices": [ -1.13, -1.79 ] + "vertices": [ -1.13541, -1.79035 ] }, { "time": 1 } ] @@ -880,38 +886,38 @@ { "time": 0.1333, "offset": 2, - "vertices": [ -2.81, 2.63, -2.35, 3.89, -1.99, 4.86, -0.93, 5.57, -0.48, 5.09, -0.34, 3.42, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31, 1.91, -1.32, 3.65 ] + "vertices": [ -2.81258, 2.63114, -2.35238, 3.89441, -1.99921, 4.8639, -0.93273, 5.57982, -0.48886, 5.09854, -0.34812, 3.42912, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.31305, 1.91371, -1.32986, 3.65703 ] }, { "time": 0.2333, "offset": 2, - "vertices": [ -6.39, 6.41, -7.74, 8.27, -7.02, 11.35, -4.03, 13.93, -2.5, 12.62, -1.46, 7.58, -0.17, 1.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84, 2.61, -4.53, 7.92 ] + "vertices": [ -6.39088, 6.41245, -7.74575, 8.27191, -7.02471, 11.35894, -4.0347, 13.93454, -2.50399, 12.62962, -1.46124, 7.58915, -0.17445, 1.36898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.84765, 2.61215, -4.53955, 7.92357 ] }, { "time": 0.3, "offset": 2, - "vertices": [ -8.27, 6.68, -9.29, 10.13, -8.62, 14.71, -4.58, 18.81, -2.2, 17.1, -0.07, 9.9, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94, 2.38, -4.59, 10.01 ] + "vertices": [ -8.27184, 6.68821, -9.29764, 10.13797, -8.62231, 14.71339, -4.58629, 18.81939, -2.20304, 17.10709, -0.07794, 9.9046, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.94624, 2.38007, -4.59398, 10.01888 ] }, { "time": 0.3666, "offset": 2, - "vertices": [ -10.47, 9.44, -13.36, 12.4, -14.32, 16.94, -9.24, 23.55, -5.51, 21.51, -1.19, 11.53, 2.54, 1.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14, 2.29, -6.63, 11.37 ] + "vertices": [ -10.47683, 9.44175, -13.36882, 12.40982, -14.32568, 16.94392, -9.24462, 23.55674, -5.51711, 21.51377, -1.19581, 11.53192, 2.54451, 1.01642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14847, 2.29389, -6.63418, 11.37127 ] }, { "time": 0.5, "offset": 2, - "vertices": [ -5.42, 4.36, -10.59, 7.04, -11.64, 11.55, -6.19, 20.12, -1.45, 18.05, 4.86, 6.41, 2.81, 0.27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96, 4.94 ] + "vertices": [ -5.42473, 4.36854, -10.59004, 7.04468, -11.64251, 11.55845, -6.19665, 20.12805, -1.45497, 18.05411, 4.86619, 6.41678, 2.81462, 0.27601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.96412, 4.94829 ] }, { "time": 0.6333 }, { "time": 0.7333, "offset": 4, - "vertices": [ 1.31, -6.84, -0.87, -12.54, -5.98, -14.08, -7.15, -11.63, -5.67, -4.83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06, -6.93 ] + "vertices": [ 1.31462, -6.84099, -0.87905, -12.54479, -5.9851, -14.08367, -7.15892, -11.63193, -5.6792, -4.83544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.06163, -6.93844 ] }, { "time": 0.8, "offset": 4, - "vertices": [ 0.65, -3.42, -0.43, -6.27, -2.99, -7.04, -3.57, -5.81, -2.83, -2.41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79, -1.28, 0, 0, 0, 0, -1.03, -3.46 ] + "vertices": [ 0.65731, -3.42049, -0.43952, -6.27239, -2.99255, -7.04183, -3.57946, -5.81596, -2.83959, -2.41772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.79687, -1.2802, 0, 0, 0, 0, -1.03081, -3.46922 ] }, { "time": 0.8666 } ] @@ -921,13 +927,13 @@ { "time": 0, "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] }, { "time": 0.5 }, { "time": 1, "offset": 4, - "vertices": [ -1.48, 0.34, 0, 0, 1.31, 0.08, 1.6, 0.09, 0.13, 0.15, 0, 0, 0, 0, -0.72, -0.04 ] + "vertices": [ -1.48416, 0.34736, 0, 0, 1.31152, 0.08085, 1.60295, 0.09881, 0.13673, 0.1547, 0, 0, 0, 0, -0.72862, -0.0449 ] } ] }, @@ -937,7 +943,7 @@ { "time": 0.6, "offset": 6, - "vertices": [ 1.8, -1.56 ] + "vertices": [ 1.80396, -1.56552 ] }, { "time": 1 } ] @@ -946,17 +952,17 @@ "right upper leg": [ { "time": 0, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] }, { "time": 0.3333 }, { "time": 0.8666, "offset": 14, - "vertices": [ 0.13, -2.35, -1.33, -5.99, -1.35, -4.43 ] + "vertices": [ 0.13424, -2.35377, -1.33317, -5.99572, -1.35861, -4.43323 ] }, { "time": 1, - "vertices": [ -6.03, -1.46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34, -1.93, -1.86, -5.05, -2.5, -3.09 ] + "vertices": [ -6.03856, -1.46324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.34684, -1.93101, -1.86047, -5.05265, -2.5014, -3.09984 ] } ] }, @@ -965,37 +971,37 @@ { "time": 0, "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] }, { "time": 0.1333, "offset": 14, - "vertices": [ 1.31, -0.59, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] + "vertices": [ 1.31318, -0.59727, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] }, { "time": 0.3, "offset": 14, - "vertices": [ 6.03, -3.13, 7.55, -1.38, 6.79, 0.31, 4.23, 1.14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07, -5.16, 0, 0, 4, 0.27, 0, 0, 0, 0, 3.43, -3.52 ] + "vertices": [ 6.03761, -3.13561, 7.55475, -1.38111, 6.79747, 0.31171, 4.23503, 1.14012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.07575, -5.16824, 0, 0, 4.0041, 0.27245, 0, 0, 0, 0, 3.4376, -3.52286 ] }, { "time": 0.5, "offset": 14, - "vertices": [ 2.25, -0.87, 2.57, -0.56, 3.17, -0.57, 1.48, 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22, -4.43, 0, 0, 1.48, 0.01, 0, 0, 0, 0, 0.31, -3.28, -1.53, 0.17 ] + "vertices": [ 2.25942, -0.87202, 2.575, -0.56861, 3.17112, -0.57003, 1.48704, 0.9924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.22451, -4.43862, 0, 0, 1.48691, 0.01586, 0, 0, 0, 0, 0.31388, -3.28095, -1.53797, 0.17803 ] }, { "time": 0.6333, "offset": 14, - "vertices": [ 0.75, -1.51, -0.97, -1.62, 0.74, -0.61, -1.44, 1.97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65, -3.95, 0, 0, -1.46, -0.31, 0, 0, 0, 0, -3.31, -3.55, -2.56, 0.29 ] + "vertices": [ 0.75002, -1.51701, -0.97944, -1.62934, 0.74861, -0.6123, -1.44598, 1.97515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65701, -3.95221, 0, 0, -1.46987, -0.31373, 0, 0, 0, 0, -3.31756, -3.5535, -2.56329, 0.29673 ] }, { "time": 0.8666, "offset": 14, - "vertices": [ 0.62, -1.26, 0.38, -2.2, 3.25, -0.5, 2.41, 2.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.66, -3.1, 0, 0, 2.3, -1.15, 0, 0, 0, 0, -0.07, -3.63, -0.93, 0.1 ] + "vertices": [ 0.62202, -1.26262, 0.38489, -2.20701, 3.25048, -0.50042, 2.41108, 2.39315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6639, -3.10099, 0, 0, 2.30655, -1.15196, 0, 0, 0, 0, -0.07676, -3.63497, -0.9321, 0.1079 ] }, { "time": 1, "offset": 14, - "vertices": [ -1.48, -0.24, -2.72, -2.15, -0.51, -3.39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.09, -2.61, 0, 0, 0.57, -1.24, 0, 0, 0, 0, -2.11, -3.29 ] + "vertices": [ -1.48952, -0.24021, -2.72312, -2.15489, -0.51183, -3.39752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0964, -2.61458, 0, 0, 0.57686, -1.24874, 0, 0, 0, 0, -2.11251, -3.29932 ] } ] }, @@ -1004,32 +1010,32 @@ { "time": 0, "offset": 2, - "vertices": [ -1.77, 0.54, -0.96, -1.03, -0.39, -0.24, -1.77, 0.54 ] + "vertices": [ -1.77696, 0.54759, -0.96145, -1.03793, -0.39148, -0.24071, -1.77696, 0.54759 ] }, { "time": 0.1333, "offset": 2, - "vertices": [ -2.25, -1.03, -1.49, -4.23, -0.74, -2.84, -1.9, 0.54 ] + "vertices": [ -2.25683, -1.03177, -1.49719, -4.23861, -0.74469, -2.84906, -1.90072, 0.54477 ] }, { "time": 0.3333, "offset": 2, - "vertices": [ -2.37, -0.05, -0.49, 0.19, -0.9, 1.16, -1.6, 2.7, 0.96, 0.8 ] + "vertices": [ -2.37974, -0.05431, -0.49433, 0.19436, -0.90861, 1.16519, -1.60956, 2.70798, 0.96186, 0.80615 ] }, { "time": 0.7, "offset": 2, - "vertices": [ -0.91, -2.76, -0.62, -3.63, -0.84, -2.26, -2.56, 0.52 ] + "vertices": [ -0.91714, -2.76567, -0.62214, -3.63489, -0.8494, -2.26772, -2.56076, 0.5297 ] }, { "time": 0.8666, "offset": 2, - "vertices": [ -2.56, 0.52, -1.58, 0.32, -1.38, 0.32, -2.56, 0.52 ] + "vertices": [ -2.56076, 0.5297, -1.58064, 0.32031, -1.3847, 0.32476, -2.56076, 0.5297 ] }, { "time": 1, "offset": 2, - "vertices": [ -1.77, 0.54, -0.8, 0.53, -0.8, 0.53, -1.77, 0.54 ] + "vertices": [ -1.77696, 0.54759, -0.80128, 0.53413, -0.80128, 0.53413, -1.77696, 0.54759 ] } ] }, @@ -1037,35 +1043,35 @@ "undies": [ { "time": 0, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] }, { "time": 0.1333, - "vertices": [ 0.72, 0.43, 7.2, -0.16, 1.37, 0, 1.37, 0, 1.37, 0, 1.25, 0.04, -0.99, -2.95, -1.37, -3.07, 1.37, 0, 0.35, -0.29, 2.99, -0.07, 3.9, -0.14 ] + "vertices": [ 0.72659, 0.43319, 7.20416, -0.1638, 1.37759, 0, 1.37759, 0, 1.37759, 0, 1.25279, 0.0464, -0.99861, -2.95085, -1.37542, -3.07404, 1.37759, 0, 0.35279, -0.29279, 2.99218, -0.07019, 3.90478, -0.14039 ] }, { "time": 0.3333, - "vertices": [ 1.16, 0, 2.1, -0.23, 0, 0, 0, 0, 0, 0, 2.24, -0.24, -0.43, 0.6, -1.55, 0.48 ] + "vertices": [ 1.16999, 0, 2.10599, -0.234, 0, 0, 0, 0, 0, 0, 2.24999, -0.24999, -0.4344, 0.60551, -1.55939, 0.48051 ] }, { "time": 0.5333, - "vertices": [ 1.16, 0, -0.23, -0.93, -2.92, 0.35, 0, 0, 0, 0, 0.49, -0.24, -0.64, -2.07, -0.64, -2.07 ] + "vertices": [ 1.16999, 0, -0.234, -0.93599, -2.92499, 0.35099, 0, 0, 0, 0, 0.49999, -0.24999, -0.64078, -2.07914, -0.64078, -2.07914 ] }, { "time": 0.7, - "vertices": [ 1.86, -0.11, 4.66, -0.09, -1.76, 0.21, 0, 0, -0.56, 0.32, -1.13, -1.15, -2.19, -3.47, -1.29, -3.47, 0, 0, 0, 0, 1.58, -0.04, 2.65, 0.16 ] + "vertices": [ 1.8627, -0.11514, 4.66326, -0.09099, -1.76428, 0.21171, 0, 0, -0.56832, 0.32832, -1.13833, -1.1511, -2.19996, -3.47068, -1.29718, -3.47068, 0, 0, 0, 0, 1.58785, -0.04642, 2.65941, 0.16714 ] }, { "time": 0.8333, - "vertices": [ 2.41, -0.2, 8.58, 0.58, -0.83, 0.1, 0, 0, -1.02, 0.59, -2.44, -1.87, -1.62, 0, 0, 0, 0, 0, 0, 0, 2.85, -0.08, 4.78, 0.3 ] + "vertices": [ 2.41687, -0.20725, 8.58108, 0.585, -0.83571, 0.10028, 0, 0, -1.02299, 0.59098, -2.44899, -1.872, -1.62499, 0, 0, 0, 0, 0, 0, 0, 2.85813, -0.08356, 4.78695, 0.30086 ] }, { "time": 0.8666, - "vertices": [ 2.01, -0.02, 8.98, 0.44, -0.2, 0.08, 0.45, 0, -0.35, 0.47, -1.84, -1.44, -0.79, 1.26, 0.53, 1.23, 0.45, 0, 0.11, -0.09, 3.28, -0.09, 5.13, 0.19 ] + "vertices": [ 2.01969, -0.0214, 8.98545, 0.4446, -0.20937, 0.08022, 0.45919, 0, -0.35919, 0.47279, -1.84159, -1.4488, -0.79153, 1.2642, 0.53285, 1.23981, 0.45919, 0, 0.11759, -0.09759, 3.2839, -0.09025, 5.13115, 0.19388 ] }, { "time": 1, - "vertices": [ 0.43, 0.72, 10.6, -0.11, 2.29, 0, 2.29, 0, 2.29, 0, 0.58, 0.24, -2.4, -0.65, -2.27, -0.77, 2.29, 0, 0.58, -0.48, 4.98, -0.11, 6.5, -0.23 ] + "vertices": [ 0.43098, 0.722, 10.60295, -0.11699, 2.29598, 0, 2.29598, 0, 2.29598, 0, 0.58798, 0.24399, -2.40018, -0.65335, -2.2782, -0.77533, 2.29598, 0, 0.58798, -0.48799, 4.98697, -0.11699, 6.50796, -0.23399 ] } ] } diff --git a/spine-xna/example/data/goblins-mesh.png b/spine-xna/example/data/goblins-mesh.png index f172361f2..fc524c564 100644 Binary files a/spine-xna/example/data/goblins-mesh.png and b/spine-xna/example/data/goblins-mesh.png differ diff --git a/spine-xna/example/data/goblins-mesh.skel b/spine-xna/example/data/goblins-mesh.skel new file mode 100644 index 000000000..4a4d2adf4 Binary files /dev/null and b/spine-xna/example/data/goblins-mesh.skel differ diff --git a/spine-xna/example/data/raptor.atlas b/spine-xna/example/data/raptor.atlas index c90da0078..a8a9b2dca 100644 --- a/spine-xna/example/data/raptor.atlas +++ b/spine-xna/example/data/raptor.atlas @@ -1,251 +1,251 @@ raptor.png -size: 1022,1022 +size: 2048,1024 format: RGBA8888 filter: Linear,Linear repeat: none back_arm rotate: false - xy: 410, 545 - size: 46, 29 - orig: 46, 29 + xy: 213, 4 + size: 91, 57 + orig: 91, 57 offset: 0, 0 index: -1 back_bracer rotate: false - xy: 540, 548 - size: 39, 28 - orig: 39, 28 + xy: 306, 6 + size: 77, 55 + orig: 77, 55 offset: 0, 0 index: -1 back_hand rotate: true - xy: 504, 538 - size: 36, 34 - orig: 36, 34 + xy: 1976, 277 + size: 72, 68 + orig: 72, 68 offset: 0, 0 index: -1 back_knee - rotate: false - xy: 299, 478 - size: 49, 67 - orig: 49, 67 + rotate: true + xy: 1320, 55 + size: 97, 134 + orig: 97, 134 offset: 0, 0 index: -1 back_thigh - rotate: true - xy: 140, 247 - size: 39, 24 - orig: 39, 24 + rotate: false + xy: 385, 14 + size: 78, 47 + orig: 78, 47 offset: 0, 0 index: -1 eyes_open - rotate: true - xy: 2, 2 - size: 47, 45 - orig: 47, 45 + rotate: false + xy: 1708, 14 + size: 93, 89 + orig: 93, 89 offset: 0, 0 index: -1 front_arm - rotate: false - xy: 360, 544 - size: 48, 30 - orig: 48, 30 + rotate: true + xy: 1547, 66 + size: 96, 60 + orig: 96, 60 offset: 0, 0 index: -1 front_bracer rotate: false - xy: 538, 578 - size: 41, 29 - orig: 41, 29 + xy: 1960, 440 + size: 81, 58 + orig: 81, 58 offset: 0, 0 index: -1 front_hand rotate: false - xy: 538, 609 - size: 41, 38 - orig: 41, 38 + xy: 1960, 500 + size: 82, 75 + orig: 82, 75 offset: 0, 0 index: -1 front_open_hand rotate: false - xy: 894, 782 - size: 43, 44 - orig: 43, 44 + xy: 1960, 577 + size: 86, 87 + orig: 86, 87 offset: 0, 0 index: -1 front_thigh rotate: false - xy: 942, 849 - size: 57, 29 - orig: 57, 29 + xy: 2, 3 + size: 114, 58 + orig: 114, 58 offset: 0, 0 index: -1 gun - rotate: false - xy: 785, 774 - size: 107, 103 - orig: 107, 103 + rotate: true + xy: 1588, 427 + size: 213, 206 + orig: 213, 206 offset: 0, 0 index: -1 gun_nohand - rotate: false - xy: 614, 703 - size: 105, 102 - orig: 105, 102 + rotate: true + xy: 1623, 215 + size: 210, 203 + orig: 210, 203 offset: 0, 0 index: -1 head - rotate: false - xy: 2, 137 - size: 136, 149 - orig: 136, 149 + rotate: true + xy: 1153, 154 + size: 271, 298 + orig: 271, 298 offset: 0, 0 index: -1 lower_leg - rotate: true - xy: 780, 699 - size: 73, 98 - orig: 73, 98 + rotate: false + xy: 1828, 240 + size: 146, 195 + orig: 146, 195 offset: 0, 0 index: -1 mouth_smile - rotate: true - xy: 49, 2 - size: 47, 30 - orig: 47, 30 + rotate: false + xy: 118, 2 + size: 93, 59 + orig: 93, 59 offset: 0, 0 index: -1 neck - rotate: true - xy: 1001, 860 - size: 18, 21 - orig: 18, 21 + rotate: false + xy: 465, 20 + size: 36, 41 + orig: 36, 41 offset: 0, 0 index: -1 raptor_arm_back rotate: false - xy: 940, 936 - size: 82, 86 - orig: 82, 86 + xy: 1828, 66 + size: 163, 172 + orig: 163, 172 offset: 0, 0 index: -1 raptor_body rotate: false - xy: 2, 737 - size: 610, 285 - orig: 610, 285 + xy: 2, 447 + size: 1219, 570 + orig: 1219, 570 offset: 0, 0 index: -1 raptor_front_arm - rotate: true - xy: 195, 464 - size: 81, 102 - orig: 81, 102 + rotate: false + xy: 1796, 437 + size: 162, 203 + orig: 162, 203 offset: 0, 0 index: -1 raptor_front_leg - rotate: false - xy: 2, 478 - size: 191, 257 - orig: 191, 257 + rotate: true + xy: 2, 63 + size: 382, 514 + orig: 382, 514 offset: 0, 0 index: -1 raptor_hindleg_back rotate: false - xy: 614, 807 - size: 169, 215 - orig: 169, 215 + xy: 1223, 588 + size: 338, 429 + orig: 338, 429 offset: 0, 0 index: -1 raptor_horn rotate: false - xy: 360, 655 - size: 182, 80 - orig: 182, 80 + xy: 1223, 427 + size: 363, 159 + orig: 363, 159 offset: 0, 0 index: -1 raptor_horn_back - rotate: false - xy: 360, 576 - size: 176, 77 - orig: 176, 77 + rotate: true + xy: 1891, 666 + size: 351, 153 + orig: 351, 153 offset: 0, 0 index: -1 raptor_jaw rotate: false - xy: 785, 879 - size: 153, 143 - orig: 153, 143 + xy: 846, 159 + size: 305, 286 + orig: 305, 286 offset: 0, 0 index: -1 raptor_saddle_noshadow rotate: false - xy: 2, 288 - size: 163, 188 - orig: 163, 188 + xy: 518, 70 + size: 326, 375 + orig: 326, 375 offset: 0, 0 index: -1 raptor_saddle_strap_front - rotate: false - xy: 721, 710 - size: 57, 95 - orig: 57, 95 + rotate: true + xy: 846, 43 + size: 114, 189 + orig: 114, 189 offset: 0, 0 index: -1 raptor_saddle_strap_rear - rotate: true - xy: 940, 880 - size: 54, 74 - orig: 54, 74 + rotate: false + xy: 1037, 9 + size: 108, 148 + orig: 108, 148 offset: 0, 0 index: -1 raptor_saddle_w_shadow rotate: false - xy: 195, 547 - size: 163, 188 - orig: 163, 188 + xy: 1563, 642 + size: 326, 375 + orig: 326, 375 offset: 0, 0 index: -1 raptor_tongue - rotate: true - xy: 544, 649 - size: 86, 64 - orig: 86, 64 + rotate: false + xy: 1147, 24 + size: 171, 128 + orig: 171, 128 offset: 0, 0 index: -1 stirrup_back - rotate: false - xy: 458, 539 - size: 44, 35 - orig: 44, 35 + rotate: true + xy: 1976, 351 + size: 87, 69 + orig: 87, 69 offset: 0, 0 index: -1 stirrup_front - rotate: true - xy: 81, 4 - size: 45, 50 - orig: 45, 50 + rotate: false + xy: 1456, 62 + size: 89, 100 + orig: 89, 100 offset: 0, 0 index: -1 stirrup_strap - rotate: true - xy: 894, 828 - size: 49, 46 - orig: 49, 46 + rotate: false + xy: 1609, 12 + size: 97, 91 + orig: 97, 91 offset: 0, 0 index: -1 torso rotate: true - xy: 610, 647 - size: 54, 91 - orig: 54, 91 + xy: 1623, 105 + size: 108, 182 + orig: 108, 182 offset: 0, 0 index: -1 visor - rotate: false - xy: 2, 51 - size: 131, 84 - orig: 131, 84 + rotate: true + xy: 1453, 164 + size: 261, 168 + orig: 261, 168 offset: 0, 0 index: -1 diff --git a/spine-xna/example/data/raptor.png b/spine-xna/example/data/raptor.png index 78aed4d3e..6be9ddf91 100644 Binary files a/spine-xna/example/data/raptor.png and b/spine-xna/example/data/raptor.png differ diff --git a/spine-xna/example/data/raptor.skel b/spine-xna/example/data/raptor.skel index a853b905f..f0274dec9 100644 Binary files a/spine-xna/example/data/raptor.skel and b/spine-xna/example/data/raptor.skel differ diff --git a/spine-xna/example/data/star.atlas b/spine-xna/example/data/star.atlas new file mode 100644 index 000000000..efcb8eb62 --- /dev/null +++ b/spine-xna/example/data/star.atlas @@ -0,0 +1,20 @@ + +star.png +size: 256,128 +format: RGBA8888 +filter: Linear,Linear +repeat: none +star + rotate: false + xy: 127, 52 + size: 76, 72 + orig: 76, 72 + offset: 0, 0 + index: -1 +token + rotate: false + xy: 2, 2 + size: 123, 122 + orig: 123, 122 + offset: 0, 0 + index: -1 diff --git a/spine-xna/example/data/star.json b/spine-xna/example/data/star.json new file mode 100644 index 000000000..d0914e59a --- /dev/null +++ b/spine-xna/example/data/star.json @@ -0,0 +1,23 @@ +{ +"skeleton": { "hash": "mDnmUvhqCvOsFMGQjPtWpEaJxXI", "spine": "3.3.07", "width": 123, "height": 240.92, "images": "./images/" }, +"bones": [ + { "name": "root" } +], +"slots": [ + { "name": "star", "bone": "root", "attachment": "star" }, + { "name": "token", "bone": "root", "attachment": "token" } +], +"skins": { + "default": { + "star": { + "star": { "x": 0.55, "y": 2.59, "width": 76, "height": 72 } + }, + "token": { + "token": { "x": 4.66, "y": 146.51, "width": 123, "height": 122 } + } + } +}, +"animations": { + "animation": {} +} +} \ No newline at end of file diff --git a/spine-xna/example/data/star.png b/spine-xna/example/data/star.png new file mode 100644 index 000000000..aaf3d79b8 Binary files /dev/null and b/spine-xna/example/data/star.png differ diff --git a/spine-xna/example/data/tank.atlas b/spine-xna/example/data/tank.atlas new file mode 100644 index 000000000..ecf24e7df --- /dev/null +++ b/spine-xna/example/data/tank.atlas @@ -0,0 +1,125 @@ + +tank.png +size: 2048,1024 +format: RGBA8888 +filter: Linear,Linear +repeat: none +images/antenna + rotate: true + xy: 1295, 683 + size: 22, 303 + orig: 22, 303 + offset: 0, 0 + index: -1 +images/cannon + rotate: false + xy: 2, 93 + size: 931, 58 + orig: 931, 58 + offset: 0, 0 + index: -1 +images/cannonConnector + rotate: true + xy: 1676, 455 + size: 112, 135 + orig: 112, 135 + offset: 0, 0 + index: -1 +images/guntower + rotate: false + xy: 1295, 707 + size: 730, 289 + orig: 730, 289 + offset: 0, 0 + index: -1 +images/machinegun + rotate: false + xy: 2, 34 + size: 331, 57 + orig: 331, 57 + offset: 0, 0 + index: -1 +images/machinegun-mount + rotate: false + xy: 1952, 609 + size: 72, 96 + orig: 72, 96 + offset: 0, 0 + index: -1 +images/rock + rotate: false + xy: 935, 96 + size: 252, 55 + orig: 252, 55 + offset: 0, 0 + index: -1 +images/tankBottom + rotate: false + xy: 2, 377 + size: 1285, 276 + orig: 1285, 276 + offset: 0, 0 + index: -1 +images/tankBottom-shadow + rotate: false + xy: 2, 655 + size: 1291, 341 + orig: 1291, 341 + offset: 0, 0 + index: -1 +images/tankTop + rotate: false + xy: 2, 153 + size: 1407, 222 + orig: 1407, 222 + offset: 0, 0 + index: -1 +images/tread + rotate: false + xy: 2, 2 + size: 96, 30 + orig: 96, 30 + offset: 0, 0 + index: -1 +images/tread-inside + rotate: false + xy: 335, 63 + size: 25, 28 + orig: 25, 28 + offset: 0, 0 + index: -1 +images/wheel-big + rotate: false + xy: 1295, 490 + size: 191, 191 + orig: 191, 191 + offset: 0, 0 + index: -1 +images/wheel-big-overlay + rotate: false + xy: 1488, 495 + size: 186, 186 + orig: 186, 186 + offset: 0, 0 + index: -1 +images/wheel-mid + rotate: false + xy: 1676, 569 + size: 136, 136 + orig: 136, 136 + offset: 0, 0 + index: -1 +images/wheel-mid-overlay + rotate: false + xy: 1814, 569 + size: 136, 136 + orig: 136, 136 + offset: 0, 0 + index: -1 +images/wheel-small + rotate: false + xy: 1813, 496 + size: 71, 71 + orig: 71, 71 + offset: 0, 0 + index: -1 diff --git a/spine-xna/example/data/tank.json b/spine-xna/example/data/tank.json new file mode 100644 index 000000000..c26ccbe47 --- /dev/null +++ b/spine-xna/example/data/tank.json @@ -0,0 +1,1899 @@ +{ +"skeleton": { "hash": "kgtyty1lpfv5JU2lygtFi2u3oQQ", "spine": "3.3.07", "width": 1914.53, "height": 964.05, "images": "" }, +"bones": [ + { "name": "root" }, + { "name": "tankRoot", "parent": "root", "y": 200 }, + { "name": "tankTreads", "parent": "tankRoot" }, + { "name": "tankBody", "parent": "tankTreads", "y": 10 }, + { "name": "guntower", "parent": "tankBody", "x": -21.72, "y": 245.47 }, + { "name": "antennaRoot", "parent": "guntower", "x": 164.6, "y": 202.52 }, + { "name": "antenna1", "parent": "antennaRoot", "length": 40, "rotation": 90, "y": 39.99, "color": "ffee00ff" }, + { "name": "antenna2", "parent": "antenna1", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna3", "parent": "antenna2", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna4", "parent": "antenna3", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna5", "parent": "antenna4", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "antenna6", "parent": "antenna5", "length": 42, "x": 42, "color": "ffee00ff" }, + { "name": "cannonConnector", "parent": "guntower", "x": -235.04, "y": 96.07 }, + { "name": "cannonTarget", "parent": "tankRoot", "x": -1486.66, "y": 351.82, "color": "ff3f00ff" }, + { "name": "cannon", "parent": "cannonConnector", "length": 946.68, "rotation": 180, "color": "ff4000ff" }, + { "name": "cannonTip", "parent": "cannon", "x": 946.68, "color": "ff4000ff" }, + { "name": "machineGunTarget", "parent": "tankRoot", "x": -1474, "y": 559.42, "color": "ff3f00ff" }, + { + "name": "machinegun-mount", + "parent": "guntower", + "length": 90.97, + "rotation": 90, + "x": -123.72, + "y": 218.32, + "color": "15ff00ff" + }, + { + "name": "machinegun", + "parent": "machinegun-mount", + "length": 208.94, + "rotation": 90, + "x": 91.52, + "y": -1.03, + "color": "15ff00ff" + }, + { "name": "machinegun-tip", "parent": "machinegun", "x": 210.42, "y": -12.2 }, + { "name": "rock", "parent": "root", "x": -656.45 }, + { + "name": "tread", + "parent": "tankRoot", + "length": 82, + "rotation": 180, + "x": -22.89, + "y": 213.85, + "scaleX": 0.993, + "color": "e64344ff" + }, + { "name": "tread2", "parent": "tread", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread3", "parent": "tread2", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread4", "parent": "tread3", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread5", "parent": "tread4", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread6", "parent": "tread5", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread7", "parent": "tread6", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread8", "parent": "tread7", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread9", "parent": "tread8", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread10", "parent": "tread9", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread11", "parent": "tread10", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread12", "parent": "tread11", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread13", "parent": "tread12", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread14", "parent": "tread13", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread15", "parent": "tread14", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread16", "parent": "tread15", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread17", "parent": "tread16", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread18", "parent": "tread17", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread19", "parent": "tread18", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread20", "parent": "tread19", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread21", "parent": "tread20", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread22", "parent": "tread21", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread23", "parent": "tread22", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread24", "parent": "tread23", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread25", "parent": "tread24", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread26", "parent": "tread25", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread27", "parent": "tread26", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread28", "parent": "tread27", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread29", "parent": "tread28", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread30", "parent": "tread29", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread31", "parent": "tread30", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread32", "parent": "tread31", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread33", "parent": "tread32", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread34", "parent": "tread33", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread35", "parent": "tread34", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "tread36", "parent": "tread35", "length": 82, "x": 82, "color": "e64344ff" }, + { "name": "wheel-midCenter", "parent": "tankRoot", "y": -114.56 }, + { "name": "treadCollider1", "parent": "wheel-midCenter", "x": -329.57, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider2", "parent": "wheel-midCenter", "x": -165.95, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider3", "parent": "wheel-midCenter", "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider4", "parent": "wheel-midCenter", "x": 163.56, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadCollider5", "parent": "wheel-midCenter", "x": 329.12, "y": -85.44, "color": "ff00fbff" }, + { "name": "treadGravity1", "parent": "tankRoot", "rotation": 180, "x": -175.35, "y": 109.99, "color": "ff00fbff" }, + { "name": "treadGravity2", "parent": "tankRoot", "rotation": 180, "x": 177.88, "y": 105.45, "color": "ff00fbff" }, + { "name": "wheel-bigRoot1", "parent": "tankTreads", "x": -549.59, "y": 14.39, "color": "abe323ff" }, + { "name": "wheel-big1", "parent": "wheel-bigRoot1", "x": -0.02, "color": "abe323ff" }, + { "name": "wheel-bigRoot2", "parent": "tankTreads", "x": 547.33, "y": 14.39 }, + { "name": "wheel-big2", "parent": "wheel-bigRoot2" }, + { "name": "wheel-midRoot1", "parent": "wheel-midCenter", "x": -410.57, "color": "abe323ff" }, + { "name": "wheel-mid1", "parent": "wheel-midRoot1", "color": "abe323ff" }, + { "name": "wheel-midRoot2", "parent": "wheel-midCenter", "x": -246.95 }, + { "name": "wheel-mid2", "parent": "wheel-midRoot2" }, + { "name": "wheel-midRoot3", "parent": "wheel-midCenter", "x": -82.72 }, + { "name": "wheel-mid3", "parent": "wheel-midRoot3" }, + { "name": "wheel-midRoot4", "parent": "wheel-midCenter", "x": 80.89 }, + { "name": "wheel-mid4", "parent": "wheel-midRoot4" }, + { "name": "wheel-midRoot5", "parent": "wheel-midCenter", "x": 244.51 }, + { "name": "wheel-mid5", "parent": "wheel-midRoot5" }, + { "name": "wheel-midRoot6", "parent": "wheel-midCenter", "x": 408.73 }, + { "name": "wheel-mid6", "parent": "wheel-midRoot6" }, + { "name": "wheel-smallRoot1", "parent": "tankTreads", "x": -337.38, "y": 109.43 }, + { "name": "wheel-small1", "parent": "wheel-smallRoot1", "color": "abe323ff" }, + { "name": "wheel-smallRoot2", "parent": "tankTreads", "x": 0.08, "y": 109.43 }, + { "name": "wheel-small2", "parent": "wheel-smallRoot2" }, + { "name": "wheel-smallRoot3", "parent": "tankTreads", "x": 334.68, "y": 109.43 }, + { "name": "wheel-small3", "parent": "wheel-smallRoot3" } +], +"slots": [ + { "name": "tankBody-shadow", "bone": "tankBody", "color": "ffffffb9", "attachment": "images/tankBottom-shadow" }, + { "name": "bottom", "bone": "tankBody", "attachment": "images/tankBottom" }, + { "name": "tread-inside1", "bone": "tread", "attachment": "images/tread-inside" }, + { "name": "tread-inside53", "bone": "tread27", "attachment": "images/tread-inside" }, + { "name": "tread-inside27", "bone": "tread14", "attachment": "images/tread-inside" }, + { "name": "tread-inside3", "bone": "tread2", "attachment": "images/tread-inside" }, + { "name": "tread-inside55", "bone": "tread28", "attachment": "images/tread-inside" }, + { "name": "tread-inside29", "bone": "tread15", "attachment": "images/tread-inside" }, + { "name": "tread-inside5", "bone": "tread3", "attachment": "images/tread-inside" }, + { "name": "tread-inside57", "bone": "tread29", "attachment": "images/tread-inside" }, + { "name": "tread-inside31", "bone": "tread16", "attachment": "images/tread-inside" }, + { "name": "tread-inside7", "bone": "tread4", "attachment": "images/tread-inside" }, + { "name": "tread-inside59", "bone": "tread30", "attachment": "images/tread-inside" }, + { "name": "tread-inside33", "bone": "tread17", "attachment": "images/tread-inside" }, + { "name": "tread-inside9", "bone": "tread5", "attachment": "images/tread-inside" }, + { "name": "tread-inside61", "bone": "tread31", "attachment": "images/tread-inside" }, + { "name": "tread-inside35", "bone": "tread18", "attachment": "images/tread-inside" }, + { "name": "tread-inside11", "bone": "tread6", "attachment": "images/tread-inside" }, + { "name": "tread-inside63", "bone": "tread32", "attachment": "images/tread-inside" }, + { "name": "tread-inside37", "bone": "tread19", "attachment": "images/tread-inside" }, + { "name": "tread-inside13", "bone": "tread7", "attachment": "images/tread-inside" }, + { "name": "tread-inside65", "bone": "tread33", "attachment": "images/tread-inside" }, + { "name": "tread-inside39", "bone": "tread20", "attachment": "images/tread-inside" }, + { "name": "tread-inside15", "bone": "tread8", "attachment": "images/tread-inside" }, + { "name": "tread-inside67", "bone": "tread34", "attachment": "images/tread-inside" }, + { "name": "tread-inside69", "bone": "tread35", "attachment": "images/tread-inside" }, + { "name": "tread-inside71", "bone": "tread36", "attachment": "images/tread-inside" }, + { "name": "tread-inside41", "bone": "tread21", "attachment": "images/tread-inside" }, + { "name": "tread-inside17", "bone": "tread9", "attachment": "images/tread-inside" }, + { "name": "tread-inside43", "bone": "tread22", "attachment": "images/tread-inside" }, + { "name": "tread-inside19", "bone": "tread10", "attachment": "images/tread-inside" }, + { "name": "tread-inside45", "bone": "tread23", "attachment": "images/tread-inside" }, + { "name": "tread-inside21", "bone": "tread11", "attachment": "images/tread-inside" }, + { "name": "tread-inside47", "bone": "tread24", "attachment": "images/tread-inside" }, + { "name": "tread-inside23", "bone": "tread12", "attachment": "images/tread-inside" }, + { "name": "tread-inside49", "bone": "tread25", "attachment": "images/tread-inside" }, + { "name": "tread-inside25", "bone": "tread13", "attachment": "images/tread-inside" }, + { "name": "tread-inside51", "bone": "tread26", "attachment": "images/tread-inside" }, + { "name": "tread-inside2", "bone": "tread", "attachment": "images/tread-inside" }, + { "name": "tread-inside54", "bone": "tread27", "attachment": "images/tread-inside" }, + { "name": "tread-inside28", "bone": "tread14", "attachment": "images/tread-inside" }, + { "name": "tread-inside4", "bone": "tread2", "attachment": "images/tread-inside" }, + { "name": "tread-inside56", "bone": "tread28", "attachment": "images/tread-inside" }, + { "name": "tread-inside30", "bone": "tread15", "attachment": "images/tread-inside" }, + { "name": "tread-inside6", "bone": "tread3", "attachment": "images/tread-inside" }, + { "name": "tread-inside58", "bone": "tread29", "attachment": "images/tread-inside" }, + { "name": "tread-inside32", "bone": "tread16", "attachment": "images/tread-inside" }, + { "name": "tread-inside8", "bone": "tread4", "attachment": "images/tread-inside" }, + { "name": "tread-inside60", "bone": "tread30", "attachment": "images/tread-inside" }, + { "name": "tread-inside34", "bone": "tread17", "attachment": "images/tread-inside" }, + { "name": "tread-inside10", "bone": "tread5", "attachment": "images/tread-inside" }, + { "name": "tread-inside62", "bone": "tread31", "attachment": "images/tread-inside" }, + { "name": "tread-inside36", "bone": "tread18", "attachment": "images/tread-inside" }, + { "name": "tread-inside12", "bone": "tread6", "attachment": "images/tread-inside" }, + { "name": "tread-inside64", "bone": "tread32", "attachment": "images/tread-inside" }, + { "name": "tread-inside38", "bone": "tread19", "attachment": "images/tread-inside" }, + { "name": "tread-inside14", "bone": "tread7", "attachment": "images/tread-inside" }, + { "name": "tread-inside66", "bone": "tread33", "attachment": "images/tread-inside" }, + { "name": "tread-inside40", "bone": "tread20", "attachment": "images/tread-inside" }, + { "name": "tread-inside16", "bone": "tread8", "attachment": "images/tread-inside" }, + { "name": "tread-inside68", "bone": "tread34", "attachment": "images/tread-inside" }, + { "name": "tread-inside70", "bone": "tread35", "attachment": "images/tread-inside" }, + { "name": "tread-inside72", "bone": "tread36", "attachment": "images/tread-inside" }, + { "name": "tread-inside42", "bone": "tread21", "attachment": "images/tread-inside" }, + { "name": "tread-inside18", "bone": "tread9", "attachment": "images/tread-inside" }, + { "name": "tread-inside44", "bone": "tread22", "attachment": "images/tread-inside" }, + { "name": "tread-inside20", "bone": "tread10", "attachment": "images/tread-inside" }, + { "name": "tread-inside46", "bone": "tread23", "attachment": "images/tread-inside" }, + { "name": "tread-inside22", "bone": "tread11", "attachment": "images/tread-inside" }, + { "name": "tread-inside48", "bone": "tread24", "attachment": "images/tread-inside" }, + { "name": "tread-inside24", "bone": "tread12", "attachment": "images/tread-inside" }, + { "name": "tread-inside50", "bone": "tread25", "attachment": "images/tread-inside" }, + { "name": "tread-inside26", "bone": "tread13", "attachment": "images/tread-inside" }, + { "name": "tread-inside52", "bone": "tread26", "attachment": "images/tread-inside" }, + { "name": "wheel-big", "bone": "wheel-big1", "color": "dbdbdbff", "attachment": "images/wheel-big" }, + { "name": "wheel-big2", "bone": "wheel-big2", "color": "dbdbdbff", "attachment": "images/wheel-big" }, + { "name": "wheel-mid", "bone": "wheel-mid1", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid2", "bone": "wheel-mid2", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid3", "bone": "wheel-mid3", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid4", "bone": "wheel-mid4", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid5", "bone": "wheel-mid5", "attachment": "images/wheel-mid" }, + { "name": "wheel-mid6", "bone": "wheel-mid6", "attachment": "images/wheel-mid" }, + { "name": "wheel-small", "bone": "wheel-small1", "attachment": "images/wheel-small" }, + { "name": "wheel-small2", "bone": "wheel-small2", "attachment": "images/wheel-small" }, + { "name": "wheel-small3", "bone": "wheel-small3", "attachment": "images/wheel-small" }, + { + "name": "wheel-mid-overlay", + "bone": "wheel-midRoot1", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay2", + "bone": "wheel-midRoot2", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay3", + "bone": "wheel-midRoot3", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay4", + "bone": "wheel-midRoot4", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay5", + "bone": "wheel-midRoot5", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-mid-overlay6", + "bone": "wheel-midRoot6", + "color": "ffffffec", + "attachment": "images/wheel-mid-overlay", + "blend": "multiply" + }, + { + "name": "wheel-big-overlay1", + "bone": "wheel-bigRoot1", + "color": "ffffffe9", + "attachment": "images/wheel-big-overlay", + "blend": "multiply" + }, + { + "name": "wheel-big-overlay2", + "bone": "wheel-bigRoot2", + "color": "ffffffe9", + "attachment": "images/wheel-big-overlay", + "blend": "multiply" + }, + { "name": "treads", "bone": "tankRoot", "attachment": "treads" }, + { "name": "tread", "bone": "tread", "color": "c0974fff", "attachment": "images/tread" }, + { "name": "tread27", "bone": "tread27", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread14", "bone": "tread14", "attachment": "images/tread" }, + { "name": "tread2", "bone": "tread2", "attachment": "images/tread" }, + { "name": "tread28", "bone": "tread28", "attachment": "images/tread" }, + { "name": "tread15", "bone": "tread15", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread3", "bone": "tread3", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread29", "bone": "tread29", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread16", "bone": "tread16", "attachment": "images/tread" }, + { "name": "tread4", "bone": "tread4", "attachment": "images/tread" }, + { "name": "tread30", "bone": "tread30", "attachment": "images/tread" }, + { "name": "tread17", "bone": "tread17", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread5", "bone": "tread5", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread31", "bone": "tread31", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread18", "bone": "tread18", "attachment": "images/tread" }, + { "name": "tread6", "bone": "tread6", "attachment": "images/tread" }, + { "name": "tread32", "bone": "tread32", "attachment": "images/tread" }, + { "name": "tread19", "bone": "tread19", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread7", "bone": "tread7", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread33", "bone": "tread33", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread20", "bone": "tread20", "attachment": "images/tread" }, + { "name": "tread8", "bone": "tread8", "attachment": "images/tread" }, + { "name": "tread34", "bone": "tread34", "attachment": "images/tread" }, + { "name": "tread35", "bone": "tread35", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread36", "bone": "tread36", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread21", "bone": "tread21", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread9", "bone": "tread9", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread22", "bone": "tread22", "attachment": "images/tread" }, + { "name": "tread10", "bone": "tread10", "attachment": "images/tread" }, + { "name": "tread23", "bone": "tread23", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread11", "bone": "tread11", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread24", "bone": "tread24", "attachment": "images/tread" }, + { "name": "tread12", "bone": "tread12", "attachment": "images/tread" }, + { "name": "tread25", "bone": "tread25", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread13", "bone": "tread13", "color": "adc9b8ff", "attachment": "images/tread" }, + { "name": "tread26", "bone": "tread26", "attachment": "images/tread" }, + { "name": "rock", "bone": "rock", "attachment": "images/rock" }, + { "name": "machinegun", "bone": "machinegun", "attachment": "images/machinegun" }, + { "name": "machinegun-mount", "bone": "machinegun-mount", "attachment": "images/machinegun-mount" }, + { "name": "tankTop", "bone": "tankBody", "attachment": "images/tankTop" }, + { "name": "guntower", "bone": "guntower", "attachment": "images/guntower" }, + { "name": "cannon", "bone": "cannon", "attachment": "images/cannon" }, + { "name": "cannonConnector", "bone": "cannonConnector", "attachment": "images/cannonConnector" }, + { "name": "antenna", "bone": "antennaRoot", "attachment": "images/antenna" } +], +"ik": [ + { + "name": "cannonTarget", + "bones": [ "cannon" ], + "target": "cannonTarget" + }, + { + "name": "machineGunTarget", + "bones": [ "machinegun" ], + "target": "machineGunTarget", + "mix": 0 + } +], +"transform": [ + { + "name": "wheel-big", + "bones": [ "wheel-big2" ], + "target": "wheel-big1", + "rotation": 65.6, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid1", + "bones": [ "wheel-mid2", "wheel-mid4" ], + "target": "wheel-mid1", + "rotation": 93, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid2", + "bones": [ "wheel-mid3", "wheel-mid5" ], + "target": "wheel-mid1", + "rotation": -89, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-mid3", + "bones": [ "wheel-mid6" ], + "target": "wheel-mid1", + "rotation": -152.6, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-small1", + "bones": [ "wheel-small2" ], + "target": "wheel-small1", + "rotation": 87, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + }, + { + "name": "wheel-small2", + "bones": [ "wheel-small3" ], + "target": "wheel-small1", + "rotation": 54.9, + "translateMix": 0, + "scaleMix": 0, + "shearMix": 0 + } +], +"path": [ + { + "name": "treads", + "bones": [ + "tread", + "tread2", + "tread3", + "tread4", + "tread5", + "tread6", + "tread7", + "tread8", + "tread9", + "tread10", + "tread11", + "tread12", + "tread13", + "tread14", + "tread15", + "tread16", + "tread17", + "tread18", + "tread19", + "tread20", + "tread21", + "tread22", + "tread23", + "tread24", + "tread25", + "tread26", + "tread27", + "tread28", + "tread29", + "tread30", + "tread31", + "tread32", + "tread33", + "tread34", + "tread35", + "tread36" + ], + "target": "treads", + "rotateMode": "chain" + } +], +"skins": { + "default": { + "antenna": { + "images/antenna": { + "type": "mesh", + "uvs": [ 0.64286, 0.07875, 0.65354, 0.15349, 0.66324, 0.22137, 0.67367, 0.29433, 0.68383, 0.36543, 0.69359, 0.43374, 0.7031, 0.50029, 0.71311, 0.5703, 0.72327, 0.64138, 0.73406, 0.71688, 0.7444, 0.78929, 0.75614, 0.8714, 0.76905, 0.9431, 1, 0.9431, 1, 1, 0, 1, 0, 0.9431, 0.20105, 0.9431, 0.20105, 0.87093, 0.21461, 0.78846, 0.22651, 0.71606, 0.23885, 0.64098, 0.25035, 0.57104, 0.26206, 0.49983, 0.27306, 0.4329, 0.2843, 0.36453, 0.29592, 0.29381, 0.308, 0.22037, 0.319, 0.15345, 0.33141, 0.07795, 0.34423, 0, 0.6316, 0 ], + "triangles": [ 30, 31, 0, 29, 30, 0, 29, 0, 1, 28, 29, 1, 28, 1, 2, 27, 28, 2, 27, 2, 3, 26, 3, 4, 25, 26, 4, 25, 4, 5, 26, 27, 3, 24, 5, 6, 23, 24, 6, 7, 23, 6, 24, 25, 5, 22, 7, 8, 21, 22, 8, 21, 8, 9, 7, 22, 23, 20, 9, 10, 19, 20, 10, 20, 21, 9, 19, 10, 11, 18, 19, 11, 17, 18, 11, 17, 11, 12, 15, 16, 17, 12, 13, 14, 15, 17, 12, 14, 15, 12 ], + "vertices": [ 2, 10, 65.37999, -3.14, 0.3125, 11, 23.38, -3.14, 0.6875, 3, 9, 84.73, -3.37, 0.0625, 10, 42.73, -3.37, 0.625, 11, 0.73, -3.37, 0.3125, 3, 9, 64.16, -3.59, 0.3125, 10, 22.16, -3.59, 0.625, 11, -19.83, -3.59, 0.0625, 3, 8, 84.06, -3.82, 0.0625, 9, 42.06, -3.82, 0.625, 10, 0.06, -3.82, 0.3125, 3, 8, 62.51, -4.04, 0.3125, 9, 20.51, -4.04, 0.625, 10, -21.48, -4.04, 0.0625, 3, 7, 83.81, -4.25, 0.0625, 8, 41.81, -4.25, 0.625, 9, -0.18, -4.25, 0.3125, 3, 7, 63.65, -4.46, 0.3125, 8, 21.65, -4.46, 0.625, 9, -20.34, -4.46, 0.0625, 3, 6, 84.43, -4.67999, 0.0625, 7, 42.43, -4.67999, 0.625, 8, 0.43, -4.67999, 0.3125, 3, 6, 62.9, -4.91, 0.3125, 7, 20.9, -4.91, 0.625, 8, -21.09, -4.91, 0.0625, 3, 5, 5.14, 80.01999, 0.0625, 6, 40.02, -5.14, 0.625, 7, -1.97, -5.14, 0.3125, 3, 5, 5.37, 58.08, 0.375, 6, 18.08, -5.37, 0.5625, 7, -23.91, -5.37, 0.0625, 1, 5, 5.63, 33.2, 1, 1, 5, 5.91, 11.48, 1, 1, 5, 11, 11.48, 1, 1, 5, 10.99, -5.75, 1, 1, 5, -11, -5.75, 1, 1, 5, -10.99, 11.48, 1, 1, 5, -6.57, 11.48, 1, 1, 5, -6.57, 33.34, 1, 3, 5, -6.27, 58.33, 0.375, 6, 18.33, 6.27, 0.5625, 7, -23.66, 6.27, 0.0625, 3, 5, -6.01, 80.26999, 0.0625, 6, 40.27, 6.01, 0.625, 7, -1.72, 6.01, 0.3125, 3, 6, 63.02, 5.74, 0.3125, 7, 21.02, 5.74, 0.625, 8, -20.96999, 5.74, 0.0625, 3, 6, 84.21, 5.49, 0.0625, 7, 42.21, 5.49, 0.625, 8, 0.21, 5.49, 0.3125, 3, 7, 63.79, 5.23, 0.3125, 8, 21.79, 5.23, 0.625, 9, -20.2, 5.23, 0.0625, 3, 7, 84.07, 4.98999, 0.0625, 8, 42.07, 4.98999, 0.625, 9, 0.07, 4.98999, 0.3125, 3, 8, 62.78, 4.73999, 0.3125, 9, 20.78, 4.73999, 0.625, 10, -21.21, 4.73999, 0.0625, 3, 8, 84.21, 4.48, 0.0625, 9, 42.21, 4.48, 0.625, 10, 0.21, 4.48, 0.3125, 3, 9, 64.46, 4.21999, 0.3125, 10, 22.46, 4.21999, 0.625, 11, -19.53, 4.21999, 0.0625, 3, 9, 84.74, 3.98, 0.0625, 10, 42.74, 3.98, 0.625, 11, 0.74, 3.98, 0.3125, 2, 10, 65.62, 3.7, 0.3125, 11, 23.62, 3.7, 0.6875, 1, 11, 47.24, 3.42, 1, 1, 11, 47.24, -2.89, 1 ], + "hull": 32, + "edges": [ 28, 30, 28, 26, 30, 32, 26, 24, 24, 22, 32, 34, 34, 24, 34, 36, 36, 22, 60, 62, 38, 36, 20, 22, 38, 20, 40, 38, 18, 20, 40, 18, 42, 40, 16, 18, 42, 16, 44, 42, 14, 16, 44, 14, 46, 44, 12, 14, 46, 12, 48, 46, 10, 12, 48, 10, 50, 48, 8, 10, 50, 8, 52, 50, 6, 8, 52, 6, 54, 52, 4, 6, 54, 4, 56, 54, 2, 4, 56, 2, 60, 58, 58, 56, 62, 0, 0, 2, 58, 0 ], + "width": 22, + "height": 303 + } + }, + "bottom": { + "images/tankBottom": { "x": -16.66, "y": 9.89, "width": 1285, "height": 276 } + }, + "cannon": { + "images/cannon": { "x": 481.95, "y": -0.02, "rotation": 179.99, "width": 931, "height": 58 } + }, + "cannonConnector": { + "images/cannonConnector": { + "type": "mesh", + "uvs": [ 1, 0.03236, 1, 0.10602, 0.90987, 0.32859, 0.81975, 0.55116, 0.72962, 0.77372, 0.6395, 0.99629, 0.42157, 0.99629, 0.20364, 0.99629, 0, 0.85433, 0, 0.69901, 0.02267, 0.52884, 0, 0.31444, 0.21601, 0.12998, 0.43367, 0, 0.63546, 0.0037, 0.48407, 0.77059, 0.31496, 0.52496, 0.64132, 0.19648, 0.21516, 0.76765, 0.58345, 0.5647, 0.68444, 0.40146, 0.46758, 0.36649, 0.28934, 0.34603 ], + "triangles": [ 21, 22, 12, 11, 12, 22, 17, 21, 13, 17, 13, 14, 21, 12, 13, 21, 17, 20, 16, 22, 21, 10, 11, 22, 10, 22, 16, 19, 21, 20, 16, 21, 19, 18, 10, 16, 9, 10, 18, 15, 16, 19, 18, 16, 15, 8, 9, 18, 7, 8, 18, 6, 18, 15, 7, 18, 6, 14, 0, 1, 17, 14, 1, 2, 17, 1, 20, 17, 2, 3, 20, 2, 19, 20, 3, 4, 19, 3, 15, 19, 4, 5, 15, 4, 6, 15, 5 ], + "vertices": [ 1, 12, 35.91, 69.08, 1, 1, 12, 35.91, 59.13, 1, 1, 12, 25.81, 29.09, 1, 1, 12, 15.72, -0.95, 1, 1, 12, 5.63, -31, 1, 1, 12, -4.46, -61.04, 1, 2, 12, -28.87, -61.04, 0.33333, 14, 28.87, 61.03, 0.66666, 1, 14, 53.27, 61.01, 1, 1, 14, 76.08, 41.83, 1, 1, 14, 71.17, 21.62, 1, 1, 14, 72.83, -1.62, 1, 1, 14, 70.37, -29.12, 1, 1, 14, 50.66, -56.13, 1, 2, 12, -28.43, 74.37, 0.41, 14, 28.43, -74.39, 0.58999, 2, 12, -4.91, 72.94999, 0.52, 14, 4.91, -72.94999, 0.48, 2, 12, -21.87, -30.57, 0.49, 14, 21.87, 30.56, 0.51, 1, 14, 40.81, -2.59999, 1, 2, 12, -4.25, 46.92, 0.49, 14, 4.25, -46.92, 0.51, 1, 14, 51.98, 30.15, 1, 2, 12, -10.74, -2.78, 0.49, 14, 10.74, 2.77, 0.51, 2, 12, 0.56, 19.25, 0.49, 14, -0.56, -19.25, 0.51, 1, 14, 23.71, -23.98, 1, 1, 14, 43.68, -26.76, 1 ], + "hull": 15, + "edges": [ 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28, 0 ], + "width": 112, + "height": 135 + } + }, + "guntower": { + "images/guntower": { "x": 77.22, "y": 122.58, "width": 730, "height": 289 } + }, + "machinegun": { + "images/machinegun": { "x": 44.85, "y": -5.72, "rotation": -180, "width": 331, "height": 57 } + }, + "machinegun-mount": { + "images/machinegun-mount": { "x": 47.42, "y": -1.53, "rotation": -90, "width": 72, "height": 96 } + }, + "rock": { + "images/rock": { "color": "404040ff", "x": 25.23, "y": 27.35, "width": 252, "height": 55 } + }, + "tankBody-shadow": { + "images/tankBottom-shadow": { "x": -11.43, "y": -42.88, "width": 1291, "height": 341 } + }, + "tankTop": { + "images/tankTop": { "x": 6.8, "y": 168.71, "width": 1407, "height": 222 } + }, + "tread": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread-inside1": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside10": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside11": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside12": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside13": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside14": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside15": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside16": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside17": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside18": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside19": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside2": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside20": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside21": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside22": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside23": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside24": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside25": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside26": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside27": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside28": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside29": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside3": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside30": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside31": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside32": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside33": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside34": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside35": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside36": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside37": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside38": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside39": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside4": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside40": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside41": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside42": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside43": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside44": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside45": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside46": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside47": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside48": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside49": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside5": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside50": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside51": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside52": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside53": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside54": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside55": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside56": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside57": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside58": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside59": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside6": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside60": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside61": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside62": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside63": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside64": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside65": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside66": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside67": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside68": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside69": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside7": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside70": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside71": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside72": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside8": { + "images/tread-inside": { "x": 20.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread-inside9": { + "images/tread-inside": { "x": 60.1, "y": 12.56, "rotation": -180, "width": 25, "height": 28 } + }, + "tread10": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread11": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread12": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread13": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread14": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread15": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread16": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread17": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread18": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread19": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread2": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread20": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread21": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread22": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread23": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread24": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread25": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread26": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread27": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread28": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread29": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread3": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread30": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread31": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread32": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread33": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread34": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread35": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread36": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread4": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread5": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread6": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread7": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread8": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "tread9": { + "images/tread": { "x": 45.47, "y": -8.28, "rotation": -179.99, "width": 96, "height": 30 } + }, + "treads": { + "treads": { + "type": "path", + "closed": true, + "lengths": [ 182.41, 349, 472.77, 602.99, 780.46, 1052.96, 1133.44, 1218.43, 1298.34, 1382.7, 1465.57, 1546.11, 1628.02, 1707.73, 1794.36, 1876.75, 2158.69, 2321.34, 2438.56, 2579.42, 2745.35, 2919.23 ], + "vertexCount": 66, + "vertices": [ 1, 83, 11.23, 41.86, 1, 1, 83, 0.78, 41.93999, 1, 1, 83, -34.72, 42.23, 1, 1, 63, -104.21, 0.41, 1, 1, 63, 0.07, 0.55, 1, 1, 63, 68.8, 0.64, 1, 1, 81, 20.5, 43.47, 1, 1, 81, 1.13, 40.81, 1, 1, 81, -27.38, 36.84, 1, 1, 65, 147.06, 105, 1, 1, 65, 96.21, 96.63, 1, 1, 65, 43.87, 87.71, 1, 1, 65, 16.18, 103.34, 1, 1, 65, -33.66999, 94.2, 1, 1, 65, -99.35, 81.25, 1, 1, 65, -122.04, -1.69, 1, 1, 65, -83.58, -47.92, 1, 1, 65, -33.53, -109.36, 1, 1, 69, -83.56, -66.08999, 1, 1, 69, -2.16, -67.89, 1, 2, 69, 56.68, -41.48, 0.67999, 58, -24.31, -41.49, 0.32, 1, 58, -26.58, 16.69, 1, 1, 58, -2.69, 16.69, 1, 1, 58, 13.51, 16.69, 1, 2, 71, -52.41, -46.51, 0.74399, 58, 30.2, -46.51, 0.256, 1, 71, -0.32, -68.92, 1, 2, 71, 52.09, -44.72, 0.712, 59, -28.9, -44.73, 0.28799, 1, 59, -22.8, 16.24, 1, 1, 59, -1.42, 16.24, 1, 1, 59, 20.46999, 16.24, 1, 2, 73, -47.21, -47.45, 0.744, 59, 36.00999, -47.46, 0.25599, 1, 73, -0.28, -69.65, 1, 2, 73, 45.23, -47.26, 0.736, 60, -37.48, -47.26, 0.26399, 1, 60, -23.76, 15.27, 1, 1, 60, -0.13, 15.27, 1, 1, 60, 24.45, 15.27, 1, 2, 75, -47.36, -48.7, 0.74399, 60, 33.52, -48.7, 0.256, 1, 75, -0.49, -70.39, 1, 2, 75, 49.09, -48.33, 0.744, 61, -33.57, -48.34, 0.25599, 1, 61, -20.89, 15.83, 1, 1, 61, -1.25, 15.83, 1, 1, 61, 15.78, 15.83, 1, 2, 77, -52.49, -48.21, 0.75999, 61, 28.45, -48.21, 0.24, 1, 77, -2.5, -68.92, 1, 2, 77, 55.72, -47.82, 0.752, 62, -28.88, -47.82, 0.248, 1, 62, -21.64, 16.69, 1, 1, 62, -0.48, 16.69, 1, 1, 62, 20.73, 16.69, 1, 2, 79, -53.65, -48.89, 0.76, 62, 25.96, -48.89, 0.23999, 1, 79, 2.27, -69.65, 1, 1, 79, 44.94, -69.74, 1, 1, 65, 1172.98, -85.6, 1, 1, 65, 1190.53, -42.24, 1, 1, 65, 1215.63, 19.75, 1, 1, 65, 1175.55, 76.62, 1, 1, 65, 1134.22, 95.07, 1, 1, 65, 1128.4, 97.66, 1, 1, 65, 1081.79, 87.47, 1, 1, 65, 1017.16, 92.52, 1, 1, 65, 977.9, 95.58, 1, 1, 85, 47.07, 42.29, 1, 1, 85, 0.24, 42.74, 1, 1, 85, -29.63, 43.28, 1, 1, 64, -86.64, 1.35, 1, 1, 64, 0.49, 0.25, 1, 1, 64, 92.42, -0.89, 1 ] + } + }, + "wheel-big": { + "images/wheel-big": { "width": 191, "height": 191 } + }, + "wheel-big-overlay1": { + "images/wheel-big-overlay": { "width": 186, "height": 186 } + }, + "wheel-big-overlay2": { + "images/wheel-big-overlay": { "width": 186, "height": 186 } + }, + "wheel-big2": { + "images/wheel-big": { "width": 191, "height": 191 } + }, + "wheel-mid": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay2": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay3": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay4": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay5": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid-overlay6": { + "images/wheel-mid-overlay": { "width": 136, "height": 136 } + }, + "wheel-mid2": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid3": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid4": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid5": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-mid6": { + "images/wheel-mid": { "width": 136, "height": 136 } + }, + "wheel-small": { + "images/wheel-small": { "width": 71, "height": 71 } + }, + "wheel-small2": { + "images/wheel-small": { "width": 71, "height": 71 } + }, + "wheel-small3": { + "images/wheel-small": { "width": 71, "height": 71 } + } + } +}, +"animations": { + "drive": { + "bones": { + "tankRoot": { + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0.549, 0, 0.907, 0.84 ] + }, + { + "time": 3.0333, + "x": -1426.14, + "y": 0, + "curve": [ 0.211, 0.23, 0.851, 0.92 ] + }, + { + "time": 4.8666, + "x": -2806.98, + "y": 0, + "curve": [ 0.253, 0.27, 0.625, 0.94 ] + }, + { "time": 5.3333, "x": -2903.34, "y": 0 } + ] + }, + "wheel-midRoot1": { + "translate": [ + { "time": 0.7666, "x": 0, "y": 0 }, + { + "time": 1.1666, + "x": 0, + "y": 50.95, + "curve": [ 0.633, 0, 0.907, 0.82 ] + }, + { "time": 1.5666, "x": 0, "y": 0 } + ] + }, + "treadCollider1": { + "rotate": [ + { "time": 1.1, "angle": 0 }, + { "time": 1.2333, "angle": -19.78 }, + { "time": 1.4666, "angle": 0 }, + { "time": 1.6, "angle": 28.87 }, + { "time": 1.8, "angle": 0 } + ], + "translate": [ + { "time": 1.1, "x": 0, "y": 0 }, + { + "time": 1.4666, + "x": 0, + "y": 58.66, + "curve": [ 0.352, 0, 0.828, 0.92 ] + }, + { "time": 1.8, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot2": { + "translate": [ + { "time": 1.2666, "x": 0, "y": 0 }, + { + "time": 1.6333, + "x": 0, + "y": 55.07, + "curve": [ 0.889, 0.01, 0.843, 0.81 ] + }, + { "time": 1.9333, "x": 0, "y": 0 } + ] + }, + "treadCollider2": { + "rotate": [ + { "time": 1.5333, "angle": 0 }, + { "time": 1.6333, "angle": -18.67 }, + { "time": 1.8, "angle": 0 }, + { "time": 1.9, "angle": 29.49 }, + { "time": 2.0666, "angle": 0 } + ], + "translate": [ + { + "time": 1.5333, + "x": 0, + "y": 0, + "curve": [ 0.16, 0.25, 0.813, 0.82 ] + }, + { + "time": 1.8, + "x": 0, + "y": 59.03, + "curve": [ 0.376, 0.26, 0.879, 0.79 ] + }, + { "time": 2.0666, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot3": { + "translate": [ + { "time": 1.6666, "x": 0, "y": 0 }, + { + "time": 1.9333, + "x": 0, + "y": 60.17, + "curve": [ 0.544, 0, 0.838, 0.77 ] + }, + { "time": 2.2, "x": 0, "y": 0 } + ] + }, + "treadCollider3": { + "rotate": [ + { "time": 1.8666, "angle": 0 }, + { "time": 1.9333, "angle": -20.16 }, + { "time": 2.0666, "angle": 0.57 }, + { "time": 2.1666, "angle": 33.66 }, + { "time": 2.3333, "angle": 0 } + ], + "translate": [ + { "time": 1.8666, "x": 0, "y": 0 }, + { + "time": 2.0666, + "x": 0, + "y": 61.53, + "curve": [ 0.582, 0, 0.836, 0.77 ] + }, + { "time": 2.3333, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot4": { + "translate": [ + { "time": 1.9333, "x": 0, "y": 0 }, + { + "time": 2.2, + "x": 0, + "y": 58.89, + "curve": [ 0.48, 0, 0.75, 1 ] + }, + { "time": 2.4666, "x": 0, "y": 0 } + ] + }, + "treadCollider4": { + "rotate": [ + { "time": 2.1333, "angle": 0 }, + { "time": 2.2, "angle": -20.43 }, + { "time": 2.3333, "angle": 4.49 }, + { "time": 2.4333, "angle": 35.87 }, + { "time": 2.5666, "angle": 0 } + ], + "translate": [ + { + "time": 2.1333, + "x": 0, + "y": 0, + "curve": [ 0.191, 0.49, 0.75, 1 ] + }, + { "time": 2.3333, "x": 0, "y": 66.64 }, + { "time": 2.5666, "x": 0, "y": 0 } + ] + }, + "wheel-midRoot5": { + "translate": [ + { "time": 2.2, "x": 0, "y": 0 }, + { "time": 2.4333, "x": 0, "y": 60.26 }, + { "time": 2.7, "x": 0, "y": 0 } + ] + }, + "treadCollider5": { + "rotate": [ + { "time": 2.3333, "angle": 0 }, + { "time": 2.4333, "angle": -23.6 }, + { "time": 2.5666, "angle": 6.49 }, + { "time": 2.6666, "angle": 29.93 }, + { "time": 2.8, "angle": -0.13 } + ], + "translate": [ + { "time": 2.3333, "x": 0, "y": 0 }, + { "time": 2.4333, "x": 0, "y": 36.34 }, + { "time": 2.5, "x": 0, "y": 56.39 }, + { "time": 2.5666, "x": 0, "y": 61.34 }, + { "time": 2.8, "x": 0, "y": 2.04 } + ] + }, + "wheel-midRoot6": { + "translate": [ + { + "time": 2.4333, + "x": 0, + "y": 0, + "curve": [ 0.19, 0.26, 0.804, 0.8 ] + }, + { + "time": 2.6333, + "x": 0, + "y": 51.86, + "curve": [ 0.346, 0, 0.852, 0.7 ] + }, + { "time": 2.8, "x": 0, "y": 0 } + ] + }, + "wheel-mid1": { + "rotate": [ + { + "time": 0, + "angle": 21, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 0.8, "angle": 120 }, + { "time": 1.2333, "angle": 240 }, + { "time": 1.6, "angle": 0 }, + { "time": 1.9, "angle": 120 }, + { "time": 2.1666, "angle": 240 }, + { "time": 2.4, "angle": 0 }, + { "time": 2.5666, "angle": 120 }, + { "time": 2.7333, "angle": 240 }, + { "time": 2.9333, "angle": 0 }, + { "time": 3.1, "angle": 120 }, + { "time": 3.2666, "angle": 240 }, + { "time": 3.4333, "angle": 0 }, + { "time": 3.6333, "angle": 120 }, + { "time": 3.8, "angle": 240 }, + { "time": 3.9666, "angle": 0 }, + { "time": 4.1666, "angle": 120 }, + { "time": 4.3333, "angle": 240 }, + { "time": 4.5, "angle": 0 }, + { "time": 4.7, "angle": 120 }, + { "time": 4.8666, "angle": 240 }, + { "time": 5.2666, "angle": -67.99 } + ] + }, + "tankTreads": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.145, 0.34, 0.75, 1 ] + }, + { "time": 1.1, "angle": -3.9 }, + { "time": 1.3333, "angle": -2.37 }, + { "time": 1.6333, "angle": -3.54 }, + { "time": 2.1666, "angle": 0.27 }, + { + "time": 2.4666, + "angle": 2.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.7, + "angle": 3.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 3, "angle": -3.62 }, + { "time": 3.2333, "angle": -1.23, "curve": "stepped" }, + { + "time": 4.8666, + "angle": -1.23, + "curve": [ 0.188, 0.16, 0.75, 1 ] + }, + { + "time": 5.2, + "angle": 4.47, + "curve": [ 0.416, 0.01, 0.75, 1 ] + }, + { + "time": 5.5666, + "angle": -3.08, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 5.8333, "angle": -1.23 } + ] + }, + "wheel-big1": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 1.1, "angle": 120 }, + { "time": 1.5333, "angle": 240 }, + { "time": 1.8, "angle": 360 }, + { "time": 2.0333, "angle": 120 }, + { "time": 2.2666, "angle": 240 }, + { "time": 2.4666, "angle": 360 }, + { "time": 2.7, "angle": 120 }, + { "time": 2.9333, "angle": 240 }, + { "time": 3.1333, "angle": 360 }, + { "time": 3.3666, "angle": 120 }, + { "time": 3.5666, "angle": 240 }, + { "time": 3.8, "angle": -24 }, + { "time": 4.0333, "angle": 120 }, + { "time": 4.2333, "angle": 240 }, + { "time": 4.4666, "angle": -24 }, + { "time": 4.7, "angle": 120 }, + { "time": 4.8666, "angle": -143.99 }, + { + "time": 5.0666, + "angle": -131.4, + "curve": [ 0.14, 0.25, 0.75, 1 ] + }, + { "time": 5.6666, "angle": -76.85 }, + { "time": 5.8333, "angle": -72.3 } + ] + }, + "treadGravity1": { + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.4666, "x": 0, "y": 0 }, + { "time": 1.8, "x": 0, "y": 29.44 }, + { "time": 2.3333, "x": 0, "y": -0.52 }, + { "time": 2.5666, "x": 0, "y": 5.2 }, + { "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" }, + { "time": 4.8666, "x": 0, "y": -11.05 }, + { "time": 5.0666, "x": 0, "y": -1.91 }, + { "time": 5.5333, "x": 0, "y": -6.9 }, + { "time": 5.7333, "x": 0, "y": -11.05 } + ] + }, + "treadGravity2": { + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.4666, "x": 0, "y": 0 }, + { "time": 1.8, "x": 0, "y": 8.5 }, + { "time": 2.3333, "x": 0, "y": 34.74 }, + { "time": 2.5666, "x": 0, "y": 5.2 }, + { "time": 2.6666, "x": 0, "y": -11.05, "curve": "stepped" }, + { "time": 4.8666, "x": 0, "y": -11.05 }, + { "time": 5.0666, "x": 0, "y": 3.9 }, + { "time": 5.5333, "x": 0, "y": -6.9 }, + { "time": 5.7333, "x": 0, "y": -11.05 } + ] + }, + "wheel-small1": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.504, 0.11, 0.931, 0.71 ] + }, + { "time": 0.7, "angle": 120 }, + { "time": 1.1, "angle": 240 }, + { "time": 1.4666, "angle": 360 }, + { "time": 1.7666, "angle": 120 }, + { "time": 2.0333, "angle": 240 }, + { "time": 2.2666, "angle": 360 }, + { "time": 2.4333, "angle": 120 }, + { "time": 2.5666, "angle": 240 }, + { "time": 2.7, "angle": 360 }, + { "time": 2.8333, "angle": 120 }, + { "time": 2.9666, "angle": 240 }, + { "time": 3.1, "angle": 360 }, + { "time": 3.2333, "angle": 120 }, + { "time": 3.3666, "angle": 240 }, + { "time": 3.5, "angle": 360 }, + { "time": 3.6333, "angle": 120 }, + { "time": 3.7666, "angle": 240 }, + { "time": 3.9, "angle": 360 }, + { "time": 4.0333, "angle": 120 }, + { "time": 4.1666, "angle": 240 }, + { "time": 4.3, "angle": 360 }, + { "time": 4.4333, "angle": 120 }, + { "time": 4.5666, "angle": 240 }, + { "time": 4.7, "angle": 360 }, + { "time": 4.8333, "angle": 120 }, + { "time": 5, "angle": 240 }, + { + "time": 5.2, + "angle": -25.64, + "curve": [ 0.181, 0.26, 0.75, 1 ] + }, + { "time": 5.5666, "angle": 90 } + ] + }, + "tankBody": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.1666, + "angle": -1.41, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.9333, + "angle": -0.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3, + "angle": 0.84, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -2.33, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.4666, + "angle": -0.45, + "curve": [ 0.329, 0.32, 0.757, 1 ] + }, + { + "time": 4.8666, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3333, + "angle": 1.82, + "curve": [ 0.324, 0.01, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -1.15, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.0333, "angle": 0 } + ] + }, + "antenna1": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna2": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna3": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna4": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna5": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "antenna6": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 0.4333, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.7333, + "angle": -1.55, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.0666, + "angle": -0.68, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 1.4, + "angle": 0.61, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 1.6666, "angle": -0.67, "curve": "stepped" }, + { + "time": 2.1333, + "angle": -0.67, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.3666, + "angle": 0.88, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.5666, + "angle": -1.69, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 2.8666, + "angle": 1.18, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.0333, + "angle": -1.09, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.2333, + "angle": 1.03, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 3.5, + "angle": -0.44, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 4.6666, "angle": -0.18 }, + { + "time": 5.0333, + "angle": -1.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.3666, + "angle": 9.17, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.6666, + "angle": -3.14, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.9, + "angle": 2.96, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 6.1, + "angle": -0.29, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.2666, "angle": 0.96 }, + { "time": 6.4, "angle": 0 } + ] + }, + "machinegun": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { + "time": 2.8333, + "angle": 0, + "curve": [ 0.183, 0.17, 0.75, 1 ] + }, + { + "time": 3, + "angle": -4.43, + "curve": [ 0.156, 0.16, 0.75, 1 ] + }, + { + "time": 3.1666, + "angle": -2.93, + "curve": [ 0.156, 0.16, 0.75, 1 ] + }, + { + "time": 4.8333, + "angle": 0, + "curve": [ 0.183, 0.17, 0.75, 1 ] + }, + { + "time": 5.1666, + "angle": -6.05, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 5.4, + "angle": 6.15, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 5.6, "angle": -1.26 } + ] + }, + "cannon": { + "rotate": [ + { "time": 0, "angle": 0 } + ] + }, + "cannonTarget": { + "translate": [ + { + "time": 5, + "x": 0, + "y": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { "time": 6.3333, "x": -15.38, "y": 99.99 } + ] + } + }, + "ik": { + "cannonTarget": [ + { "time": 0, "mix": 0.809, "curve": "stepped" }, + { "time": 4.7333, "mix": 0.809 }, + { "time": 5.1666, "mix": 0.504 }, + { "time": 5.6666 } + ] + }, + "paths": { + "treads": { + "position": [ + { + "time": 0, + "curve": [ 0.549, 0, 0.907, 0.84 ] + }, + { "time": 3.0333, "position": 0.51 }, + { "time": 4.8666, "position": 0.9794 }, + { + "time": 5.2666, + "position": 1, + "curve": [ 0.226, 0.15, 0.765, 0.96 ] + }, + { + "time": 5.5333, + "position": 1.02, + "curve": [ 0.279, 0.32, 0.694, 0.99 ] + }, + { "time": 5.8333, "position": 1.021 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/spine-xna/example/data/tank.png b/spine-xna/example/data/tank.png new file mode 100644 index 000000000..b0b1b3642 Binary files /dev/null and b/spine-xna/example/data/tank.png differ diff --git a/spine-xna/example/data/tank.skel b/spine-xna/example/data/tank.skel new file mode 100644 index 000000000..1da9f265c Binary files /dev/null and b/spine-xna/example/data/tank.skel differ diff --git a/spine-xna/example/src/ExampleGame.cs b/spine-xna/example/src/ExampleGame.cs index 9c514104a..2fc21c7d0 100644 --- a/spine-xna/example/src/ExampleGame.cs +++ b/spine-xna/example/src/ExampleGame.cs @@ -76,7 +76,9 @@ namespace Spine { // String name = "spineboy"; // String name = "goblins-mesh"; - String name = "raptor"; + // String name = "raptor"; + String name = "tank"; + // String name = "star"; bool binaryData = true; Atlas atlas = new Atlas(assetsFolder + name + ".atlas", new XnaTextureLoader(GraphicsDevice)); @@ -84,6 +86,7 @@ namespace Spine { float scale = 1; if (name == "spineboy") scale = 0.6f; if (name == "raptor") scale = 0.5f; + if (name == "tank") scale = 0.3f; SkeletonData skeletonData; if (binaryData) { @@ -116,15 +119,21 @@ namespace Spine { TrackEntry entry = state.AddAnimation(0, "jump", false, 0); entry.End += End; // Event handling for queued animations. state.AddAnimation(0, "run", true, 0); - } else if (name == "raptor") { + } + else if (name == "raptor") { state.SetAnimation(0, "walk", true); - state.SetAnimation(1, "empty", false); state.AddAnimation(1, "gungrab", false, 2); + } + else if (name == "star") { + // no animation in star + } + else if (name == "tank") { + state.SetAnimation(0, "drive", true); } else { state.SetAnimation(0, "walk", true); } - skeleton.X = 400; + skeleton.X = 400 + (name == "tank" ? 300: 0); skeleton.Y = 580; skeleton.UpdateWorldTransform(); @@ -148,7 +157,7 @@ namespace Spine { GraphicsDevice.Clear(Color.Black); state.Update(gameTime.ElapsedGameTime.Milliseconds / 1000f); - state.Apply(skeleton); + state.Apply(skeleton); skeleton.UpdateWorldTransform(); skeletonRenderer.Begin(); skeletonRenderer.Draw(skeleton); diff --git a/spine-xna/src/SkeletonMeshRenderer.cs b/spine-xna/src/SkeletonMeshRenderer.cs index 1b270ed6d..1f7a29151 100644 --- a/spine-xna/src/SkeletonMeshRenderer.cs +++ b/spine-xna/src/SkeletonMeshRenderer.cs @@ -154,44 +154,7 @@ namespace Spine { itemVertices[TR].TextureCoordinate.Y = uvs[RegionAttachment.Y4]; } else if (attachment is MeshAttachment) { MeshAttachment mesh = (MeshAttachment)attachment; - int vertexCount = mesh.Vertices.Length; - if (vertices.Length < vertexCount) vertices = new float[vertexCount]; - mesh.ComputeWorldVertices(slot, vertices); - - int[] triangles = mesh.Triangles; - MeshItem item = batcher.NextItem(vertexCount, triangles.Length); - item.triangles = triangles; - - AtlasRegion region = (AtlasRegion)mesh.RendererObject; - item.texture = (Texture2D)region.page.rendererObject; - - Color color; - float a = skeletonA * slot.A * mesh.A; - if (premultipliedAlpha) { - color = new Color( - skeletonR * slot.R * mesh.R * a, - skeletonG * slot.G * mesh.G * a, - skeletonB * slot.B * mesh.B * a, a); - } else { - color = new Color( - skeletonR * slot.R * mesh.R, - skeletonG * slot.G * mesh.G, - skeletonB * slot.B * mesh.B, a); - } - - float[] uvs = mesh.UVs; - VertexPositionColorTexture[] itemVertices = item.vertices; - for (int ii = 0, v = 0; v < vertexCount; ii++, v += 2) { - itemVertices[ii].Color = color; - itemVertices[ii].Position.X = vertices[v]; - itemVertices[ii].Position.Y = vertices[v + 1]; - itemVertices[ii].Position.Z = 0; - itemVertices[ii].TextureCoordinate.X = uvs[v]; - itemVertices[ii].TextureCoordinate.Y = uvs[v + 1]; - } - } else if (attachment is WeightedMeshAttachment) { - WeightedMeshAttachment mesh = (WeightedMeshAttachment)attachment; - int vertexCount = mesh.UVs.Length; + int vertexCount = mesh.WorldVerticesLength; if (vertices.Length < vertexCount) vertices = new float[vertexCount]; mesh.ComputeWorldVertices(slot, vertices);