From c971a4758f8aebf4b4d4ab9e0799193480353822 Mon Sep 17 00:00:00 2001 From: Nehon Date: Wed, 6 Dec 2017 20:32:38 +0100 Subject: [PATCH] Fixes animation time sampling when source data contains duplicate keyframes --- .../com/jme3/scene/plugins/gltf/TrackData.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java index 834785b79..53b66f352 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/TrackData.java @@ -36,8 +36,15 @@ public class TrackData { List keyFrames = new ArrayList<>(); TimeData timeData = timeArrays.get(0); Type type = timeData.type; + float lastTime = -1f; for (int i = 0; i < timeData.times.length; 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.time = time; setKeyFrameTransforms(type, keyFrame, timeData.times); @@ -79,13 +86,13 @@ public class TrackData { KeyFrame kf = keyFrames.get(i); //we need Interpolate between keyframes when transforms are sparse. times[i] = kf.time; - if(translations != null) { + if (translations != null) { populateTransform(Type.Translation, i, keyFrames, kf, translationIndices); } - if(rotations != null) { + if (rotations != null) { populateTransform(Type.Rotation, i, keyFrames, kf, rotationIndices); } - if(scales != null) { + if (scales != null) { populateTransform(Type.Scale, i, keyFrames, kf, scaleIndices); } } @@ -188,7 +195,7 @@ public class TrackData { return -1; } - public int getNbKeyFrames(){ + public int getNbKeyFrames() { if (times != null) { return times.length; }