From c2ac08f70b4f9ccf831947e907df8ebdd18e3584 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Sat, 7 Jul 2012 13:19:13 +0000 Subject: [PATCH] MotionPath : fixed waypoint triggering on low framerate. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9540 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../core/com/jme3/cinematic/MotionPath.java | 19 +++++++++++-------- .../jme3/cinematic/events/MotionTrack.java | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/engine/src/core/com/jme3/cinematic/MotionPath.java b/engine/src/core/com/jme3/cinematic/MotionPath.java index 393d9409d..7fa0bbfbc 100644 --- a/engine/src/core/com/jme3/cinematic/MotionPath.java +++ b/engine/src/core/com/jme3/cinematic/MotionPath.java @@ -36,6 +36,7 @@ import com.jme3.cinematic.events.MotionTrack; import com.jme3.export.*; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; +import com.jme3.math.FastMath; import com.jme3.math.Spline; import com.jme3.math.Spline.SplineType; import com.jme3.math.Vector2f; @@ -59,22 +60,22 @@ public class MotionPath implements Savable { private Node debugNode; private AssetManager assetManager; private List listeners; - private Spline spline = new Spline(); - int prevWayPoint = 0; + 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. * @param time the time since the animation started * @param control the ocntrol over the moving spatial */ - public float interpolatePath(float time, MotionTrack control) { + public float interpolatePath(float time, MotionTrack control, float tpf) { float traveledDistance = 0; TempVars vars = TempVars.get(); @@ -96,16 +97,18 @@ public class MotionPath implements Savable { tmpVector.set(temp); control.setDirection(tmpVector.subtractLocal(control.getSpatial().getLocalTranslation()).normalizeLocal()); } - checkWayPoint(control); - + checkWayPoint(control, tpf); + control.getSpatial().setLocalTranslation(temp); vars.release(); return traveledDistance; } - public void checkWayPoint(MotionTrack control) { + public void checkWayPoint(MotionTrack control, float tpf) { + //Epsilon varies with the tpf to avoid missing a waypoint on low framerate. + float epsilon = tpf * 4f; if (control.getCurrentWayPoint() != prevWayPoint) { - if (control.getCurrentValue() >= 0f && control.getCurrentValue() < 0.01) { + if (control.getCurrentValue() >= 0f && control.getCurrentValue() < epsilon) { triggerWayPointReach(control.getCurrentWayPoint(), control); prevWayPoint = control.getCurrentWayPoint(); } diff --git a/engine/src/core/com/jme3/cinematic/events/MotionTrack.java b/engine/src/core/com/jme3/cinematic/events/MotionTrack.java index 40c6aaddd..f3cce0e7f 100644 --- a/engine/src/core/com/jme3/cinematic/events/MotionTrack.java +++ b/engine/src/core/com/jme3/cinematic/events/MotionTrack.java @@ -169,7 +169,7 @@ public class MotionTrack extends AbstractCinematicEvent implements Control { public void internalUpdate(float tpf) { if (playState == PlayState.Playing) { time = time + (tpf * speed); - if( loopMode == loopMode.Loop && time<0){ + if (loopMode == loopMode.Loop && time < 0) { time = initialDuration; } if ((time >= initialDuration || time < 0) && loopMode == loopMode.DontLoop) { @@ -196,7 +196,7 @@ public class MotionTrack extends AbstractCinematicEvent implements Control { } public void onUpdate(float tpf) { - traveledDistance = path.interpolatePath(time, this); + traveledDistance = path.interpolatePath(time, this, tpf); computeTargetDirection(); }