Quellcode durchsuchen

Refactoring to bring spine-libgdx up to date with spine-csharp and spine-xna.

NathanSweet vor 12 Jahren
Ursprung
Commit
23e04c3b08
20 geänderte Dateien mit 173 neuen und 94 gelöschten Zeilen
  1. 1 1
      spine-csharp/src/Attachments/AtlasAttachmentLoader.cs
  2. 1 1
      spine-csharp/src/Attachments/AttachmentLoader.cs
  3. 3 3
      spine-csharp/src/SkeletonJson.cs
  4. 2 31
      spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java
  5. 3 0
      spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java
  6. 25 11
      spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java
  7. 24 0
      spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java
  8. 65 0
      spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java
  9. 2 0
      spine-libgdx/src/com/esotericsoftware/spine/Skin.java
  10. 2 0
      spine-libgdx/src/com/esotericsoftware/spine/Slot.java
  11. 0 3
      spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java
  12. 3 3
      spine-libgdx/src/com/esotericsoftware/spine/attachments/Attachment.java
  13. 3 1
      spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java
  14. 1 1
      spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java
  15. 4 13
      spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java
  16. 5 5
      spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionSequenceAttachment.java
  17. 10 6
      spine-libgdx/test/com/esotericsoftware/spine/AnimationStateTest.java
  18. 9 8
      spine-libgdx/test/com/esotericsoftware/spine/MixTest.java
  19. 8 7
      spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java
  20. 2 0
      spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs

+ 1 - 1
spine-csharp/src/Attachments/AtlasAttachmentLoader.cs

@@ -34,7 +34,7 @@ namespace Spine {
 			this.atlas = atlas;
 		}
 
-		public Attachment NewAttachment (AttachmentType type, String name) {
+		public Attachment NewAttachment (Skin skin, AttachmentType type, String name) {
 			switch (type) {
 			case AttachmentType.region:
 				AtlasRegion region = atlas.FindRegion(name);

+ 1 - 1
spine-csharp/src/Attachments/AttachmentLoader.cs

@@ -28,6 +28,6 @@ using System;
 namespace Spine {
 	public interface AttachmentLoader {
 		/** @return May be null to not load any attachment. */
-		Attachment NewAttachment (AttachmentType type, String name);
+		Attachment NewAttachment (Skin skin, AttachmentType type, String name);
 	}
 }

+ 3 - 3
spine-csharp/src/SkeletonJson.cs

@@ -119,7 +119,7 @@ namespace Spine {
 					foreach (KeyValuePair<String, Object> slotEntry in (Dictionary<String, Object>)entry.Value) {
 						int slotIndex = skeletonData.FindSlotIndex(slotEntry.Key);
 						foreach (KeyValuePair<String, Object> attachmentEntry in ((Dictionary<String, Object>)slotEntry.Value)) {
-							Attachment attachment = readAttachment(attachmentEntry.Key, (Dictionary<String, Object>)attachmentEntry.Value);
+							Attachment attachment = readAttachment(skin, attachmentEntry.Key, (Dictionary<String, Object>)attachmentEntry.Value);
 							skin.AddAttachment(slotIndex, attachmentEntry.Key, attachment);
 						}
 					}
@@ -144,14 +144,14 @@ namespace Spine {
 			return skeletonData;
 		}
 
-		private Attachment readAttachment (String name, Dictionary<String, Object> map) {
+		private Attachment readAttachment (Skin skin, String name, Dictionary<String, Object> map) {
 			if (map.ContainsKey("name"))
 				name = (String)map["name"];
 
 			AttachmentType type = AttachmentType.region;
 			if (map.ContainsKey("type"))
 				type = (AttachmentType)Enum.Parse(typeof(AttachmentType), (String)map["type"], false);
-			Attachment attachment = attachmentLoader.NewAttachment(type, name);
+			Attachment attachment = attachmentLoader.NewAttachment(skin, type, name);
 
 			if (attachment is RegionAttachment) {
 				RegionAttachment regionAttachment = (RegionAttachment)attachment;

+ 2 - 31
spine-libgdx/src/com/esotericsoftware/spine/Skeleton.java

@@ -25,6 +25,8 @@
 
 package com.esotericsoftware.spine;
 
+import com.esotericsoftware.spine.attachments.Attachment;
+
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
@@ -117,37 +119,6 @@ public class Skeleton {
 			slots.get(i).setToBindPose(i);
 	}
 
-	public void draw (SpriteBatch batch) {
-		Array<Slot> drawOrder = this.drawOrder;
-		for (int i = 0, n = drawOrder.size; i < n; i++) {
-			Slot slot = drawOrder.get(i);
-			Attachment attachment = slot.attachment;
-			if (attachment != null) attachment.draw(batch, slot);
-		}
-	}
-
-	public void drawDebug (ShapeRenderer renderer) {
-		renderer.setColor(Color.RED);
-		renderer.begin(ShapeType.Line);
-		for (int i = 0, n = bones.size; i < n; i++) {
-			Bone bone = bones.get(i);
-			if (bone.parent == null) continue;
-			float x = bone.data.length * bone.m00 + bone.worldX;
-			float y = bone.data.length * bone.m10 + bone.worldY;
-			renderer.line(bone.worldX, bone.worldY, x, y);
-		}
-		renderer.end();
-
-		renderer.setColor(Color.GREEN);
-		renderer.begin(ShapeType.Filled);
-		for (int i = 0, n = bones.size; i < n; i++) {
-			Bone bone = bones.get(i);
-			renderer.setColor(Color.GREEN);
-			renderer.circle(bone.worldX, bone.worldY, 3);
-		}
-		renderer.end();
-	}
-
 	public SkeletonData getData () {
 		return data;
 	}

+ 3 - 0
spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java

@@ -32,6 +32,9 @@ import com.esotericsoftware.spine.Animation.RotateTimeline;
 import com.esotericsoftware.spine.Animation.ScaleTimeline;
 import com.esotericsoftware.spine.Animation.Timeline;
 import com.esotericsoftware.spine.Animation.TranslateTimeline;
+import com.esotericsoftware.spine.attachments.Attachment;
+import com.esotericsoftware.spine.attachments.AttachmentLoader;
+import com.esotericsoftware.spine.attachments.AttachmentType;
 import com.esotericsoftware.spine.attachments.RegionAttachment;
 import com.esotericsoftware.spine.attachments.RegionSequenceAttachment;
 import com.esotericsoftware.spine.attachments.RegionSequenceAttachment.Mode;

+ 25 - 11
spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java

@@ -32,10 +32,13 @@ import com.esotericsoftware.spine.Animation.RotateTimeline;
 import com.esotericsoftware.spine.Animation.ScaleTimeline;
 import com.esotericsoftware.spine.Animation.Timeline;
 import com.esotericsoftware.spine.Animation.TranslateTimeline;
+import com.esotericsoftware.spine.attachments.AtlasAttachmentLoader;
+import com.esotericsoftware.spine.attachments.Attachment;
+import com.esotericsoftware.spine.attachments.AttachmentLoader;
+import com.esotericsoftware.spine.attachments.AttachmentType;
 import com.esotericsoftware.spine.attachments.RegionAttachment;
 import com.esotericsoftware.spine.attachments.RegionSequenceAttachment;
 import com.esotericsoftware.spine.attachments.RegionSequenceAttachment.Mode;
-import com.esotericsoftware.spine.attachments.AtlasAttachmentLoader;
 
 import com.badlogic.gdx.files.FileHandle;
 import com.badlogic.gdx.graphics.Color;
@@ -46,8 +49,6 @@ import com.badlogic.gdx.utils.ObjectMap.Entry;
 import com.badlogic.gdx.utils.OrderedMap;
 import com.badlogic.gdx.utils.SerializationException;
 
-import java.io.StringWriter;
-
 public class SkeletonJson {
 	static public final String TIMELINE_SCALE = "scale";
 	static public final String TIMELINE_ROTATE = "rotate";
@@ -161,7 +162,7 @@ public class SkeletonJson {
 		if (attachment instanceof RegionSequenceAttachment) {
 			RegionSequenceAttachment regionSequenceAttachment = (RegionSequenceAttachment)attachment;
 
-			Float fps = (Float)map.get("fps");
+			Float fps = getFloat(map, "fps");
 			if (fps == null) throw new SerializationException("Region sequence attachment missing fps: " + name);
 			regionSequenceAttachment.setFrameTime(fps);
 
@@ -187,6 +188,19 @@ public class SkeletonJson {
 	private float getFloat (OrderedMap map, String name, float defaultValue) {
 		Object value = map.get(name);
 		if (value == null) return defaultValue;
+		if (value instanceof Long) return (Long)value;
+		return (Float)value;
+	}
+
+	private float getFloat (OrderedMap map, String name) {
+		Object value = map.get(name);
+		if (value instanceof Long) return (Long)value;
+		return (Float)value;
+	}
+
+	private float getFloat (Array array, int index) {
+		Object value = array.get(index);
+		if (value instanceof Long) return (Long)value;
 		return (Float)value;
 	}
 
@@ -211,8 +225,8 @@ public class SkeletonJson {
 
 						int frameIndex = 0;
 						for (OrderedMap valueMap : values) {
-							float time = (Float)valueMap.get("time");
-							timeline.setFrame(frameIndex, time, (Float)valueMap.get("angle"));
+							float time = getFloat(valueMap, "time");
+							timeline.setFrame(frameIndex, time, getFloat(valueMap, "angle"));
 							readCurve(timeline, frameIndex, valueMap);
 							frameIndex++;
 						}
@@ -232,8 +246,8 @@ public class SkeletonJson {
 
 						int frameIndex = 0;
 						for (OrderedMap valueMap : values) {
-							float time = (Float)valueMap.get("time");
-							Float x = (Float)valueMap.get("x"), y = (Float)valueMap.get("y");
+							float time = getFloat(valueMap, "time");
+							Float x = getFloat(valueMap, "x"), y = getFloat(valueMap, "y");
 							timeline
 								.setFrame(frameIndex, time, x == null ? 0 : (x * timelineScale), y == null ? 0 : (y * timelineScale));
 							readCurve(timeline, frameIndex, valueMap);
@@ -264,7 +278,7 @@ public class SkeletonJson {
 
 						int frameIndex = 0;
 						for (OrderedMap valueMap : values) {
-							float time = (Float)valueMap.get("time");
+							float time = getFloat(valueMap, "time");
 							Color color = Color.valueOf((String)valueMap.get("color"));
 							timeline.setFrame(frameIndex, time, color.r, color.g, color.b, color.a);
 							readCurve(timeline, frameIndex, valueMap);
@@ -279,7 +293,7 @@ public class SkeletonJson {
 
 						int frameIndex = 0;
 						for (OrderedMap valueMap : values) {
-							float time = (Float)valueMap.get("time");
+							float time = getFloat(valueMap, "time");
 							timeline.setFrame(frameIndex++, time, (String)valueMap.get("name"));
 						}
 						timelines.add(timeline);
@@ -302,7 +316,7 @@ public class SkeletonJson {
 			timeline.setStepped(frameIndex);
 		else if (curveObject instanceof Array) {
 			Array curve = (Array)curveObject;
-			timeline.setCurve(frameIndex, (Float)curve.get(0), (Float)curve.get(1), (Float)curve.get(2), (Float)curve.get(3));
+			timeline.setCurve(frameIndex, getFloat(curve, 0), getFloat(curve, 1), getFloat(curve, 2), getFloat(curve, 3));
 		}
 	}
 }

+ 24 - 0
spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java

@@ -0,0 +1,24 @@
+
+package com.esotericsoftware.spine;
+
+import com.esotericsoftware.spine.attachments.Attachment;
+import com.esotericsoftware.spine.attachments.RegionAttachment;
+
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.utils.Array;
+
+public class SkeletonRenderer {
+	public void draw (SpriteBatch batch, Skeleton skeleton) {
+		Array<Slot> drawOrder = skeleton.drawOrder;
+		for (int i = 0, n = drawOrder.size; i < n; i++) {
+			Slot slot = drawOrder.get(i);
+			Attachment attachment = slot.attachment;
+			if (attachment instanceof RegionAttachment) {
+				RegionAttachment regionAttachment = (RegionAttachment)attachment;
+				regionAttachment.updateVertices(slot);
+				float[] vertices = regionAttachment.getVertices();
+				batch.draw(regionAttachment.getRegion().getTexture(), vertices, 0, vertices.length);
+			}
+		}
+	}
+}

+ 65 - 0
spine-libgdx/src/com/esotericsoftware/spine/SkeletonRendererDebug.java

@@ -0,0 +1,65 @@
+
+package com.esotericsoftware.spine;
+
+import com.esotericsoftware.spine.attachments.Attachment;
+import com.esotericsoftware.spine.attachments.RegionAttachment;
+
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import static com.badlogic.gdx.graphics.g2d.SpriteBatch.*;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
+import com.badlogic.gdx.utils.Array;
+
+public class SkeletonRendererDebug {
+	private ShapeRenderer renderer;
+
+	public SkeletonRendererDebug () {
+		renderer = new ShapeRenderer();
+	}
+
+	public void draw (SpriteBatch batch, Skeleton skeleton) {
+		renderer.begin(ShapeType.Line);
+
+		renderer.setColor(Color.RED);
+		Array<Bone> bones = skeleton.getBones();
+		for (int i = 0, n = bones.size; i < n; i++) {
+			Bone bone = bones.get(i);
+			if (bone.parent == null) continue;
+			float x = bone.data.length * bone.m00 + bone.worldX;
+			float y = bone.data.length * bone.m10 + bone.worldY;
+			renderer.line(bone.worldX, bone.worldY, x, y);
+		}
+
+		renderer.setColor(Color.BLUE);
+		Array<Slot> slots = skeleton.getSlots();
+		for (int i = 0, n = slots.size; i < n; i++) {
+			Slot slot = slots.get(i);
+			Attachment attachment = slot.attachment;
+			if (attachment instanceof RegionAttachment) {
+				RegionAttachment regionAttachment = (RegionAttachment)attachment;
+				regionAttachment.updateVertices(slot);
+				float[] vertices = regionAttachment.getVertices();
+				renderer.line(vertices[X1], vertices[Y1], vertices[X2], vertices[Y2]);
+				renderer.line(vertices[X2], vertices[Y2], vertices[X3], vertices[Y3]);
+				renderer.line(vertices[X3], vertices[Y3], vertices[X4], vertices[Y4]);
+				renderer.line(vertices[X4], vertices[Y4], vertices[X1], vertices[Y1]);
+			}
+		}
+
+		renderer.end();
+
+		renderer.setColor(Color.GREEN);
+		renderer.begin(ShapeType.Filled);
+		for (int i = 0, n = bones.size; i < n; i++) {
+			Bone bone = bones.get(i);
+			renderer.setColor(Color.GREEN);
+			renderer.circle(bone.worldX, bone.worldY, 3);
+		}
+		renderer.end();
+	}
+
+	public ShapeRenderer getShapeRenderer () {
+		return renderer;
+	}
+}

+ 2 - 0
spine-libgdx/src/com/esotericsoftware/spine/Skin.java

@@ -25,6 +25,8 @@
 
 package com.esotericsoftware.spine;
 
+import com.esotericsoftware.spine.attachments.Attachment;
+
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.ObjectMap;
 import com.badlogic.gdx.utils.ObjectMap.Entry;

+ 2 - 0
spine-libgdx/src/com/esotericsoftware/spine/Slot.java

@@ -25,6 +25,8 @@
 
 package com.esotericsoftware.spine;
 
+import com.esotericsoftware.spine.attachments.Attachment;
+
 import com.badlogic.gdx.graphics.Color;
 
 public class Slot {

+ 0 - 3
spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java

@@ -25,9 +25,6 @@
 
 package com.esotericsoftware.spine.attachments;
 
-import com.esotericsoftware.spine.Attachment;
-import com.esotericsoftware.spine.AttachmentLoader;
-import com.esotericsoftware.spine.AttachmentType;
 import com.esotericsoftware.spine.Skin;
 
 import com.badlogic.gdx.graphics.g2d.TextureAtlas;

+ 3 - 3
spine-libgdx/src/com/esotericsoftware/spine/Attachment.java → spine-libgdx/src/com/esotericsoftware/spine/attachments/Attachment.java

@@ -23,7 +23,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ******************************************************************************/
 
-package com.esotericsoftware.spine;
+package com.esotericsoftware.spine.attachments;
+
+import com.esotericsoftware.spine.Slot;
 
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 
@@ -35,8 +37,6 @@ abstract public class Attachment {
 		this.name = name;
 	}
 
-	abstract public void draw (SpriteBatch batch, Slot slot);
-
 	public String getName () {
 		return name;
 	}

+ 3 - 1
spine-libgdx/src/com/esotericsoftware/spine/AttachmentLoader.java → spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java

@@ -23,7 +23,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ******************************************************************************/
 
-package com.esotericsoftware.spine;
+package com.esotericsoftware.spine.attachments;
+
+import com.esotericsoftware.spine.Skin;
 
 public interface AttachmentLoader {
 	/** @return May be null to not load any attachment. */

+ 1 - 1
spine-libgdx/src/com/esotericsoftware/spine/AttachmentType.java → spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java

@@ -23,7 +23,7 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ******************************************************************************/
 
-package com.esotericsoftware.spine;
+package com.esotericsoftware.spine.attachments;
 
 public enum AttachmentType {
 	region, regionSequence

+ 4 - 13
spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java

@@ -25,7 +25,6 @@
 
 package com.esotericsoftware.spine.attachments;
 
-import com.esotericsoftware.spine.Attachment;
 import com.esotericsoftware.spine.Bone;
 import com.esotericsoftware.spine.Slot;
 
@@ -128,13 +127,11 @@ public class RegionAttachment extends Attachment {
 	}
 
 	public TextureRegion getRegion () {
-		if (region == null) throw new IllegalStateException("RegionAttachment is not resolved: " + this);
+		if (region == null) throw new IllegalStateException("Region has not been set: " + this);
 		return region;
 	}
 
-	public void draw (SpriteBatch batch, Slot slot) {
-		if (region == null) throw new IllegalStateException("RegionAttachment is not resolved: " + this);
-
+	public void updateVertices (Slot slot) {
 		Color skeletonColor = slot.getSkeleton().getColor();
 		Color slotColor = slot.getColor();
 		float color = NumberUtils.intToFloatColor( //
@@ -148,14 +145,8 @@ public class RegionAttachment extends Attachment {
 		vertices[C3] = color;
 		vertices[C4] = color;
 
-		updateWorldVertices(slot.getBone());
-
-		batch.draw(region.getTexture(), vertices, 0, vertices.length);
-	}
-
-	public void updateWorldVertices (Bone bone) {
-		float[] vertices = this.vertices;
 		float[] offset = this.offset;
+		Bone bone = slot.getBone();
 		float x = bone.getWorldX();
 		float y = bone.getWorldY();
 		float m00 = bone.getM00();
@@ -172,7 +163,7 @@ public class RegionAttachment extends Attachment {
 		vertices[Y4] = offset[6] * m10 + offset[7] * m11 + y;
 	}
 
-	public float[] getWorldVertices () {
+	public float[] getVertices () {
 		return vertices;
 	}
 

+ 5 - 5
spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionSequenceAttachment.java

@@ -41,8 +41,8 @@ public class RegionSequenceAttachment extends RegionAttachment {
 		super(name);
 	}
 
-	public void draw (SpriteBatch batch, Slot slot) {
-		if (regions == null) throw new IllegalStateException("RegionSequenceAttachment is not resolved: " + this);
+	public void updateVertices (Slot slot) {
+		if (regions == null) throw new IllegalStateException("Regions have not been set: " + this);
 
 		int frameIndex = (int)(slot.getAttachmentTime() / frameTime);
 		switch (mode) {
@@ -68,12 +68,12 @@ public class RegionSequenceAttachment extends RegionAttachment {
 			break;
 		}
 		setRegion(regions[frameIndex]);
-		super.draw(batch, slot);
+
+		super.updateVertices(slot);
 	}
 
-	/** May be null if the attachment is not resolved. */
 	public TextureRegion[] getRegions () {
-		if (regions == null) throw new IllegalStateException("RegionSequenceAttachment is not resolved: " + this);
+		if (regions == null) throw new IllegalStateException("Regions have not been set: " + this);
 		return regions;
 	}
 

+ 10 - 6
spine-libgdx/test/com/esotericsoftware/spine/AnimationStateTest.java

@@ -35,7 +35,8 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 
 public class AnimationStateTest extends ApplicationAdapter {
 	SpriteBatch batch;
-	ShapeRenderer renderer;
+	SkeletonRenderer renderer;
+	SkeletonRendererDebug debugRenderer;
 
 	TextureAtlas atlas;
 	Skeleton skeleton;
@@ -44,11 +45,12 @@ public class AnimationStateTest extends ApplicationAdapter {
 
 	public void create () {
 		batch = new SpriteBatch();
-		renderer = new ShapeRenderer();
+		renderer = new SkeletonRenderer();
+		debugRenderer = new SkeletonRendererDebug();
 
 		atlas = new TextureAtlas(Gdx.files.internal("spineboy.atlas"));
 		SkeletonJson json = new SkeletonJson(atlas);
-		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy-skeleton.json"));
+		SkeletonData skeletonData = json.readSkeletonData(Gdx.files.internal("spineboy.json"));
 
 		// Define mixing between animations.
 		AnimationStateData stateData = new AnimationStateData(skeletonData);
@@ -71,7 +73,6 @@ public class AnimationStateTest extends ApplicationAdapter {
 		state.update(Gdx.graphics.getDeltaTime() / 3);
 
 		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
-		batch.begin();
 
 		state.apply(skeleton);
 		if (state.getAnimation().getName().equals("walk")) {
@@ -81,14 +82,17 @@ public class AnimationStateTest extends ApplicationAdapter {
 			if (state.getTime() > 1) state.setAnimation("walk", true);
 		}
 		skeleton.updateWorldTransform();
-		skeleton.draw(batch);
 
+		batch.begin();
+		renderer.draw(batch, skeleton);
 		batch.end();
+
+		debugRenderer.draw(batch, skeleton);
 	}
 
 	public void resize (int width, int height) {
 		batch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
-		renderer.setProjectionMatrix(batch.getProjectionMatrix());
+		debugRenderer.getShapeRenderer().setProjectionMatrix(batch.getProjectionMatrix());
 	}
 
 	public void dispose () {

+ 9 - 8
spine-libgdx/test/com/esotericsoftware/spine/MixTest.java

@@ -38,7 +38,8 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 public class MixTest extends ApplicationAdapter {
 	SpriteBatch batch;
 	float time;
-	ShapeRenderer renderer;
+	SkeletonRenderer renderer;
+	SkeletonRendererDebug debugRenderer;
 
 	SkeletonData skeletonData;
 	Skeleton skeleton;
@@ -47,7 +48,8 @@ public class MixTest extends ApplicationAdapter {
 
 	public void create () {
 		batch = new SpriteBatch();
-		renderer = new ShapeRenderer();
+		renderer = new SkeletonRenderer();
+		debugRenderer = new SkeletonRendererDebug();
 
 		final String name = "spineboy";
 
@@ -56,7 +58,7 @@ public class MixTest extends ApplicationAdapter {
 		if (true) {
 			SkeletonJson json = new SkeletonJson(atlas);
 			// json.setScale(2);
-			skeletonData = json.readSkeletonData(Gdx.files.internal(name + "-skeleton.json"));
+			skeletonData = json.readSkeletonData(Gdx.files.internal(name + ".json"));
 		} else {
 			SkeletonBinary binary = new SkeletonBinary(atlas);
 			// binary.setScale(2);
@@ -94,8 +96,6 @@ public class MixTest extends ApplicationAdapter {
 		root.setX(root.getX() + speed * delta);
 
 		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
-		batch.begin();
-		batch.setColor(Color.GRAY);
 
 		// This shows how to manage state manually. See AnimationStatesTest.
 		if (time > total) {
@@ -123,16 +123,17 @@ public class MixTest extends ApplicationAdapter {
 
 		skeleton.updateWorldTransform();
 		skeleton.update(Gdx.graphics.getDeltaTime());
-		skeleton.draw(batch);
 
+		batch.begin();
+		renderer.draw(batch, skeleton);
 		batch.end();
 
-		// skeleton.drawDebug(renderer);
+		debugRenderer.draw(batch, skeleton);
 	}
 
 	public void resize (int width, int height) {
 		batch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
-		renderer.setProjectionMatrix(batch.getProjectionMatrix());
+		debugRenderer.getShapeRenderer().setProjectionMatrix(batch.getProjectionMatrix());
 	}
 
 	public static void main (String[] args) throws Exception {

+ 8 - 7
spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java

@@ -46,7 +46,8 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 public class SkeletonTest extends ApplicationAdapter {
 	SpriteBatch batch;
 	float time;
-	ShapeRenderer renderer;
+	SkeletonRenderer renderer;
+	SkeletonRendererDebug debugRenderer;
 
 	SkeletonData skeletonData;
 	Skeleton skeleton;
@@ -54,7 +55,8 @@ public class SkeletonTest extends ApplicationAdapter {
 
 	public void create () {
 		batch = new SpriteBatch();
-		renderer = new ShapeRenderer();
+		renderer = new SkeletonRenderer();
+		debugRenderer = new SkeletonRendererDebug();
 
 		final String name = "goblins"; // "spineboy";
 
@@ -118,22 +120,21 @@ public class SkeletonTest extends ApplicationAdapter {
 		root.setX(x);
 
 		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
-		batch.begin();
-		batch.setColor(Color.GRAY);
 
 		animation.apply(skeleton, time, true);
 		skeleton.updateWorldTransform();
 		skeleton.update(Gdx.graphics.getDeltaTime());
-		skeleton.draw(batch);
 
+		batch.begin();
+		renderer.draw(batch, skeleton);
 		batch.end();
 
-		skeleton.drawDebug(renderer);
+		debugRenderer.draw(batch, skeleton);
 	}
 
 	public void resize (int width, int height) {
 		batch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
-		renderer.setProjectionMatrix(batch.getProjectionMatrix());
+		debugRenderer.getShapeRenderer().setProjectionMatrix(batch.getProjectionMatrix());
 	}
 
 	public static void main (String[] args) throws Exception {

+ 2 - 0
spine-unity/Assets/Plugins/Spine/SkeletonComponent.cs

@@ -61,6 +61,7 @@ public class SkeletonComponent : MonoBehaviour {
 
 		skeleton = new Skeleton(skeletonDataAsset.GetSkeletonData(false));
 	}
+
 	public void Update () {
 		// Clear fields if missing information to render.
 		if (skeletonDataAsset == null || skeletonDataAsset.GetSkeletonData(false) == null) {
@@ -83,6 +84,7 @@ public class SkeletonComponent : MonoBehaviour {
 		state.Loop = loop;
 
 		// Apply animation.
+		skeleton.Update(Time.deltaTime * timeScale);
 		state.Update(Time.deltaTime * timeScale);
 		state.Apply(skeleton);
 		skeleton.UpdateWorldTransform();