From 9349bd97c6325e280adac82a35734830b59ecb63 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Sat, 16 Jun 2012 15:06:47 +0000 Subject: [PATCH] MotionPath.setSpeed can now be fed with a negative value to go backward. Waypoints will be properly triggered and the spatial will stop if it reaches the end of the path. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9505 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../core/com/jme3/cinematic/MotionPath.java | 20 +++++++++---- .../jme3/cinematic/events/MotionTrack.java | 29 +++++++++++-------- .../jme3test/animation/TestMotionPath.java | 8 +++-- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/engine/src/core/com/jme3/cinematic/MotionPath.java b/engine/src/core/com/jme3/cinematic/MotionPath.java index cdb31d011..393d9409d 100644 --- a/engine/src/core/com/jme3/cinematic/MotionPath.java +++ b/engine/src/core/com/jme3/cinematic/MotionPath.java @@ -59,15 +59,15 @@ public class MotionPath implements Savable { private Node debugNode; private AssetManager assetManager; private List listeners; - private Spline spline = new Spline(); - private float eps = 0.0001f; + private Spline spline = new Spline(); + int prevWayPoint = 0; /** * Create a motion Path */ public MotionPath() { } - + /** * interpolate the path giving the time since the beginnin and the motionControl * this methods sets the new localTranslation to the spatial of the motionTrack control. @@ -89,19 +89,29 @@ public class MotionPath implements Savable { //setting values control.setCurrentWayPoint((int) v.x); control.setCurrentValue(v.y); - + //interpolating new position getSpline().interpolate(control.getCurrentValue(), control.getCurrentWayPoint(), temp); if (control.needsDirection()) { tmpVector.set(temp); control.setDirection(tmpVector.subtractLocal(control.getSpatial().getLocalTranslation()).normalizeLocal()); } - + checkWayPoint(control); + control.getSpatial().setLocalTranslation(temp); vars.release(); return traveledDistance; } + public void checkWayPoint(MotionTrack control) { + if (control.getCurrentWayPoint() != prevWayPoint) { + if (control.getCurrentValue() >= 0f && control.getCurrentValue() < 0.01) { + triggerWayPointReach(control.getCurrentWayPoint(), control); + prevWayPoint = control.getCurrentWayPoint(); + } + } + } + private void attachDebugNode(Node root) { if (debugNode == null) { debugNode = new Node(); diff --git a/engine/src/core/com/jme3/cinematic/events/MotionTrack.java b/engine/src/core/com/jme3/cinematic/events/MotionTrack.java index 850661639..40c6aaddd 100644 --- a/engine/src/core/com/jme3/cinematic/events/MotionTrack.java +++ b/engine/src/core/com/jme3/cinematic/events/MotionTrack.java @@ -161,15 +161,24 @@ public class MotionTrack extends AbstractCinematicEvent implements Control { public void update(float tpf) { if (isControl) { + internalUpdate(tpf); + } + } - if (playState == PlayState.Playing) { - time = time + (tpf * speed); - - if (time >= initialDuration && loopMode == loopMode.DontLoop) { - stop(); - } else { - onUpdate(tpf); + @Override + public void internalUpdate(float tpf) { + if (playState == PlayState.Playing) { + time = time + (tpf * speed); + if( loopMode == loopMode.Loop && time<0){ + time = initialDuration; + } + if ((time >= initialDuration || time < 0) && loopMode == loopMode.DontLoop) { + if (time >= initialDuration) { + path.triggerWayPointReach(path.getNbWayPoints() - 1, this); } + stop(); + } else { + onUpdate(tpf); } } } @@ -282,7 +291,6 @@ public class MotionTrack extends AbstractCinematicEvent implements Control { @Override public void onStop() { - setCurrentWayPoint(path.getNbWayPoints()-1); currentWayPoint = 0; } @@ -319,10 +327,7 @@ public class MotionTrack extends AbstractCinematicEvent implements Control { * */ public void setCurrentWayPoint(int currentWayPoint) { - if (this.currentWayPoint != currentWayPoint) { - this.currentWayPoint = currentWayPoint; - path.triggerWayPointReach(currentWayPoint, this); - } + this.currentWayPoint = currentWayPoint; } /** diff --git a/engine/src/test/jme3test/animation/TestMotionPath.java b/engine/src/test/jme3test/animation/TestMotionPath.java index 50cafb2bb..c83695f5e 100644 --- a/engine/src/test/jme3test/animation/TestMotionPath.java +++ b/engine/src/test/jme3test/animation/TestMotionPath.java @@ -31,6 +31,7 @@ */ package jme3test.animation; +import com.jme3.animation.LoopMode; import com.jme3.app.SimpleApplication; import com.jme3.cinematic.MotionPath; import com.jme3.cinematic.MotionPathListener; @@ -83,8 +84,7 @@ public class TestMotionPath extends SimpleApplication { motionControl.setDirectionType(MotionTrack.Direction.PathAndRotation); motionControl.setRotation(new Quaternion().fromAngleNormalAxis(-FastMath.HALF_PI, Vector3f.UNIT_Y)); motionControl.setInitialDuration(10f); - motionControl.setSpeed(2f); - + motionControl.setSpeed(2f); guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); final BitmapText wayPointsText = new BitmapText(guiFont, false); wayPointsText.setSize(guiFont.getCharSet().getRenderedSize()); @@ -105,6 +105,10 @@ public class TestMotionPath extends SimpleApplication { flyCam.setEnabled(false); ChaseCamera chaser = new ChaseCamera(cam, teapot); +// motionControl.setSpeed(-3f); +// motionControl.setLoopMode(LoopMode.Loop); +// path.setCycle(true); + // chaser.setEnabled(false); chaser.registerWithInput(inputManager);