diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java index 12a43c802..5001ab8f6 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java @@ -47,7 +47,6 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.DataInput; -import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.SerializationException; import java.io.IOException; @@ -169,8 +168,7 @@ public class SkeletonBinary { Skin skin = new Skin(skinName); for (int i = 0; i < slotCount; i++) { int slotIndex = input.readInt(true); - int attachmentCount = input.readInt(true); - for (int ii = 0; ii < attachmentCount; ii++) { + for (int ii = 0, nn = input.readInt(true); ii < nn; ii++) { String name = input.readString(); skin.addAttachment(slotIndex, name, readAttachment(input, skin, name)); } @@ -211,8 +209,7 @@ public class SkeletonBinary { float duration = 0; try { - int boneCount = input.readInt(true); - for (int i = 0; i < boneCount; i++) { + for (int i = 0, n = input.readInt(true); i < n; i++) { int boneIndex = input.readInt(true); int itemCount = input.readInt(true); for (int ii = 0; ii < itemCount; ii++) { @@ -253,8 +250,7 @@ public class SkeletonBinary { } } - int slotCount = input.readInt(true); - for (int i = 0; i < slotCount; i++) { + for (int i = 0, n = input.readInt(true); i < n; i++) { int slotIndex = input.readInt(true); int itemCount = input.readInt(true); for (int ii = 0; ii < itemCount; ii++) { @@ -304,21 +300,30 @@ public class SkeletonBinary { int drawOrderCount = input.readInt(true); if (drawOrderCount > 0) { - Array slots = skeletonData.slots; DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrderCount); + int slotCount = skeletonData.slots.size; for (int i = 0; i < drawOrderCount; i++) { - IntArray drawOrder = new IntArray(slots.size); - for (int ii = 0, n = slots.size; ii < n; ii++) - drawOrder.add(ii); - int offsetCount = input.readInt(true); + int[] drawOrder = new int[slotCount]; + for (int ii = slotCount - 1; ii >= 0; ii--) + drawOrder[ii] = -1; + int[] unchanged = new int[slotCount - offsetCount]; + int originalIndex = 0, unchangedIndex = 0; for (int ii = 0; ii < offsetCount; ii++) { int slotIndex = input.readInt(true); - int index = drawOrder.indexOf(slotIndex); - drawOrder.removeIndex(index); - drawOrder.insert(index + input.readInt(true), slotIndex); + // Collect unchanged items. + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + // Set changed items. + drawOrder[originalIndex + input.readInt(true)] = originalIndex++; } - timeline.setFrame(i, input.readFloat(), drawOrder.toArray()); + // Collect remaining unchanged items. + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + // Fill in unchanged items. + for (int ii = slotCount - 1; ii >= 0; ii--) + if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex]; + timeline.setFrame(i, input.readFloat(), drawOrder); } timelines.add(timeline); duration = Math.max(duration, timeline.getFrames()[drawOrderCount - 1]); diff --git a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java index b6f2a7f36..67a627793 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java @@ -46,7 +46,6 @@ 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.IntArray; import com.badlogic.gdx.utils.JsonReader; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.SerializationException; @@ -299,20 +298,30 @@ public class SkeletonJson { JsonValue drawOrdersMap = map.get("draworder"); if (drawOrdersMap != null) { DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrdersMap.size); - Array slots = skeletonData.slots; + int slotCount = skeletonData.slots.size; int frameIndex = 0; for (JsonValue drawOrderMap = drawOrdersMap.child; drawOrderMap != null; drawOrderMap = drawOrderMap.next()) { - IntArray drawOrder = new IntArray(slots.size); - for (int i = 0, n = slots.size; i < n; i++) - drawOrder.add(i); + int[] drawOrder = new int[slotCount]; + for (int i = slotCount - 1; i >= 0; i--) + drawOrder[i] = -1; + int[] unchanged = new int[slotCount - drawOrderMap.get("offsets").size]; + int originalIndex = 0, unchangedIndex = 0; for (JsonValue offsetMap = drawOrderMap.getChild("offsets"); offsetMap != null; offsetMap = offsetMap.next()) { int slotIndex = skeletonData.findSlotIndex(offsetMap.getString("slot")); if (slotIndex == -1) throw new SerializationException("Slot not found: " + offsetMap.getString("slot")); - int index = drawOrder.indexOf(slotIndex); - drawOrder.removeIndex(index); - drawOrder.insert(index + offsetMap.getInt("offset"), slotIndex); + // Collect unchanged items. + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + // Set changed items. + drawOrder[originalIndex + offsetMap.getInt("offset")] = originalIndex++; } - timeline.setFrame(frameIndex++, drawOrderMap.getFloat("time"), drawOrder.toArray()); + // Collect remaining unchanged items. + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + // Fill in unchanged items. + for (int i = slotCount - 1; i >= 0; i--) + if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex]; + timeline.setFrame(frameIndex++, drawOrderMap.getFloat("time"), drawOrder); } timelines.add(timeline); duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() - 1]);