Fixed parsing animations with no bone timelines.

This commit is contained in:
NathanSweet 2013-04-05 12:02:37 +02:00
parent b947ac02b6
commit 4ea3a8a632

View File

@ -195,54 +195,56 @@ public class SkeletonJson {
float duration = 0; float duration = 0;
OrderedMap<String, ?> bonesMap = (OrderedMap)map.get("bones"); OrderedMap<String, ?> bonesMap = (OrderedMap)map.get("bones");
for (Entry<String, ?> entry : bonesMap.entries()) { if (bonesMap != null) {
String boneName = entry.key; for (Entry<String, ?> entry : bonesMap.entries()) {
int boneIndex = skeletonData.findBoneIndex(boneName); String boneName = entry.key;
if (boneIndex == -1) throw new SerializationException("Bone not found: " + boneName); int boneIndex = skeletonData.findBoneIndex(boneName);
if (boneIndex == -1) throw new SerializationException("Bone not found: " + boneName);
OrderedMap<?, ?> timelineMap = (OrderedMap)entry.value; OrderedMap<?, ?> timelineMap = (OrderedMap)entry.value;
for (Entry timelineEntry : timelineMap.entries()) { for (Entry timelineEntry : timelineMap.entries()) {
Array<OrderedMap> values = (Array)timelineEntry.value; Array<OrderedMap> values = (Array)timelineEntry.value;
String timelineName = (String)timelineEntry.key; String timelineName = (String)timelineEntry.key;
if (timelineName.equals(TIMELINE_ROTATE)) { if (timelineName.equals(TIMELINE_ROTATE)) {
RotateTimeline timeline = new RotateTimeline(values.size); RotateTimeline timeline = new RotateTimeline(values.size);
timeline.setBoneIndex(boneIndex); timeline.setBoneIndex(boneIndex);
int keyframeIndex = 0; int keyframeIndex = 0;
for (OrderedMap valueMap : values) { for (OrderedMap valueMap : values) {
float time = (Float)valueMap.get("time"); float time = (Float)valueMap.get("time");
timeline.setFrame(keyframeIndex, time, (Float)valueMap.get("angle")); timeline.setFrame(keyframeIndex, time, (Float)valueMap.get("angle"));
readCurve(timeline, keyframeIndex, valueMap); readCurve(timeline, keyframeIndex, valueMap);
keyframeIndex++; keyframeIndex++;
} }
timelines.add(timeline); timelines.add(timeline);
duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]); duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 2 - 2]);
} else if (timelineName.equals(TIMELINE_TRANSLATE) || timelineName.equals(TIMELINE_SCALE)) { } else if (timelineName.equals(TIMELINE_TRANSLATE) || timelineName.equals(TIMELINE_SCALE)) {
TranslateTimeline timeline; TranslateTimeline timeline;
float timelineScale = 1; float timelineScale = 1;
if (timelineName.equals(TIMELINE_SCALE)) if (timelineName.equals(TIMELINE_SCALE))
timeline = new ScaleTimeline(values.size); timeline = new ScaleTimeline(values.size);
else { else {
timeline = new TranslateTimeline(values.size); timeline = new TranslateTimeline(values.size);
timelineScale = scale; timelineScale = scale;
} }
timeline.setBoneIndex(boneIndex); timeline.setBoneIndex(boneIndex);
int keyframeIndex = 0; int keyframeIndex = 0;
for (OrderedMap valueMap : values) { for (OrderedMap valueMap : values) {
float time = (Float)valueMap.get("time"); float time = (Float)valueMap.get("time");
Float x = (Float)valueMap.get("x"), y = (Float)valueMap.get("y"); Float x = (Float)valueMap.get("x"), y = (Float)valueMap.get("y");
timeline timeline.setFrame(keyframeIndex, time, x == null ? 0 : (x * timelineScale), y == null ? 0
.setFrame(keyframeIndex, time, x == null ? 0 : (x * timelineScale), y == null ? 0 : (y * timelineScale)); : (y * timelineScale));
readCurve(timeline, keyframeIndex, valueMap); readCurve(timeline, keyframeIndex, valueMap);
keyframeIndex++; keyframeIndex++;
} }
timelines.add(timeline); timelines.add(timeline);
duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 3 - 3]); duration = Math.max(duration, timeline.getFrames()[timeline.getFrameCount() * 3 - 3]);
} else } else
throw new RuntimeException("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); throw new RuntimeException("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
}
} }
} }