From 285d6bb86cbf1ebe62f1be053d0290e06aa4f0a8 Mon Sep 17 00:00:00 2001 From: Nehon Date: Sat, 19 Aug 2017 23:19:42 +0200 Subject: [PATCH] Pad data when animation doesn't start at 0. --- .../jme3/scene/plugins/gltf/GltfLoader.java | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java index 33cc0b36c..41551b9ec 100644 --- a/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java +++ b/jme3-plugins/src/gltf/java/com/jme3/scene/plugins/gltf/GltfLoader.java @@ -636,17 +636,10 @@ public class GltfLoader implements AssetLoader { animData.times = times; } else { //check if we are loading the same time array - //TODO specs actually don't forbid this...maybe remove this check and handle it. if (animData.times != times) { + //TODO there might be work to do here... if the inputs are different we might want to merge the different times array... + //easier said than done. logger.log(Level.WARNING, "Channel has different input accessors for samplers"); -// for (float time : animData.times) { -// System.err.print(time + ", "); -// } -// System.err.println(""); -// for (float time : times) { -// System.err.print(time + ", "); -// } -// System.err.println(""); } } if (animData.length == null) { @@ -682,6 +675,7 @@ public class GltfLoader implements AssetLoader { if (animData.length > anim.getLength()) { anim.setLength(animData.length); } + animData.update(); Object node = fetchFromCache("nodes", i, Object.class); if (node instanceof Spatial) { Spatial s = (Spatial) node; @@ -964,6 +958,37 @@ public class GltfLoader implements AssetLoader { Vector3f[] scales; //not used for now float[] weights; + + public void update() { + if (times[0] > 0) { + //Anim doesn't start at 0, JME can't handle that and will interpolate transforms linearly from 0 to the first frame of the anim. + //we need to add a frame at 0 that copies the first real frame + + float[] newTimes = new float[times.length + 1]; + newTimes[0] = 0f; + System.arraycopy(times, 0, newTimes, 1, times.length); + times = newTimes; + + if (translations != null) { + Vector3f[] newTranslations = new Vector3f[translations.length + 1]; + newTranslations[0] = translations[0]; + System.arraycopy(translations, 0, newTranslations, 1, translations.length); + translations = newTranslations; + } + if (rotations != null) { + Quaternion[] newRotations = new Quaternion[rotations.length + 1]; + newRotations[0] = rotations[0]; + System.arraycopy(rotations, 0, newRotations, 1, rotations.length); + rotations = newRotations; + } + if (scales != null) { + Vector3f[] newScales = new Vector3f[scales.length + 1]; + newScales[0] = scales[0]; + System.arraycopy(scales, 0, newScales, 1, scales.length); + scales = newScales; + } + } + } } private class BoneWrapper {