MotionPath : fixed waypoint triggering on low framerate.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9540 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 13 years ago
parent a6c4f99412
commit c2ac08f70b
  1. 11
      engine/src/core/com/jme3/cinematic/MotionPath.java
  2. 4
      engine/src/core/com/jme3/cinematic/events/MotionTrack.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;
@ -74,7 +75,7 @@ public class MotionPath implements Savable {
* @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();
}

@ -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();
}

Loading…
Cancel
Save