Fixes animation time sampling when source data contains duplicate keyframes

empirephoenix-patch-1
Nehon 7 years ago
parent f47f865d1d
commit c971a4758f
  1. 15
      jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java

@ -36,8 +36,15 @@ public class TrackData {
List<KeyFrame> keyFrames = new ArrayList<>(); List<KeyFrame> keyFrames = new ArrayList<>();
TimeData timeData = timeArrays.get(0); TimeData timeData = timeArrays.get(0);
Type type = timeData.type; Type type = timeData.type;
float lastTime = -1f;
for (int i = 0; i < timeData.times.length; i++) { for (int i = 0; i < timeData.times.length; i++) {
float time = timeData.times[i]; float time = timeData.times[i];
//avoid some double keyframes that can have bad effects on interpolation
if (Float.floatToIntBits(time) == Float.floatToIntBits(lastTime)) {
lastTime = time;
continue;
}
lastTime = time;
KeyFrame keyFrame = new KeyFrame(); KeyFrame keyFrame = new KeyFrame();
keyFrame.time = time; keyFrame.time = time;
setKeyFrameTransforms(type, keyFrame, timeData.times); setKeyFrameTransforms(type, keyFrame, timeData.times);
@ -79,13 +86,13 @@ public class TrackData {
KeyFrame kf = keyFrames.get(i); KeyFrame kf = keyFrames.get(i);
//we need Interpolate between keyframes when transforms are sparse. //we need Interpolate between keyframes when transforms are sparse.
times[i] = kf.time; times[i] = kf.time;
if(translations != null) { if (translations != null) {
populateTransform(Type.Translation, i, keyFrames, kf, translationIndices); populateTransform(Type.Translation, i, keyFrames, kf, translationIndices);
} }
if(rotations != null) { if (rotations != null) {
populateTransform(Type.Rotation, i, keyFrames, kf, rotationIndices); populateTransform(Type.Rotation, i, keyFrames, kf, rotationIndices);
} }
if(scales != null) { if (scales != null) {
populateTransform(Type.Scale, i, keyFrames, kf, scaleIndices); populateTransform(Type.Scale, i, keyFrames, kf, scaleIndices);
} }
} }
@ -188,7 +195,7 @@ public class TrackData {
return -1; return -1;
} }
public int getNbKeyFrames(){ public int getNbKeyFrames() {
if (times != null) { if (times != null) {
return times.length; return times.length;
} }

Loading…
Cancel
Save