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 c290f01073..bc72f02fc5 100644 --- a/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java +++ b/jme3-core/src/main/java/com/jme3/anim/AnimComposer.java @@ -456,6 +456,37 @@ public void setGlobalSpeed(float globalSpeed) { this.globalSpeed = globalSpeed; } + /** + * Access the manager of the named layer. + * + * @param layerName the name of the layer to access + * @return the current manager (typically an AnimEvent) or null for none + */ + public Object getLayerManager(String layerName) { + Layer layer = layers.get(layerName); + if (layer == null) { + throw new IllegalArgumentException("Unknown layer " + layerName); + } + + return layer.manager; + } + + /** + * Assign a manager to the named layer. + * + * @param layerName the name of the layer to modify + * @param manager the desired manager (typically an AnimEvent) or null for + * none + */ + public void setLayerManager(String layerName, Object manager) { + Layer layer = layers.get(layerName); + if (layer == null) { + throw new IllegalArgumentException("Unknown layer " + layerName); + } + + layer.manager = manager; + } + /** * Create a shallow clone for the JME cloner. * @@ -539,6 +570,7 @@ private static class Layer implements JmeCloneable { private Action currentAction; private AnimationMask mask; private double time; + private Object manager; public Layer(AnimComposer ac) { this.ac = ac; diff --git a/jme3-core/src/main/java/com/jme3/cinematic/events/AnimEvent.java b/jme3-core/src/main/java/com/jme3/cinematic/events/AnimEvent.java index de283e6da4..f9a8f3c5ec 100644 --- a/jme3-core/src/main/java/com/jme3/cinematic/events/AnimEvent.java +++ b/jme3-core/src/main/java/com/jme3/cinematic/events/AnimEvent.java @@ -120,8 +120,11 @@ public void initEvent(Application app, Cinematic cinematic) { public void onPause() { logger.log(Level.SEVERE, ""); - Action eventAction = composer.action(actionName); - eventAction.setSpeed(0f); + Object layerManager = composer.getLayerManager(layerName); + if (layerManager == this) { + Action eventAction = composer.action(actionName); + eventAction.setSpeed(0f); + } } /** @@ -142,6 +145,7 @@ public void onPlay() { composer.setTime(layerName, 0.0); } eventAction.setSpeed(speed); + composer.setLayerManager(layerName, this); } /** @@ -150,7 +154,12 @@ public void onPlay() { @Override public void onStop() { logger.log(Level.INFO, ""); - composer.removeCurrentAction(layerName); + + Object layerManager = composer.getLayerManager(layerName); + if (layerManager == this) { + composer.removeCurrentAction(layerName); + composer.setLayerManager(layerName, null); + } } /** diff --git a/jme3-examples/src/main/java/jme3test/animation/TestJaime.java b/jme3-examples/src/main/java/jme3test/animation/TestJaime.java index 0b13cfee51..eca87267e8 100644 --- a/jme3-examples/src/main/java/jme3test/animation/TestJaime.java +++ b/jme3-examples/src/main/java/jme3test/animation/TestJaime.java @@ -159,10 +159,19 @@ public void setupCinematic(final Node jaime) { AnimClip forwardClip = af.buildAnimation(jaime); AnimComposer composer = jaime.getControl(AnimComposer.class); composer.addAnimClip(forwardClip); + /* + * Add a clip that warps the model to its starting position. + */ + AnimFactory af2 = new AnimFactory(0.01f, "StartingPosition", 30f); + af2.addTimeTranslation(0f, new Vector3f(0f, 0f, -3f)); + AnimClip startClip = af2.buildAnimation(jaime); + composer.addAnimClip(startClip); composer.makeLayer("SpatialLayer", null); String boneLayer = AnimComposer.DEFAULT_LAYER; + cinematic.addCinematicEvent(0f, + new AnimEvent(composer, "StartingPosition", "SpatialLayer")); cinematic.enqueueCinematicEvent( new AnimEvent(composer, "Idle", boneLayer)); float jumpStart = cinematic.enqueueCinematicEvent(