Преглед на файлове

MotionPath : fixed waypoint triggering on low framerate.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9540 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
rem..om преди 13 години
родител
ревизия
c2ac08f70b
променени са 2 файла, в които са добавени 13 реда и са изтрити 10 реда
  1. 11 8
      engine/src/core/com/jme3/cinematic/MotionPath.java
  2. 2 2
      engine/src/core/com/jme3/cinematic/events/MotionTrack.java

+ 11 - 8
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<MotionPathListener> 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();
             }

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