diff --git a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as index 56c96a844..bcc807b0c 100644 --- a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as @@ -53,14 +53,15 @@ public class AttachmentTimeline implements Timeline { } public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { - if (time < frames[0]) - return; // Time is before first frame. + var frames:Vector. = this.frames; + if (time < frames[0]) { + if (lastTime > time) apply(skeleton, lastTime, int.MAX_VALUE, null, 0); + return; + } else if (lastTime > time) // + lastTime = -1; - var frameIndex:int; - if (time >= frames[int(frames.length - 1)]) // Time is after last frame. - frameIndex = frames.length - 1; - else - frameIndex = Animation.binarySearch(frames, time, 1) - 1; + var frameIndex:int = time >= frames[frames.length - 1] ? frames.length - 1 : Animation.binarySearch1(frames, time) - 1; + if (frames[frameIndex] < lastTime) return; var attachmentName:String = attachmentNames[frameIndex]; skeleton.slots[slotIndex].attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName); diff --git a/spine-c/src/spine/Animation.c b/spine-c/src/spine/Animation.c index 9b3714e81..755da5738 100644 --- a/spine-c/src/spine/Animation.c +++ b/spine-c/src/spine/Animation.c @@ -479,7 +479,7 @@ void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skelet frameIndex = time >= self->frames[self->framesCount - 1] ? self->framesCount - 1 : binarySearch1(self->frames, self->framesCount, time) - 1; - if (self->frames[frameIndex] <= lastTime) return; + if (self->frames[frameIndex] < lastTime) return; attachmentName = self->attachmentNames[frameIndex]; spSlot_setAttachment(skeleton->slots[self->slotIndex], diff --git a/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp index 370e84b3f..5a062086d 100644 --- a/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp @@ -80,7 +80,6 @@ void SkeletonRenderer::initialize () { void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsSkeletonData) { _skeleton = spSkeleton_create(skeletonData); - _rootBone = _skeleton->bones[0]; _ownsSkeletonData = ownsSkeletonData; } @@ -346,35 +345,31 @@ bool SkeletonRenderer::setAttachment (const std::string& slotName, const std::st return spSkeleton_setAttachment(_skeleton, slotName.c_str(), attachmentName.c_str()) ? true : false; } -void SkeletonRenderer::setTimeScale(float scale) -{ - _timeScale = scale; +spSkeleton* SkeletonRenderer::getSkeleton () { + return _skeleton; } -float SkeletonRenderer::getTimeScale() const -{ +void SkeletonRenderer::setTimeScale (float scale) { + _timeScale = scale; +} +float SkeletonRenderer::getTimeScale () const { return _timeScale; } -void SkeletonRenderer::setDebugSlotsEnabled(bool enabled) -{ +void SkeletonRenderer::setDebugSlotsEnabled (bool enabled) { _debugSlots = enabled; } -bool SkeletonRenderer::getDebugSlotsEnabled() const -{ +bool SkeletonRenderer::getDebugSlotsEnabled () const { return _debugSlots; } -void SkeletonRenderer::setDebugBonesEnabled(bool enabled) -{ +void SkeletonRenderer::setDebugBonesEnabled (bool enabled) { _debugBones = enabled; } -bool SkeletonRenderer::getDebugBonesEnabled() const -{ +bool SkeletonRenderer::getDebugBonesEnabled () const { return _debugBones; } - // --- CCBlendProtocol const BlendFunc& SkeletonRenderer::getBlendFunc () const { diff --git a/spine-cocos2dx/3/src/spine/SkeletonRenderer.h b/spine-cocos2dx/3/src/spine/SkeletonRenderer.h index b5043ab70..13ea00f87 100644 --- a/spine-cocos2dx/3/src/spine/SkeletonRenderer.h +++ b/spine-cocos2dx/3/src/spine/SkeletonRenderer.h @@ -50,12 +50,7 @@ public: virtual void drawSkeleton (const cocos2d::Mat4& transform, uint32_t transformFlags); virtual cocos2d::Rect getBoundingBox () const override; - // --- Convenience methods for common Skeleton_* functions. - void updateWorldTransform (); - - void setToSetupPose (); - void setBonesToSetupPose (); - void setSlotsToSetupPose (); + spSkeleton* getSkeleton(); void setTimeScale(float scale); float getTimeScale() const; @@ -66,6 +61,12 @@ public: void setDebugBonesEnabled(bool enabled); bool getDebugBonesEnabled() const; + // --- Convenience methods for common Skeleton_* functions. + void updateWorldTransform (); + + void setToSetupPose (); + void setBonesToSetupPose (); + void setSlotsToSetupPose (); /* Returns 0 if the bone was not found. */ spBone* findBone (const std::string& boneName) const; @@ -109,7 +110,6 @@ protected: float* _worldVertices; bool _premultipliedAlpha; spSkeleton* _skeleton; - spBone* _rootBone; float _timeScale; bool _debugSlots; bool _debugBones; diff --git a/spine-csharp/src/Animation.cs b/spine-csharp/src/Animation.cs index d60878da6..cb824f0df 100644 --- a/spine-csharp/src/Animation.cs +++ b/spine-csharp/src/Animation.cs @@ -444,7 +444,7 @@ namespace Spine { lastTime = -1; int frameIndex = time >= frames[frames.Length - 1] ? frames.Length - 1 : Animation.binarySearch(frames, time) - 1; - if (frames[frameIndex] <= lastTime) return; + if (frames[frameIndex] < lastTime) return; String attachmentName = attachmentNames[frameIndex]; skeleton.slots[slotIndex].Attachment = diff --git a/spine-libgdx/.settings/org.eclipse.jdt.core.prefs b/spine-libgdx/.settings/org.eclipse.jdt.core.prefs index e6944cba0..6a57c0f46 100644 --- a/spine-libgdx/.settings/org.eclipse.jdt.core.prefs +++ b/spine-libgdx/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault @@ -47,6 +48,7 @@ org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warni org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error @@ -55,7 +57,7 @@ org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning @@ -67,6 +69,7 @@ org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled @@ -90,6 +93,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference= org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 diff --git a/spine-libgdx/assets/skin/skin.atlas b/spine-libgdx/assets/skin/skin.atlas index 6f8f04bf5..e100bd560 100644 --- a/spine-libgdx/assets/skin/skin.atlas +++ b/spine-libgdx/assets/skin/skin.atlas @@ -1,71 +1,9 @@ skin.png +size: 256,128 format: RGBA8888 -filter: Nearest,Nearest +filter: Linear,Linear repeat: none -default - rotate: false - xy: 1, 50 - size: 254, 77 - orig: 254, 77 - offset: 0, 0 - index: -1 -default-window - rotate: false - xy: 1, 20 - size: 27, 29 - split: 4, 3, 20, 3 - orig: 27, 29 - offset: 0, 0 - index: -1 -default-select - rotate: false - xy: 29, 29 - size: 27, 20 - split: 4, 14, 4, 4 - orig: 27, 20 - offset: 0, 0 - index: -1 -default-round-large - rotate: false - xy: 57, 29 - size: 20, 20 - split: 5, 5, 5, 4 - orig: 20, 20 - offset: 0, 0 - index: -1 -default-scroll - rotate: false - xy: 78, 29 - size: 20, 20 - split: 2, 2, 2, 2 - orig: 20, 20 - offset: 0, 0 - index: -1 -default-slider-knob - rotate: false - xy: 1, 1 - size: 9, 18 - orig: 9, 18 - offset: 0, 0 - index: -1 -default-round-down - rotate: false - xy: 99, 29 - size: 12, 20 - split: 5, 5, 5, 4 - orig: 12, 20 - offset: 0, 0 - index: -1 -default-round - rotate: false - xy: 112, 29 - size: 12, 20 - split: 5, 5, 5, 4 - pad: 4, 4, 1, 1 - orig: 12, 20 - offset: 0, 0 - index: -1 check-off rotate: false xy: 11, 5 @@ -88,27 +26,20 @@ check-on orig: 14, 14 offset: 0, 0 index: -1 -tree-minus +cursor rotate: false - xy: 140, 35 - size: 14, 14 - orig: 14, 14 + xy: 23, 1 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 offset: 0, 0 index: -1 -tree-plus +default rotate: false - xy: 155, 35 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -default-slider - rotate: false - xy: 29, 20 - size: 8, 8 - split: 2, 2, 2, 2 - orig: 8, 8 - offset: 0, 0 + xy: 1, 50 + size: 253, 77 + orig: 254, 77 + offset: 1, 0 index: -1 default-pane rotate: false @@ -126,36 +57,12 @@ default-rect-pad orig: 5, 3 offset: 0, 0 index: -1 -default-splitpane +default-pane-noborder rotate: false - xy: 17, 1 - size: 5, 3 - split: 0, 5, 0, 0 - orig: 5, 3 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 23, 1 - size: 3, 3 - split: 1, 1, 1, 1 - orig: 3, 3 - offset: 0, 0 - index: -1 -default-splitpane-vertical - rotate: false - xy: 125, 29 - size: 3, 5 - split: 0, 0, 0, 5 - orig: 3, 5 - offset: 0, 0 - index: -1 -default-rect-down - rotate: false - xy: 170, 46 - size: 3, 3 - split: 1, 1, 1, 1 - orig: 3, 3 + xy: 129, 33 + size: 1, 1 + split: 0, 0, 0, 0 + orig: 1, 1 offset: 0, 0 index: -1 default-rect @@ -166,6 +73,56 @@ default-rect orig: 3, 3 offset: 0, 0 index: -1 +default-rect-down + rotate: false + xy: 170, 46 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +default-round + rotate: false + xy: 112, 29 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +default-round-down + rotate: false + xy: 99, 29 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +default-round-large + rotate: false + xy: 57, 29 + size: 20, 20 + split: 5, 5, 5, 4 + orig: 20, 20 + offset: 0, 0 + index: -1 +default-scroll + rotate: false + xy: 78, 29 + size: 20, 20 + split: 2, 2, 2, 2 + orig: 20, 20 + offset: 0, 0 + index: -1 +default-select + rotate: false + xy: 29, 29 + size: 27, 20 + split: 4, 14, 4, 4 + orig: 27, 20 + offset: 0, 0 + index: -1 default-select-selection rotate: false xy: 26, 16 @@ -174,12 +131,43 @@ default-select-selection orig: 3, 3 offset: 0, 0 index: -1 -default-pane-noborder +default-slider rotate: false - xy: 129, 33 - size: 1, 1 - split: 0, 0, 0, 0 - orig: 1, 1 + xy: 29, 20 + size: 8, 8 + split: 2, 2, 2, 2 + orig: 8, 8 + offset: 0, 0 + index: -1 +default-slider-knob + rotate: false + xy: 1, 1 + size: 9, 18 + orig: 9, 18 + offset: 0, 0 + index: -1 +default-splitpane + rotate: false + xy: 17, 1 + size: 5, 3 + split: 0, 5, 0, 0 + orig: 5, 3 + offset: 0, 0 + index: -1 +default-splitpane-vertical + rotate: false + xy: 125, 29 + size: 3, 5 + split: 0, 0, 0, 5 + orig: 3, 5 + offset: 0, 0 + index: -1 +default-window + rotate: false + xy: 1, 20 + size: 27, 29 + split: 4, 3, 20, 3 + orig: 27, 29 offset: 0, 0 index: -1 selection @@ -189,6 +177,20 @@ selection orig: 1, 1 offset: 0, 0 index: -1 +tree-minus + rotate: false + xy: 140, 35 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +tree-plus + rotate: false + xy: 155, 35 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 white rotate: false xy: 174, 48 diff --git a/spine-libgdx/assets/skin/skin.png b/spine-libgdx/assets/skin/skin.png index f51c5bd1f..add8b6f0c 100644 Binary files a/spine-libgdx/assets/skin/skin.png and b/spine-libgdx/assets/skin/skin.png differ diff --git a/spine-libgdx/src/com/esotericsoftware/spine/Animation.java b/spine-libgdx/src/com/esotericsoftware/spine/Animation.java index 918917ede..ae330ca46 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/Animation.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/Animation.java @@ -86,8 +86,8 @@ public class Animation { if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (loop && duration != 0) { - lastTime %= duration; time %= duration; + lastTime %= duration; } Array timelines = this.timelines; @@ -468,8 +468,8 @@ public class Animation { static public class AttachmentTimeline implements Timeline { int slotIndex; - private final float[] frames; // time, ... - private final String[] attachmentNames; + final float[] frames; // time, ... + final String[] attachmentNames; public AttachmentTimeline (int frameCount) { frames = new float[frameCount]; @@ -511,7 +511,7 @@ public class Animation { lastTime = -1; int frameIndex = (time >= frames[frames.length - 1] ? frames.length : binarySearch(frames, time)) - 1; - if (frames[frameIndex] <= lastTime) return; + if (frames[frameIndex] < lastTime) return; String attachmentName = attachmentNames[frameIndex]; skeleton.slots.get(slotIndex).setAttachment( diff --git a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index e29e85306..a298b2982 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -304,7 +304,7 @@ public class AnimationState { TrackEntry next, previous; Animation animation; boolean loop; - float delay, time, lastTime, endTime, timeScale = 1; + float delay, time, lastTime = -1, endTime, timeScale = 1; float mixTime, mixDuration; AnimationStateListener listener; float mix = 1; diff --git a/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java b/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java new file mode 100644 index 000000000..2d98b20aa --- /dev/null +++ b/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java @@ -0,0 +1,101 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), 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 SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +package com.esotericsoftware.spine; + +import com.badlogic.gdx.utils.Array; +import com.esotericsoftware.spine.Animation.AttachmentTimeline; +import com.esotericsoftware.spine.Animation.Timeline; +import com.esotericsoftware.spine.attachments.Attachment; + +/** Unit tests for {@link AttachmentTimeline}. */ +public class AttachmentTimelineTests { + private final SkeletonData skeletonData; + private final Skeleton skeleton; + private Slot slot; + private AnimationState state; + + public AttachmentTimelineTests () { + skeletonData = new SkeletonData(); + + BoneData boneData = new BoneData("bone", null); + skeletonData.getBones().add(boneData); + + skeletonData.getSlots().add(new SlotData("slot", boneData)); + + Attachment attachment1 = new Attachment("attachment1") {}; + Attachment attachment2 = new Attachment("attachment2") {}; + + Skin skin = new Skin("skin"); + skin.addAttachment(0, "attachment1", attachment1); + skin.addAttachment(0, "attachment2", attachment2); + skeletonData.setDefaultSkin(skin); + + skeleton = new Skeleton(skeletonData); + slot = skeleton.findSlot("slot"); + + AttachmentTimeline timeline = new AttachmentTimeline(2); + timeline.setFrame(0, 0, "attachment1"); + timeline.setFrame(1, 0.5f, "attachment2"); + + Animation animation = new Animation("animation", Array.with((Timeline)timeline), 1); + animation.setDuration(1); + + state = new AnimationState(new AnimationStateData(skeletonData)); + state.setAnimation(0, animation, true); + + test(0, attachment1); + test(0, attachment1); + test(0.25f, attachment1); + test(0f, attachment1); + test(0.25f, attachment2); + test(0.25f, attachment2); + + System.out.println("AttachmentTimeline tests passed."); + } + + private void test (float delta, Attachment attachment) { + state.update(delta); + state.apply(skeleton); + if (slot.getAttachment() != attachment) + throw new FailException("Wrong attachment: " + slot.getAttachment() + " != " + attachment); + + } + + static class FailException extends RuntimeException { + public FailException (String message) { + super(message); + } + } + + static public void main (String[] args) throws Exception { + new AttachmentTimelineTests(); + } +} diff --git a/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java b/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java index 6f667eca1..1509193db 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java @@ -72,7 +72,7 @@ public class EventTimelineTests { test(0.1f, 0.2f, 0.3f, 0.4f); test(1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 11.01f, 12, 12, 12, 12); - System.out.println("All tests passed."); + System.out.println("EventTimeline tests passed."); } private void test (float... frames) { diff --git a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java similarity index 95% rename from spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java rename to spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java index 82b90e38b..52a4d6e99 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java @@ -32,12 +32,17 @@ package com.esotericsoftware.spine; import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*; +import java.awt.FileDialog; +import java.awt.Frame; +import java.io.File; + import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.Preferences; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; @@ -67,11 +72,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.ScreenViewport; -import java.awt.FileDialog; -import java.awt.Frame; -import java.io.File; - -public class SkeletonTest extends ApplicationAdapter { +public class SkeletonViewer extends ApplicationAdapter { static final float checkModifiedInterval = 0.250f; static final float reloadDelay = 1; @@ -291,6 +292,12 @@ public class SkeletonTest extends ApplicationAdapter { minimizeButton.getColor().a = 0.66f; window.getButtonTable().add(minimizeButton).size(20, 20); + ScrollPane skinScroll = new ScrollPane(skinList, skin); + skinScroll.setFadeScrollBars(false); + + ScrollPane animationScroll = new ScrollPane(animationList, skin); + animationScroll.setFadeScrollBars(false); + // Layout. root.pad(2, 4, 4, 4).defaults().space(6); @@ -320,11 +327,11 @@ public class SkeletonTest extends ApplicationAdapter { root.add("Alpha:"); root.add(premultipliedCheckbox).row(); root.add("Skin:"); - root.add(new ScrollPane(skinList, skin)).expand().fill().minHeight(75).row(); + root.add(skinScroll).expand().fill().minHeight(75).row(); root.add("Setup Pose:"); root.add(table(bonesSetupPoseButton, slotsSetupPoseButton, setupPoseButton)).row(); root.add("Animation:"); - root.add(new ScrollPane(animationList, skin)).expand().fill().minHeight(75).row(); + root.add(animationScroll).expand().fill().minHeight(75).row(); root.add("Mix:"); { Table table = table(); @@ -487,7 +494,13 @@ public class SkeletonTest extends ApplicationAdapter { } } - public static void main (String[] args) throws Exception { - new LwjglApplication(new SkeletonTest(), "SkeletonTest", 800, 600); + static public void main (String[] args) throws Exception { + LwjglApplicationConfiguration.disableAudio = true; + LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); + config.width = 800; + config.height = 600; + config.title = "Skeleton Viewer"; + config.allowSoftwareMode = true; + new LwjglApplication(new SkeletonViewer(), config); } } diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs index b32b9ba44..1035e8df7 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs @@ -67,6 +67,7 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { } + //TODO: Refactor this to use GenericMenu and callbacks to avoid interfering with control by other behaviours. // Animation name. { String[] animations = new String[component.skeleton.Data.Animations.Count + 1]; @@ -85,8 +86,10 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { EditorGUILayout.EndHorizontal(); String selectedAnimationName = animationIndex == 0 ? null : animations[animationIndex]; - component.AnimationName = selectedAnimationName; - animationName.stringValue = selectedAnimationName; + if(component.AnimationName != selectedAnimationName){ + component.AnimationName = selectedAnimationName; + animationName.stringValue = selectedAnimationName; + } }