Better draw order key loading.

This commit is contained in:
NathanSweet 2013-08-20 17:56:53 +02:00
parent f174b1a3cb
commit 4b7a9633a7
2 changed files with 39 additions and 25 deletions

View File

@ -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<SlotData> 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]);

View File

@ -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<SlotData> 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]);