From 78a6e02312daf7957c8231c908409b958ceff7d6 Mon Sep 17 00:00:00 2001 From: Ali-RS <> Date: Mon, 29 Apr 2019 09:24:45 +0430 Subject: [PATCH 1/3] AnimComposer: save globalSpeed on export --- jme3-core/src/main/java/com/jme3/anim/AnimComposer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java index 5e95b099ed..ba65fd5154 100644 --- a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java +++ b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java @@ -300,6 +300,7 @@ public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); animClipMap = (Map) ic.readStringSavableMap("animClipMap", new HashMap()); + globalSpeed = ic.readFloat("globalSpeed", 1f); } @Override @@ -307,6 +308,7 @@ public void write(JmeExporter ex) throws IOException { super.write(ex); OutputCapsule oc = ex.getCapsule(this); oc.writeStringSavableMap(animClipMap, "animClipMap", new HashMap()); + oc.write(globalSpeed, "globalSpeed", 1f); } private class Layer implements JmeCloneable { From 6d7923e48692de45ce5354100e4b75eb4850aa97 Mon Sep 17 00:00:00 2001 From: Ali-RS <> Date: Mon, 29 Apr 2019 09:47:08 +0430 Subject: [PATCH 2/3] Updated TestModelExportingCloning to test AnimComposer.globalSpeed --- .../java/jme3test/model/anim/TestModelExportingCloning.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java b/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java index 63b5023d6a..7795753b9d 100644 --- a/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java +++ b/jme3-examples/src/main/java/jme3test/model/anim/TestModelExportingCloning.java @@ -61,18 +61,21 @@ public void simpleInitApp() { Spatial originalModel = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); composer = originalModel.getControl(AnimComposer.class); composer.setCurrentAction("Walk"); + composer.setGlobalSpeed(1.5f); rootNode.attachChild(originalModel); Spatial clonedModel = originalModel.clone(); clonedModel.move(10, 0, 0); composer = clonedModel.getControl(AnimComposer.class); composer.setCurrentAction("push"); + System.out.println("clonedModel: globalSpeed=" + composer.getGlobalSpeed()); rootNode.attachChild(clonedModel); Spatial exportedModel = BinaryExporter.saveAndLoad(assetManager, originalModel); exportedModel.move(20, 0, 0); composer = exportedModel.getControl(AnimComposer.class); composer.setCurrentAction("pull"); + System.out.println("exportedModel: globalSpeed=" + composer.getGlobalSpeed()); rootNode.attachChild(exportedModel); } } From 7fd1f9e08e4a636bd40fa8cbf63e48230c2509b2 Mon Sep 17 00:00:00 2001 From: Ali-RS <> Date: Mon, 29 Apr 2019 16:30:20 +0430 Subject: [PATCH 3/3] Fixed issue with AnimComposer.Layer cloning --- .../src/main/java/com/jme3/anim/AnimComposer.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java index ba65fd5154..d997ab39d1 100644 --- a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java +++ b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java @@ -29,7 +29,7 @@ public class AnimComposer extends AbstractControl { private Map layers = new LinkedHashMap<>(); public AnimComposer() { - layers.put(DEFAULT_LAYER, new Layer()); + layers.put(DEFAULT_LAYER, new Layer(this)); } /** @@ -171,7 +171,7 @@ public Action removeAction(String name) { } public void makeLayer(String name, AnimationMask mask) { - Layer l = new Layer(); + Layer l = new Layer(this); l.mask = mask; layers.put(name, l); } @@ -311,14 +311,19 @@ public void write(JmeExporter ex) throws IOException { oc.write(globalSpeed, "globalSpeed", 1f); } - private class Layer implements JmeCloneable { + private static class Layer implements JmeCloneable { + private AnimComposer ac; private Action currentAction; private AnimationMask mask; private float weight; private double time; + public Layer(AnimComposer ac) { + this.ac = ac; + } + public void advance(float tpf) { - time += tpf * currentAction.getSpeed() * globalSpeed; + time += tpf * currentAction.getSpeed() * ac.globalSpeed; // make sure negative time is in [0, length] range if (time < 0) { double length = currentAction.getLength(); @@ -339,6 +344,7 @@ public Object jmeClone() { @Override public void cloneFields(Cloner cloner, Object original) { + ac = cloner.clone(ac); currentAction = null; } }