Fixed an issue in animControl where the onanimCycleDone was called too early.

see http://hub.jmonkeyengine.org/forum/topic/onanimcycledone-called-before-animation-completes/#post-257008

git-svn-id: https://jmonkeyengine.googlecode.com/svn/branches/gradle-restructure@10996 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
experimental
rem..om 11 years ago
parent bace22528f
commit 75e82e47f2
  1. 16
      jme3-core/src/main/java/com/jme3/animation/AnimChannel.java

@ -31,6 +31,9 @@
*/ */
package com.jme3.animation; package com.jme3.animation;
import static com.jme3.animation.LoopMode.Cycle;
import static com.jme3.animation.LoopMode.DontLoop;
import static com.jme3.animation.LoopMode.Loop;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.util.TempVars; import com.jme3.util.TempVars;
import java.util.BitSet; import java.util.BitSet;
@ -59,6 +62,7 @@ public final class AnimChannel {
private float time; private float time;
private float speed; private float speed;
private float timeBlendFrom; private float timeBlendFrom;
private float blendTime;
private float speedBlendFrom; private float speedBlendFrom;
private boolean notified=false; private boolean notified=false;
@ -192,6 +196,11 @@ public final class AnimChannel {
*/ */
public void setSpeed(float speed) { public void setSpeed(float speed) {
this.speed = speed; this.speed = speed;
if(blendTime>0){
this.speedBlendFrom = speed;
blendTime = Math.min(blendTime, animation.getLength() / speed);
blendRate = 1/ blendTime;
}
} }
/** /**
@ -248,7 +257,9 @@ public final class AnimChannel {
control.notifyAnimChange(this, name); control.notifyAnimChange(this, name);
if (animation != null && blendTime > 0f){ if (animation != null && blendTime > 0f){
this.blendTime = blendTime;
// activate blending // activate blending
blendTime = Math.min(blendTime, anim.getLength() / speed);
blendFrom = animation; blendFrom = animation;
timeBlendFrom = time; timeBlendFrom = time;
speedBlendFrom = speed; speedBlendFrom = speed;
@ -393,8 +404,7 @@ public final class AnimChannel {
} }
animation.setTime(time, blendAmount, control, this, vars); animation.setTime(time, blendAmount, control, this, vars);
time += tpf * speed;
if (animation.getLength() > 0){ if (animation.getLength() > 0){
if (!notified && (time >= animation.getLength() || time < 0)) { if (!notified && (time >= animation.getLength() || time < 0)) {
if (loopMode == LoopMode.DontLoop) { if (loopMode == LoopMode.DontLoop) {
@ -406,7 +416,7 @@ public final class AnimChannel {
control.notifyAnimCycleDone(this, animation.getName()); control.notifyAnimCycleDone(this, animation.getName());
} }
} }
time += tpf * speed;
time = clampWrapTime(time, animation.getLength(), loopMode); time = clampWrapTime(time, animation.getLength(), loopMode);
if (time < 0){ if (time < 0){
// Negative time indicates that speed should be inverted // Negative time indicates that speed should be inverted

Loading…
Cancel
Save