mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 09:46:02 +08:00
Fixed parsing animations with no bone timelines.
This commit is contained in:
parent
b947ac02b6
commit
4ea3a8a632
@ -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 + ")");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user