From d8a3f2231c39c65539ef5d82c8d9feccac3a1e3d Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Thu, 7 Nov 2013 21:48:06 +0100 Subject: [PATCH] Refactored AttachmentLoader, allowing parameters per attachment type. Added attachment path. Added per attachment color. --- .../spine/SkeletonBinary.java | 46 ++++++++-------- .../esotericsoftware/spine/SkeletonJson.java | 52 +++++++++---------- .../attachments/AtlasAttachmentLoader.java | 32 ++++-------- .../spine/attachments/AttachmentLoader.java | 5 +- .../spine/attachments/AttachmentType.java | 2 +- .../spine/attachments/RegionAttachment.java | 32 ++++++++---- .../esotericsoftware/spine/Box2DExample.java | 4 +- 7 files changed, 84 insertions(+), 89 deletions(-) diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java index 42181419e..6d22349e9 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java @@ -48,8 +48,6 @@ import com.esotericsoftware.spine.attachments.AttachmentLoader; import com.esotericsoftware.spine.attachments.AttachmentType; import com.esotericsoftware.spine.attachments.BoundingBoxAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; -import com.esotericsoftware.spine.attachments.RegionSequenceAttachment; -import com.esotericsoftware.spine.attachments.RegionSequenceAttachment.Mode; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -189,35 +187,33 @@ public class SkeletonBinary { String name = input.readString(); if (name == null) name = attachmentName; - AttachmentType type = AttachmentType.values()[input.readByte()]; - Attachment attachment = attachmentLoader.newAttachment(skin, type, name); - - if (attachment instanceof RegionSequenceAttachment) { - RegionSequenceAttachment regionSequenceAttachment = (RegionSequenceAttachment)attachment; - regionSequenceAttachment.setFrameTime(1 / input.readFloat()); - regionSequenceAttachment.setMode(Mode.values()[input.readInt(true)]); - - } else if (attachment instanceof RegionAttachment) { - RegionAttachment regionAttachment = (RegionAttachment)attachment; - regionAttachment.setX(input.readFloat() * scale); - regionAttachment.setY(input.readFloat() * scale); - regionAttachment.setScaleX(input.readFloat()); - regionAttachment.setScaleY(input.readFloat()); - regionAttachment.setRotation(input.readFloat()); - regionAttachment.setWidth(input.readFloat() * scale); - regionAttachment.setHeight(input.readFloat() * scale); - regionAttachment.updateOffset(); - - } else if (attachment instanceof BoundingBoxAttachment) { - BoundingBoxAttachment box = (BoundingBoxAttachment)attachment; + switch (AttachmentType.values()[input.readByte()]) { + case region: + String path = input.readString(); + if (path.length() == 0) path = name; + RegionAttachment region = attachmentLoader.newRegionAttachment(skin, name, path); + if (region == null) return null; + region.setX(input.readFloat() * scale); + region.setY(input.readFloat() * scale); + region.setScaleX(input.readFloat()); + region.setScaleY(input.readFloat()); + region.setRotation(input.readFloat()); + region.setWidth(input.readFloat() * scale); + region.setHeight(input.readFloat() * scale); + Color.rgba8888ToColor(region.getColor(), input.readInt()); + region.updateOffset(); + return region; + case boundingbox: + BoundingBoxAttachment box = attachmentLoader.newBoundingBoxAttachment(skin, name); + if (box == null) return null; int n = input.readInt(true); float[] points = new float[n]; for (int i = 0; i < n; i++) points[i] = input.readFloat(); box.setVertices(points); + return box; } - - return attachment; + return null; } private void readAnimation (String name, DataInput input, SkeletonData skeletonData) { diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java index 217a7fe7d..5a24d246d 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -48,8 +48,6 @@ import com.esotericsoftware.spine.attachments.AttachmentLoader; import com.esotericsoftware.spine.attachments.AttachmentType; import com.esotericsoftware.spine.attachments.BoundingBoxAttachment; import com.esotericsoftware.spine.attachments.RegionAttachment; -import com.esotericsoftware.spine.attachments.RegionSequenceAttachment; -import com.esotericsoftware.spine.attachments.RegionSequenceAttachment.Mode; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -170,40 +168,42 @@ public class SkeletonJson { private Attachment readAttachment (Skin skin, String name, JsonValue map) { name = map.getString("name", name); - AttachmentType type = AttachmentType.valueOf(map.getString("type", AttachmentType.region.name())); - Attachment attachment = attachmentLoader.newAttachment(skin, type, name); + switch (AttachmentType.valueOf(map.getString("type", AttachmentType.region.name()))) { + case region: + RegionAttachment region = attachmentLoader.newRegionAttachment(skin, name, map.getString("path", name)); + region.setX(map.getFloat("x", 0) * scale); + region.setY(map.getFloat("y", 0) * scale); + region.setScaleX(map.getFloat("scaleX", 1)); + region.setScaleY(map.getFloat("scaleY", 1)); + region.setRotation(map.getFloat("rotation", 0)); + region.setWidth(map.getFloat("width") * scale); + region.setHeight(map.getFloat("height") * scale); - if (attachment instanceof RegionSequenceAttachment) { - RegionSequenceAttachment regionSequenceAttachment = (RegionSequenceAttachment)attachment; + String color = map.getString("color", null); + if (color != null) region.getColor().set(Color.valueOf(color)); - float fps = map.getFloat("fps"); - regionSequenceAttachment.setFrameTime(fps); - - String modeString = map.getString("mode"); - regionSequenceAttachment.setMode(modeString == null ? Mode.forward : Mode.valueOf(modeString)); - - } else if (attachment instanceof RegionAttachment) { - RegionAttachment regionAttachment = (RegionAttachment)attachment; - regionAttachment.setX(map.getFloat("x", 0) * scale); - regionAttachment.setY(map.getFloat("y", 0) * scale); - regionAttachment.setScaleX(map.getFloat("scaleX", 1)); - regionAttachment.setScaleY(map.getFloat("scaleY", 1)); - regionAttachment.setRotation(map.getFloat("rotation", 0)); - regionAttachment.setWidth(map.getFloat("width", 32) * scale); - regionAttachment.setHeight(map.getFloat("height", 32) * scale); - regionAttachment.updateOffset(); - - } else if (attachment instanceof BoundingBoxAttachment) { - BoundingBoxAttachment box = (BoundingBoxAttachment)attachment; + region.updateOffset(); + return region; + case boundingbox: + BoundingBoxAttachment box = attachmentLoader.newBoundingBoxAttachment(skin, name); JsonValue verticesArray = map.require("vertices"); float[] vertices = new float[verticesArray.size]; int i = 0; for (JsonValue point = verticesArray.child; point != null; point = point.next()) vertices[i++] = point.asFloat() * scale; box.setVertices(vertices); + return box; } - return attachment; + // RegionSequenceAttachment regionSequenceAttachment = (RegionSequenceAttachment)attachment; + // + // float fps = map.getFloat("fps"); + // regionSequenceAttachment.setFrameTime(fps); + // + // String modeString = map.getString("mode"); + // regionSequenceAttachment.setMode(modeString == null ? Mode.forward : Mode.valueOf(modeString)); + + return null; } private void readAnimation (String name, JsonValue map, SkeletonData skeletonData) { diff --git a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java index aa022dd2a..bb0532f20 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java @@ -46,28 +46,16 @@ public class AtlasAttachmentLoader implements AttachmentLoader { this.atlas = atlas; } - public Attachment newAttachment (Skin skin, AttachmentType type, String name) { - Attachment attachment = null; - switch (type) { - case region: - attachment = new RegionAttachment(name); - break; - case regionsequence: - attachment = new RegionSequenceAttachment(name); - break; - case boundingbox: - return new BoundingBoxAttachment(name); - default: - throw new IllegalArgumentException("Unknown attachment type: " + type); - } - - if (attachment instanceof RegionAttachment) { - AtlasRegion region = atlas.findRegion(attachment.getName()); - if (region == null) - throw new RuntimeException("Region not found in atlas: " + attachment + " (" + type + " attachment: " + name + ")"); - ((RegionAttachment)attachment).setRegion(region); - } - + public RegionAttachment newRegionAttachment (Skin skin, String name, String path) { + RegionAttachment attachment = new RegionAttachment(name); + AtlasRegion region = atlas.findRegion(path); + if (region == null) + throw new RuntimeException("Region not found in atlas: " + attachment + " (region attachment: " + name + ")"); + attachment.setRegion(region); return attachment; } + + public BoundingBoxAttachment newBoundingBoxAttachment (Skin skin, String name) { + return new BoundingBoxAttachment(name); + } } diff --git a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java index ef740200c..c34cc38c7 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentLoader.java @@ -37,5 +37,8 @@ import com.esotericsoftware.spine.Skin; public interface AttachmentLoader { /** @return May be null to not load any attachment. */ - public Attachment newAttachment (Skin skin, AttachmentType type, String name); + public RegionAttachment newRegionAttachment (Skin skin, String name, String path); + + /** @return May be null to not load any attachment. */ + public BoundingBoxAttachment newBoundingBoxAttachment (Skin skin, String name); } diff --git a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java index f4edf6bd3..00f52b7c8 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/attachments/AttachmentType.java @@ -34,5 +34,5 @@ package com.esotericsoftware.spine.attachments; public enum AttachmentType { - region, regionsequence, boundingbox + region, boundingbox } diff --git a/spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java b/spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java index 217c1b6e4..e3ae145e9 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/attachments/RegionAttachment.java @@ -60,6 +60,7 @@ public class RegionAttachment extends Attachment { private float x, y, scaleX = 1, scaleY = 1, rotation, width, height; private final float[] vertices = new float[20]; private final float[] offset = new float[8]; + private final Color color = new Color(1, 1, 1, 1); public RegionAttachment (String name) { super(name); @@ -151,21 +152,26 @@ public class RegionAttachment extends Attachment { Skeleton skeleton = slot.getSkeleton(); Color skeletonColor = skeleton.getColor(); Color slotColor = slot.getColor(); + Color regionColor = color; + float r = skeletonColor.r * slotColor.r * regionColor.r; + float g = skeletonColor.g * slotColor.g * regionColor.g; + float b = skeletonColor.b * slotColor.b * regionColor.b; + float a = skeletonColor.a * slotColor.a * regionColor.a * 255; float color; if (premultipliedAlpha) { - float a = 255 * skeletonColor.a * slotColor.a; - color = NumberUtils.intToFloatColor( // - ((int)a << 24) // - | ((int)(a * skeletonColor.b * slotColor.b) << 16) // - | ((int)(a * skeletonColor.g * slotColor.g) << 8) // - | ((int)(a * skeletonColor.r * slotColor.r))); + r *= a; + g *= a; + b *= a; } else { - color = NumberUtils.intToFloatColor( // - ((int)(255 * skeletonColor.a * slotColor.a) << 24) // - | ((int)(255 * skeletonColor.b * slotColor.b) << 16) // - | ((int)(255 * skeletonColor.g * slotColor.g) << 8) // - | ((int)(255 * skeletonColor.r * slotColor.r))); + r *= 255; + g *= 255; + b *= 255; } + color = NumberUtils.intToFloatColor( // + ((int)(a) << 24) // + | ((int)(b) << 16) // + | ((int)(g) << 8) // + | ((int)(r))); float[] vertices = this.vertices; float[] offset = this.offset; @@ -265,4 +271,8 @@ public class RegionAttachment extends Attachment { public void setHeight (float height) { this.height = height; } + + public Color getColor () { + return color; + } } diff --git a/spine-libgdx/test/com/esotericsoftware/spine/Box2DExample.java b/spine-libgdx/test/com/esotericsoftware/spine/Box2DExample.java index 09df02fd0..9b35f77a0 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/Box2DExample.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/Box2DExample.java @@ -34,8 +34,6 @@ package com.esotericsoftware.spine; import com.esotericsoftware.spine.attachments.AtlasAttachmentLoader; -import com.esotericsoftware.spine.attachments.Attachment; -import com.esotericsoftware.spine.attachments.AttachmentType; import com.esotericsoftware.spine.attachments.RegionAttachment; import com.badlogic.gdx.ApplicationAdapter; @@ -87,7 +85,7 @@ public class Box2DExample extends ApplicationAdapter { // This loader creates Box2dAttachments instead of RegionAttachments for an easy way to keep // track of the Box2D body for each attachment. AtlasAttachmentLoader atlasLoader = new AtlasAttachmentLoader(atlas) { - public Attachment newAttachment (Skin skin, AttachmentType type, String name) { + public RegionAttachment newRegionAttachment (Skin skin, String name, String path) { Box2dAttachment attachment = new Box2dAttachment(name); AtlasRegion region = atlas.findRegion(attachment.getName()); if (region == null) throw new RuntimeException("Region not found in atlas: " + attachment);