Explorar o código

Better draw order key loading.

NathanSweet %!s(int64=12) %!d(string=hai) anos
pai
achega
4b7a9633a7

+ 21 - 16
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.graphics.g2d.TextureAtlas;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.DataInput;
 import com.badlogic.gdx.utils.DataInput;
-import com.badlogic.gdx.utils.IntArray;
 import com.badlogic.gdx.utils.SerializationException;
 import com.badlogic.gdx.utils.SerializationException;
 
 
 import java.io.IOException;
 import java.io.IOException;
@@ -169,8 +168,7 @@ public class SkeletonBinary {
 		Skin skin = new Skin(skinName);
 		Skin skin = new Skin(skinName);
 		for (int i = 0; i < slotCount; i++) {
 		for (int i = 0; i < slotCount; i++) {
 			int slotIndex = input.readInt(true);
 			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();
 				String name = input.readString();
 				skin.addAttachment(slotIndex, name, readAttachment(input, skin, name));
 				skin.addAttachment(slotIndex, name, readAttachment(input, skin, name));
 			}
 			}
@@ -211,8 +209,7 @@ public class SkeletonBinary {
 		float duration = 0;
 		float duration = 0;
 
 
 		try {
 		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 boneIndex = input.readInt(true);
 				int itemCount = input.readInt(true);
 				int itemCount = input.readInt(true);
 				for (int ii = 0; ii < itemCount; ii++) {
 				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 slotIndex = input.readInt(true);
 				int itemCount = input.readInt(true);
 				int itemCount = input.readInt(true);
 				for (int ii = 0; ii < itemCount; ii++) {
 				for (int ii = 0; ii < itemCount; ii++) {
@@ -304,21 +300,30 @@ public class SkeletonBinary {
 
 
 			int drawOrderCount = input.readInt(true);
 			int drawOrderCount = input.readInt(true);
 			if (drawOrderCount > 0) {
 			if (drawOrderCount > 0) {
-				Array<SlotData> slots = skeletonData.slots;
 				DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrderCount);
 				DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrderCount);
+				int slotCount = skeletonData.slots.size;
 				for (int i = 0; i < drawOrderCount; i++) {
 				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 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++) {
 					for (int ii = 0; ii < offsetCount; ii++) {
 						int slotIndex = input.readInt(true);
 						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);
 				timelines.add(timeline);
 				duration = Math.max(duration, timeline.getFrames()[drawOrderCount - 1]);
 				duration = Math.max(duration, timeline.getFrames()[drawOrderCount - 1]);

+ 18 - 9
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.Color;
 import com.badlogic.gdx.graphics.g2d.TextureAtlas;
 import com.badlogic.gdx.graphics.g2d.TextureAtlas;
 import com.badlogic.gdx.utils.Array;
 import com.badlogic.gdx.utils.Array;
-import com.badlogic.gdx.utils.IntArray;
 import com.badlogic.gdx.utils.JsonReader;
 import com.badlogic.gdx.utils.JsonReader;
 import com.badlogic.gdx.utils.JsonValue;
 import com.badlogic.gdx.utils.JsonValue;
 import com.badlogic.gdx.utils.SerializationException;
 import com.badlogic.gdx.utils.SerializationException;
@@ -299,20 +298,30 @@ public class SkeletonJson {
 		JsonValue drawOrdersMap = map.get("draworder");
 		JsonValue drawOrdersMap = map.get("draworder");
 		if (drawOrdersMap != null) {
 		if (drawOrdersMap != null) {
 			DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrdersMap.size);
 			DrawOrderTimeline timeline = new DrawOrderTimeline(drawOrdersMap.size);
-			Array<SlotData> slots = skeletonData.slots;
+			int slotCount = skeletonData.slots.size;
 			int frameIndex = 0;
 			int frameIndex = 0;
 			for (JsonValue drawOrderMap = drawOrdersMap.child; drawOrderMap != null; drawOrderMap = drawOrderMap.next()) {
 			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()) {
 				for (JsonValue offsetMap = drawOrderMap.getChild("offsets"); offsetMap != null; offsetMap = offsetMap.next()) {
 					int slotIndex = skeletonData.findSlotIndex(offsetMap.getString("slot"));
 					int slotIndex = skeletonData.findSlotIndex(offsetMap.getString("slot"));
 					if (slotIndex == -1) throw new SerializationException("Slot not found: " + 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);
 			timelines.add(timeline);
 			duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() - 1]);
 			duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() - 1]);