From 60ab9d5fa86b604abf4918bc3f97dfc2296b7c0e Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Thu, 2 Oct 2014 17:51:15 +0200 Subject: [PATCH] spine-libgdx, added flip timelines. --- .../spine/SkeletonBinary.java | 28 +++++++++++-- .../esotericsoftware/spine/SkeletonJson.java | 40 ++++++++++++++----- .../spine/SkeletonViewer.java | 5 ++- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java index 95e65de1f..5505ffc1a 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java @@ -46,6 +46,8 @@ import com.esotericsoftware.spine.Animation.CurveTimeline; import com.esotericsoftware.spine.Animation.DrawOrderTimeline; import com.esotericsoftware.spine.Animation.EventTimeline; import com.esotericsoftware.spine.Animation.FfdTimeline; +import com.esotericsoftware.spine.Animation.FlipXTimeline; +import com.esotericsoftware.spine.Animation.FlipYTimeline; import com.esotericsoftware.spine.Animation.IkConstraintTimeline; import com.esotericsoftware.spine.Animation.RotateTimeline; import com.esotericsoftware.spine.Animation.ScaleTimeline; @@ -66,10 +68,6 @@ public class SkeletonBinary { static public final int TIMELINE_TRANSLATE = 2; static public final int TIMELINE_ATTACHMENT = 3; static public final int TIMELINE_COLOR = 4; - static public final int TIMELINE_EVENT = 5; - static public final int TIMELINE_DRAWORDER = 6; - static public final int TIMELINE_FFD = 7; - static public final int TIMELINE_IK = 8; static public final int CURVE_LINEAR = 0; static public final int CURVE_STEPPED = 1; @@ -476,6 +474,28 @@ public class SkeletonBinary { } } + // Flip timelines. + int flipCount = input.readInt(true); + if (flipCount > 0) { + FlipXTimeline timeline = new FlipXTimeline(flipCount); + for (int i = 0; i < flipCount; i++) { + float time = input.readFloat(); + timeline.setFrame(i, time, input.readBoolean()); + } + timelines.add(timeline); + duration = Math.max(duration, timeline.getFrames()[flipCount * 2 - 2]); + } + flipCount = input.readInt(true); + if (flipCount > 0) { + FlipYTimeline timeline = new FlipYTimeline(flipCount); + for (int i = 0; i < flipCount; i++) { + float time = input.readFloat(); + timeline.setFrame(i, time, input.readBoolean()); + } + timelines.add(timeline); + duration = Math.max(duration, timeline.getFrames()[flipCount * 2 - 2]); + } + // Draw order timeline. int drawOrderCount = input.readInt(true); if (drawOrderCount > 0) { diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java index 985e3a62e..e550f78c2 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -30,12 +30,23 @@ package com.esotericsoftware.spine; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.FloatArray; +import com.badlogic.gdx.utils.IntArray; +import com.badlogic.gdx.utils.JsonReader; +import com.badlogic.gdx.utils.JsonValue; +import com.badlogic.gdx.utils.SerializationException; import com.esotericsoftware.spine.Animation.AttachmentTimeline; import com.esotericsoftware.spine.Animation.ColorTimeline; import com.esotericsoftware.spine.Animation.CurveTimeline; import com.esotericsoftware.spine.Animation.DrawOrderTimeline; import com.esotericsoftware.spine.Animation.EventTimeline; import com.esotericsoftware.spine.Animation.FfdTimeline; +import com.esotericsoftware.spine.Animation.FlipXTimeline; +import com.esotericsoftware.spine.Animation.FlipYTimeline; import com.esotericsoftware.spine.Animation.IkConstraintTimeline; import com.esotericsoftware.spine.Animation.RotateTimeline; import com.esotericsoftware.spine.Animation.ScaleTimeline; @@ -49,15 +60,6 @@ import com.esotericsoftware.spine.attachments.BoundingBoxAttachment; import com.esotericsoftware.spine.attachments.MeshAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; import com.esotericsoftware.spine.attachments.SkinnedMeshAttachment; -import com.badlogic.gdx.files.FileHandle; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.TextureAtlas; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.FloatArray; -import com.badlogic.gdx.utils.IntArray; -import com.badlogic.gdx.utils.JsonReader; -import com.badlogic.gdx.utils.JsonValue; -import com.badlogic.gdx.utils.SerializationException; public class SkeletonJson { private final AttachmentLoader attachmentLoader; @@ -458,6 +460,26 @@ public class SkeletonJson { } } + // Flip timelines. + JsonValue flipMap = map.get("flipx"); + if (flipMap != null) { + FlipXTimeline timeline = new FlipXTimeline(flipMap.size); + int frameIndex = 0; + for (JsonValue valueMap = flipMap.child; valueMap != null; valueMap = valueMap.next) + timeline.setFrame(frameIndex++, valueMap.getFloat("time"), valueMap.getBoolean("x", false)); + timelines.add(timeline); + duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]); + } + flipMap = map.get("flipy"); + if (flipMap != null) { + FlipYTimeline timeline = new FlipYTimeline(flipMap.size); + int frameIndex = 0; + for (JsonValue valueMap = flipMap.child; valueMap != null; valueMap = valueMap.next) + timeline.setFrame(frameIndex++, valueMap.getFloat("time"), valueMap.getBoolean("y", false)); + timelines.add(timeline); + duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]); + } + // Draw order timeline. JsonValue drawOrdersMap = map.get("draworder"); if (drawOrdersMap != null) { diff --git a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java index 52a4d6e99..9149998f5 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java @@ -202,16 +202,17 @@ public class SkeletonViewer extends ApplicationAdapter { delta = Math.min(delta, 0.032f) * ui.speedSlider.getValue(); skeleton.update(delta); + skeleton.setFlip(ui.flipXCheckbox.isChecked(), ui.flipYCheckbox.isChecked()); if (!ui.pauseButton.isChecked()) { state.update(delta); state.apply(skeleton); + ui.flipXCheckbox.setChecked(skeleton.getFlipX()); + ui.flipYCheckbox.setChecked(skeleton.getFlipY()); } skeleton.setPosition(skeletonX, skeletonY); // skeleton.setPosition(0, 0); // skeleton.getRootBone().setX(skeletonX); // skeleton.getRootBone().setY(skeletonY); - skeleton.setFlipX(ui.flipXCheckbox.isChecked()); - skeleton.setFlipY(ui.flipYCheckbox.isChecked()); skeleton.updateWorldTransform(); batch.begin();