Parcourir la source

Merge remote-tracking branch 'upstream/master'

pinguin999 il y a 11 ans
Parent
commit
a5131d287f

+ 8 - 7
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.<Event>, alpha:Number) : void {
-		if (time < frames[0])
-			return; // Time is before first frame.
+		var frames:Vector.<Number> = 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);

+ 1 - 1
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],

+ 10 - 15
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 {

+ 7 - 7
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;

+ 1 - 1
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 =

+ 5 - 1
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

+ 105 - 103
spine-libgdx/assets/skin/skin.atlas

@@ -1,60 +1,84 @@
 
 skin.png
+size: 256,128
 format: RGBA8888
-filter: Nearest,Nearest
+filter: Linear,Linear
 repeat: none
-default
+check-off
   rotate: false
-  xy: 1, 50
-  size: 254, 77
-  orig: 254, 77
+  xy: 11, 5
+  size: 14, 14
+  orig: 14, 14
   offset: 0, 0
   index: -1
-default-window
+textfield
   rotate: false
-  xy: 1, 20
-  size: 27, 29
-  split: 4, 3, 20, 3
-  orig: 27, 29
+  xy: 11, 5
+  size: 14, 14
+  split: 3, 3, 3, 3
+  orig: 14, 14
   offset: 0, 0
   index: -1
-default-select
+check-on
   rotate: false
-  xy: 29, 29
-  size: 27, 20
-  split: 4, 14, 4, 4
-  orig: 27, 20
+  xy: 125, 35
+  size: 14, 14
+  orig: 14, 14
   offset: 0, 0
   index: -1
-default-round-large
+cursor
   rotate: false
-  xy: 57, 29
-  size: 20, 20
-  split: 5, 5, 5, 4
-  orig: 20, 20
+  xy: 23, 1
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
   offset: 0, 0
   index: -1
-default-scroll
+default
   rotate: false
-  xy: 78, 29
-  size: 20, 20
-  split: 2, 2, 2, 2
-  orig: 20, 20
+  xy: 1, 50
+  size: 253, 77
+  orig: 254, 77
+  offset: 1, 0
+  index: -1
+default-pane
+  rotate: false
+  xy: 11, 1
+  size: 5, 3
+  split: 1, 1, 1, 1
+  orig: 5, 3
   offset: 0, 0
   index: -1
-default-slider-knob
+default-rect-pad
   rotate: false
-  xy: 1, 1
-  size: 9, 18
-  orig: 9, 18
+  xy: 11, 1
+  size: 5, 3
+  split: 1, 1, 1, 1
+  orig: 5, 3
   offset: 0, 0
   index: -1
-default-round-down
+default-pane-noborder
   rotate: false
-  xy: 99, 29
-  size: 12, 20
-  split: 5, 5, 5, 4
-  orig: 12, 20
+  xy: 129, 33
+  size: 1, 1
+  split: 0, 0, 0, 0
+  orig: 1, 1
+  offset: 0, 0
+  index: -1
+default-rect
+  rotate: false
+  xy: 38, 25
+  size: 3, 3
+  split: 1, 1, 1, 1
+  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
@@ -66,40 +90,45 @@ default-round
   orig: 12, 20
   offset: 0, 0
   index: -1
-check-off
+default-round-down
   rotate: false
-  xy: 11, 5
-  size: 14, 14
-  orig: 14, 14
+  xy: 99, 29
+  size: 12, 20
+  split: 5, 5, 5, 4
+  pad: 4, 4, 1, 1
+  orig: 12, 20
   offset: 0, 0
   index: -1
-textfield
+default-round-large
   rotate: false
-  xy: 11, 5
-  size: 14, 14
-  split: 3, 3, 3, 3
-  orig: 14, 14
+  xy: 57, 29
+  size: 20, 20
+  split: 5, 5, 5, 4
+  orig: 20, 20
   offset: 0, 0
   index: -1
-check-on
+default-scroll
   rotate: false
-  xy: 125, 35
-  size: 14, 14
-  orig: 14, 14
+  xy: 78, 29
+  size: 20, 20
+  split: 2, 2, 2, 2
+  orig: 20, 20
   offset: 0, 0
   index: -1
-tree-minus
+default-select
   rotate: false
-  xy: 140, 35
-  size: 14, 14
-  orig: 14, 14
+  xy: 29, 29
+  size: 27, 20
+  split: 4, 14, 4, 4
+  orig: 27, 20
   offset: 0, 0
   index: -1
-tree-plus
+default-select-selection
   rotate: false
-  xy: 155, 35
-  size: 14, 14
-  orig: 14, 14
+  xy: 26, 16
+  size: 3, 3
+  split: 1, 1, 1, 1
+  orig: 3, 3
   offset: 0, 0
   index: -1
 default-slider
@@ -110,20 +139,11 @@ default-slider
   orig: 8, 8
   offset: 0, 0
   index: -1
-default-pane
-  rotate: false
-  xy: 11, 1
-  size: 5, 3
-  split: 1, 1, 1, 1
-  orig: 5, 3
-  offset: 0, 0
-  index: -1
-default-rect-pad
+default-slider-knob
   rotate: false
-  xy: 11, 1
-  size: 5, 3
-  split: 1, 1, 1, 1
-  orig: 5, 3
+  xy: 1, 1
+  size: 9, 18
+  orig: 9, 18
   offset: 0, 0
   index: -1
 default-splitpane
@@ -134,14 +154,6 @@ default-splitpane
   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
@@ -150,43 +162,33 @@ default-splitpane-vertical
   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
-  offset: 0, 0
-  index: -1
-default-rect
+default-window
   rotate: false
-  xy: 38, 25
-  size: 3, 3
-  split: 1, 1, 1, 1
-  orig: 3, 3
+  xy: 1, 20
+  size: 27, 29
+  split: 4, 3, 20, 3
+  orig: 27, 29
   offset: 0, 0
   index: -1
-default-select-selection
+selection
   rotate: false
-  xy: 26, 16
-  size: 3, 3
-  split: 1, 1, 1, 1
-  orig: 3, 3
+  xy: 170, 44
+  size: 1, 1
+  orig: 1, 1
   offset: 0, 0
   index: -1
-default-pane-noborder
+tree-minus
   rotate: false
-  xy: 129, 33
-  size: 1, 1
-  split: 0, 0, 0, 0
-  orig: 1, 1
+  xy: 140, 35
+  size: 14, 14
+  orig: 14, 14
   offset: 0, 0
   index: -1
-selection
+tree-plus
   rotate: false
-  xy: 170, 44
-  size: 1, 1
-  orig: 1, 1
+  xy: 155, 35
+  size: 14, 14
+  orig: 14, 14
   offset: 0, 0
   index: -1
 white

BIN
spine-libgdx/assets/skin/skin.png


+ 4 - 4
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<Timeline> 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(

+ 1 - 1
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;

+ 101 - 0
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();
+	}
+}

+ 1 - 1
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) {

+ 22 - 9
spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java → 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);
 	}
 }

+ 5 - 2
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;
+			}
 
 
 		}