commit
6fb2d029d2
Binary file not shown.
@ -1,6 +1,6 @@ |
|||||||
#Fri Nov 25 13:05:50 EST 2016 |
#Sun Sep 17 22:55:30 EDT 2017 |
||||||
distributionBase=GRADLE_USER_HOME |
distributionBase=GRADLE_USER_HOME |
||||||
distributionPath=wrapper/dists |
distributionPath=wrapper/dists |
||||||
zipStoreBase=GRADLE_USER_HOME |
zipStoreBase=GRADLE_USER_HOME |
||||||
zipStorePath=wrapper/dists |
zipStorePath=wrapper/dists |
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip |
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-bin.zip |
||||||
|
@ -1,365 +1,369 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2012 jMonkeyEngine |
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
package com.jme3.animation; |
package com.jme3.animation; |
||||||
|
|
||||||
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; |
||||||
|
|
||||||
/** |
/** |
||||||
* <code>AnimChannel</code> provides controls, such as play, pause, |
* <code>AnimChannel</code> provides controls, such as play, pause, |
||||||
* fast forward, etc, for an animation. The animation |
* fast forward, etc, for an animation. The animation |
||||||
* channel may influence the entire model or specific bones of the model's |
* channel may influence the entire model or specific bones of the model's |
||||||
* skeleton. A single model may have multiple animation channels influencing |
* skeleton. A single model may have multiple animation channels influencing |
||||||
* various parts of its body. For example, a character model may have an |
* various parts of its body. For example, a character model may have an |
||||||
* animation channel for its feet, and another for its torso, and |
* animation channel for its feet, and another for its torso, and |
||||||
* the animations for each channel are controlled independently. |
* the animations for each channel are controlled independently. |
||||||
* |
* |
||||||
* @author Kirill Vainer |
* @author Kirill Vainer |
||||||
*/ |
*/ |
||||||
public final class AnimChannel { |
public final class AnimChannel { |
||||||
|
|
||||||
private static final float DEFAULT_BLEND_TIME = 0.15f; |
private static final float DEFAULT_BLEND_TIME = 0.15f; |
||||||
|
|
||||||
private AnimControl control; |
private AnimControl control; |
||||||
|
|
||||||
private BitSet affectedBones; |
private BitSet affectedBones; |
||||||
|
|
||||||
private Animation animation; |
private Animation animation; |
||||||
private Animation blendFrom; |
private Animation blendFrom; |
||||||
private float time; |
private float time; |
||||||
private float speed; |
private float speed; |
||||||
private float timeBlendFrom; |
private float timeBlendFrom; |
||||||
private float blendTime; |
private float blendTime; |
||||||
private float speedBlendFrom; |
private float speedBlendFrom; |
||||||
private boolean notified=false; |
private boolean notified=false; |
||||||
|
|
||||||
private LoopMode loopMode, loopModeBlendFrom; |
private LoopMode loopMode, loopModeBlendFrom; |
||||||
|
|
||||||
private float blendAmount = 1f; |
private float blendAmount = 1f; |
||||||
private float blendRate = 0; |
private float blendRate = 0; |
||||||
|
|
||||||
AnimChannel(AnimControl control){ |
public AnimChannel(){ |
||||||
this.control = control; |
|
||||||
} |
} |
||||||
|
|
||||||
/** |
public AnimChannel(AnimControl control){ |
||||||
* Returns the parent control of this AnimChannel. |
this.control = control; |
||||||
* |
} |
||||||
* @return the parent control of this AnimChannel. |
|
||||||
* @see AnimControl |
/** |
||||||
*/ |
* Returns the parent control of this AnimChannel. |
||||||
public AnimControl getControl() { |
* |
||||||
return control; |
* @return the parent control of this AnimChannel. |
||||||
} |
* @see AnimControl |
||||||
|
*/ |
||||||
/** |
public AnimControl getControl() { |
||||||
* @return The name of the currently playing animation, or null if |
return control; |
||||||
* none is assigned. |
} |
||||||
* |
|
||||||
* @see AnimChannel#setAnim(java.lang.String) |
/** |
||||||
*/ |
* @return The name of the currently playing animation, or null if |
||||||
public String getAnimationName() { |
* none is assigned. |
||||||
return animation != null ? animation.getName() : null; |
* |
||||||
} |
* @see AnimChannel#setAnim(java.lang.String) |
||||||
|
*/ |
||||||
/** |
public String getAnimationName() { |
||||||
* @return The loop mode currently set for the animation. The loop mode |
return animation != null ? animation.getName() : null; |
||||||
* determines what will happen to the animation once it finishes |
} |
||||||
* playing. |
|
||||||
* |
/** |
||||||
* For more information, see the LoopMode enum class. |
* @return The loop mode currently set for the animation. The loop mode |
||||||
* @see LoopMode |
* determines what will happen to the animation once it finishes |
||||||
* @see AnimChannel#setLoopMode(com.jme3.animation.LoopMode) |
* playing. |
||||||
*/ |
* |
||||||
public LoopMode getLoopMode() { |
* For more information, see the LoopMode enum class. |
||||||
return loopMode; |
* @see LoopMode |
||||||
} |
* @see AnimChannel#setLoopMode(com.jme3.animation.LoopMode) |
||||||
|
*/ |
||||||
/** |
public LoopMode getLoopMode() { |
||||||
* @param loopMode Set the loop mode for the channel. The loop mode |
return loopMode; |
||||||
* determines what will happen to the animation once it finishes |
} |
||||||
* playing. |
|
||||||
* |
/** |
||||||
* For more information, see the LoopMode enum class. |
* @param loopMode Set the loop mode for the channel. The loop mode |
||||||
* @see LoopMode |
* determines what will happen to the animation once it finishes |
||||||
*/ |
* playing. |
||||||
public void setLoopMode(LoopMode loopMode) { |
* |
||||||
this.loopMode = loopMode; |
* For more information, see the LoopMode enum class. |
||||||
} |
* @see LoopMode |
||||||
|
*/ |
||||||
/** |
public void setLoopMode(LoopMode loopMode) { |
||||||
* @return The speed that is assigned to the animation channel. The speed |
this.loopMode = loopMode; |
||||||
* is a scale value starting from 0.0, at 1.0 the animation will play |
} |
||||||
* at its default speed. |
|
||||||
* |
/** |
||||||
* @see AnimChannel#setSpeed(float) |
* @return The speed that is assigned to the animation channel. The speed |
||||||
*/ |
* is a scale value starting from 0.0, at 1.0 the animation will play |
||||||
public float getSpeed() { |
* at its default speed. |
||||||
return speed; |
* |
||||||
} |
* @see AnimChannel#setSpeed(float) |
||||||
|
*/ |
||||||
/** |
public float getSpeed() { |
||||||
* @param speed Set the speed of the animation channel. The speed |
return speed; |
||||||
* is a scale value starting from 0.0, at 1.0 the animation will play |
} |
||||||
* at its default speed. |
|
||||||
*/ |
/** |
||||||
public void setSpeed(float speed) { |
* @param speed Set the speed of the animation channel. The speed |
||||||
this.speed = speed; |
* is a scale value starting from 0.0, at 1.0 the animation will play |
||||||
if(blendTime>0){ |
* at its default speed. |
||||||
this.speedBlendFrom = speed; |
*/ |
||||||
blendTime = Math.min(blendTime, animation.getLength() / speed); |
public void setSpeed(float speed) { |
||||||
blendRate = 1/ blendTime; |
this.speed = speed; |
||||||
} |
if(blendTime>0){ |
||||||
} |
this.speedBlendFrom = speed; |
||||||
|
blendTime = Math.min(blendTime, animation.getLength() / speed); |
||||||
/** |
blendRate = 1/ blendTime; |
||||||
* @return The time of the currently playing animation. The time |
} |
||||||
* starts at 0 and continues on until getAnimMaxTime(). |
} |
||||||
* |
|
||||||
* @see AnimChannel#setTime(float) |
/** |
||||||
*/ |
* @return The time of the currently playing animation. The time |
||||||
public float getTime() { |
* starts at 0 and continues on until getAnimMaxTime(). |
||||||
return time; |
* |
||||||
} |
* @see AnimChannel#setTime(float) |
||||||
|
*/ |
||||||
/** |
public float getTime() { |
||||||
* @param time Set the time of the currently playing animation, the time |
return time; |
||||||
* is clamped from 0 to {@link #getAnimMaxTime()}. |
} |
||||||
*/ |
|
||||||
public void setTime(float time) { |
/** |
||||||
this.time = FastMath.clamp(time, 0, getAnimMaxTime()); |
* @param time Set the time of the currently playing animation, the time |
||||||
} |
* is clamped from 0 to {@link #getAnimMaxTime()}. |
||||||
|
*/ |
||||||
/** |
public void setTime(float time) { |
||||||
* @return The length of the currently playing animation, or zero |
this.time = FastMath.clamp(time, 0, getAnimMaxTime()); |
||||||
* if no animation is playing. |
} |
||||||
* |
|
||||||
* @see AnimChannel#getTime() |
/** |
||||||
*/ |
* @return The length of the currently playing animation, or zero |
||||||
public float getAnimMaxTime(){ |
* if no animation is playing. |
||||||
return animation != null ? animation.getLength() : 0f; |
* |
||||||
} |
* @see AnimChannel#getTime() |
||||||
|
*/ |
||||||
/** |
public float getAnimMaxTime(){ |
||||||
* Set the current animation that is played by this AnimChannel. |
return animation != null ? animation.getLength() : 0f; |
||||||
* <p> |
} |
||||||
* This resets the time to zero, and optionally blends the animation |
|
||||||
* over <code>blendTime</code> seconds with the currently playing animation. |
/** |
||||||
* Notice that this method will reset the control's speed to 1.0. |
* Set the current animation that is played by this AnimChannel. |
||||||
* |
* <p> |
||||||
* @param name The name of the animation to play |
* This resets the time to zero, and optionally blends the animation |
||||||
* @param blendTime The blend time over which to blend the new animation |
* over <code>blendTime</code> seconds with the currently playing animation. |
||||||
* with the old one. If zero, then no blending will occur and the new |
* Notice that this method will reset the control's speed to 1.0. |
||||||
* animation will be applied instantly. |
* |
||||||
*/ |
* @param name The name of the animation to play |
||||||
public void setAnim(String name, float blendTime){ |
* @param blendTime The blend time over which to blend the new animation |
||||||
if (name == null) |
* with the old one. If zero, then no blending will occur and the new |
||||||
throw new IllegalArgumentException("name cannot be null"); |
* animation will be applied instantly. |
||||||
|
*/ |
||||||
if (blendTime < 0f) |
public void setAnim(String name, float blendTime){ |
||||||
throw new IllegalArgumentException("blendTime cannot be less than zero"); |
if (name == null) |
||||||
|
throw new IllegalArgumentException("name cannot be null"); |
||||||
Animation anim = control.animationMap.get(name); |
|
||||||
if (anim == null) |
if (blendTime < 0f) |
||||||
throw new IllegalArgumentException("Cannot find animation named: '"+name+"'"); |
throw new IllegalArgumentException("blendTime cannot be less than zero"); |
||||||
|
|
||||||
control.notifyAnimChange(this, name); |
Animation anim = control.animationMap.get(name); |
||||||
|
if (anim == null) |
||||||
if (animation != null && blendTime > 0f){ |
throw new IllegalArgumentException("Cannot find animation named: '"+name+"'"); |
||||||
this.blendTime = blendTime; |
|
||||||
// activate blending
|
control.notifyAnimChange(this, name); |
||||||
blendTime = Math.min(blendTime, anim.getLength() / speed); |
|
||||||
blendFrom = animation; |
if (animation != null && blendTime > 0f){ |
||||||
timeBlendFrom = time; |
this.blendTime = blendTime; |
||||||
speedBlendFrom = speed; |
// activate blending
|
||||||
loopModeBlendFrom = loopMode; |
blendTime = Math.min(blendTime, anim.getLength() / speed); |
||||||
blendAmount = 0f; |
blendFrom = animation; |
||||||
blendRate = 1f / blendTime; |
timeBlendFrom = time; |
||||||
}else{ |
speedBlendFrom = speed; |
||||||
blendFrom = null; |
loopModeBlendFrom = loopMode; |
||||||
} |
blendAmount = 0f; |
||||||
|
blendRate = 1f / blendTime; |
||||||
animation = anim; |
}else{ |
||||||
time = 0; |
blendFrom = null; |
||||||
speed = 1f; |
} |
||||||
loopMode = LoopMode.Loop; |
|
||||||
notified = false; |
animation = anim; |
||||||
} |
time = 0; |
||||||
|
speed = 1f; |
||||||
/** |
loopMode = LoopMode.Loop; |
||||||
* Set the current animation that is played by this AnimChannel. |
notified = false; |
||||||
* <p> |
} |
||||||
* See {@link #setAnim(java.lang.String, float)}. |
|
||||||
* The blendTime argument by default is 150 milliseconds. |
/** |
||||||
* |
* Set the current animation that is played by this AnimChannel. |
||||||
* @param name The name of the animation to play |
* <p> |
||||||
*/ |
* See {@link #setAnim(java.lang.String, float)}. |
||||||
public void setAnim(String name){ |
* The blendTime argument by default is 150 milliseconds. |
||||||
setAnim(name, DEFAULT_BLEND_TIME); |
* |
||||||
} |
* @param name The name of the animation to play |
||||||
|
*/ |
||||||
/** |
public void setAnim(String name){ |
||||||
* Add all the bones of the model's skeleton to be |
setAnim(name, DEFAULT_BLEND_TIME); |
||||||
* influenced by this animation channel. |
} |
||||||
*/ |
|
||||||
public void addAllBones() { |
/** |
||||||
affectedBones = null; |
* Add all the bones of the model's skeleton to be |
||||||
} |
* influenced by this animation channel. |
||||||
|
*/ |
||||||
/** |
public void addAllBones() { |
||||||
* Add a single bone to be influenced by this animation channel. |
affectedBones = null; |
||||||
*/ |
} |
||||||
public void addBone(String name) { |
|
||||||
addBone(control.getSkeleton().getBone(name)); |
/** |
||||||
} |
* Add a single bone to be influenced by this animation channel. |
||||||
|
*/ |
||||||
/** |
public void addBone(String name) { |
||||||
* Add a single bone to be influenced by this animation channel. |
addBone(control.getSkeleton().getBone(name)); |
||||||
*/ |
} |
||||||
public void addBone(Bone bone) { |
|
||||||
int boneIndex = control.getSkeleton().getBoneIndex(bone); |
/** |
||||||
if(affectedBones == null) { |
* Add a single bone to be influenced by this animation channel. |
||||||
affectedBones = new BitSet(control.getSkeleton().getBoneCount()); |
*/ |
||||||
} |
public void addBone(Bone bone) { |
||||||
affectedBones.set(boneIndex); |
int boneIndex = control.getSkeleton().getBoneIndex(bone); |
||||||
} |
if(affectedBones == null) { |
||||||
|
affectedBones = new BitSet(control.getSkeleton().getBoneCount()); |
||||||
/** |
} |
||||||
* Add bones to be influenced by this animation channel starting from the |
affectedBones.set(boneIndex); |
||||||
* given bone name and going toward the root bone. |
} |
||||||
*/ |
|
||||||
public void addToRootBone(String name) { |
/** |
||||||
addToRootBone(control.getSkeleton().getBone(name)); |
* Add bones to be influenced by this animation channel starting from the |
||||||
} |
* given bone name and going toward the root bone. |
||||||
|
*/ |
||||||
/** |
public void addToRootBone(String name) { |
||||||
* Add bones to be influenced by this animation channel starting from the |
addToRootBone(control.getSkeleton().getBone(name)); |
||||||
* given bone and going toward the root bone. |
} |
||||||
*/ |
|
||||||
public void addToRootBone(Bone bone) { |
/** |
||||||
addBone(bone); |
* Add bones to be influenced by this animation channel starting from the |
||||||
while (bone.getParent() != null) { |
* given bone and going toward the root bone. |
||||||
bone = bone.getParent(); |
*/ |
||||||
addBone(bone); |
public void addToRootBone(Bone bone) { |
||||||
} |
addBone(bone); |
||||||
} |
while (bone.getParent() != null) { |
||||||
|
bone = bone.getParent(); |
||||||
/** |
addBone(bone); |
||||||
* Add bones to be influenced by this animation channel, starting |
} |
||||||
* from the given named bone and going toward its children. |
} |
||||||
*/ |
|
||||||
public void addFromRootBone(String name) { |
/** |
||||||
addFromRootBone(control.getSkeleton().getBone(name)); |
* Add bones to be influenced by this animation channel, starting |
||||||
} |
* from the given named bone and going toward its children. |
||||||
|
*/ |
||||||
/** |
public void addFromRootBone(String name) { |
||||||
* Add bones to be influenced by this animation channel, starting |
addFromRootBone(control.getSkeleton().getBone(name)); |
||||||
* from the given bone and going toward its children. |
} |
||||||
*/ |
|
||||||
public void addFromRootBone(Bone bone) { |
/** |
||||||
addBone(bone); |
* Add bones to be influenced by this animation channel, starting |
||||||
if (bone.getChildren() == null) |
* from the given bone and going toward its children. |
||||||
return; |
*/ |
||||||
for (Bone childBone : bone.getChildren()) { |
public void addFromRootBone(Bone bone) { |
||||||
addBone(childBone); |
addBone(bone); |
||||||
addFromRootBone(childBone); |
if (bone.getChildren() == null) |
||||||
} |
return; |
||||||
} |
for (Bone childBone : bone.getChildren()) { |
||||||
|
addBone(childBone); |
||||||
BitSet getAffectedBones(){ |
addFromRootBone(childBone); |
||||||
return affectedBones; |
} |
||||||
} |
} |
||||||
|
|
||||||
public void reset(boolean rewind){ |
BitSet getAffectedBones(){ |
||||||
if(rewind){ |
return affectedBones; |
||||||
setTime(0); |
} |
||||||
if(control.getSkeleton()!=null){ |
|
||||||
control.getSkeleton().resetAndUpdate(); |
public void reset(boolean rewind){ |
||||||
}else{ |
if(rewind){ |
||||||
TempVars vars = TempVars.get(); |
setTime(0); |
||||||
update(0, vars); |
if(control.getSkeleton()!=null){ |
||||||
vars.release(); |
control.getSkeleton().resetAndUpdate(); |
||||||
} |
}else{ |
||||||
} |
TempVars vars = TempVars.get(); |
||||||
animation = null; |
update(0, vars); |
||||||
notified = false; |
vars.release(); |
||||||
} |
} |
||||||
|
} |
||||||
void update(float tpf, TempVars vars) { |
animation = null; |
||||||
if (animation == null) |
notified = false; |
||||||
return; |
} |
||||||
|
|
||||||
if (blendFrom != null && blendAmount != 1.0f){ |
void update(float tpf, TempVars vars) { |
||||||
// The blendFrom anim is set, the actual animation
|
if (animation == null) |
||||||
// playing will be set
|
return; |
||||||
// blendFrom.setTime(timeBlendFrom, 1f, control, this, vars);
|
|
||||||
blendFrom.setTime(timeBlendFrom, 1f - blendAmount, control, this, vars); |
if (blendFrom != null && blendAmount != 1.0f){ |
||||||
|
// The blendFrom anim is set, the actual animation
|
||||||
timeBlendFrom += tpf * speedBlendFrom; |
// playing will be set
|
||||||
timeBlendFrom = AnimationUtils.clampWrapTime(timeBlendFrom, |
// blendFrom.setTime(timeBlendFrom, 1f, control, this, vars);
|
||||||
blendFrom.getLength(), |
blendFrom.setTime(timeBlendFrom, 1f - blendAmount, control, this, vars); |
||||||
loopModeBlendFrom); |
|
||||||
if (timeBlendFrom < 0){ |
timeBlendFrom += tpf * speedBlendFrom; |
||||||
timeBlendFrom = -timeBlendFrom; |
timeBlendFrom = AnimationUtils.clampWrapTime(timeBlendFrom, |
||||||
speedBlendFrom = -speedBlendFrom; |
blendFrom.getLength(), |
||||||
} |
loopModeBlendFrom); |
||||||
|
if (timeBlendFrom < 0){ |
||||||
blendAmount += tpf * blendRate; |
timeBlendFrom = -timeBlendFrom; |
||||||
if (blendAmount > 1f){ |
speedBlendFrom = -speedBlendFrom; |
||||||
blendAmount = 1f; |
} |
||||||
blendFrom = null; |
|
||||||
} |
blendAmount += tpf * blendRate; |
||||||
} |
if (blendAmount > 1f){ |
||||||
|
blendAmount = 1f; |
||||||
animation.setTime(time, blendAmount, control, this, vars); |
blendFrom = null; |
||||||
time += tpf * speed; |
} |
||||||
if (animation.getLength() > 0){ |
} |
||||||
if (!notified && (time >= animation.getLength() || time < 0)) { |
|
||||||
if (loopMode == LoopMode.DontLoop) { |
animation.setTime(time, blendAmount, control, this, vars); |
||||||
// Note that this flag has to be set before calling the notify
|
time += tpf * speed; |
||||||
// since the notify may start a new animation and then unset
|
if (animation.getLength() > 0){ |
||||||
// the flag.
|
if (!notified && (time >= animation.getLength() || time < 0)) { |
||||||
notified = true; |
if (loopMode == LoopMode.DontLoop) { |
||||||
} |
// Note that this flag has to be set before calling the notify
|
||||||
control.notifyAnimCycleDone(this, animation.getName()); |
// since the notify may start a new animation and then unset
|
||||||
} |
// the flag.
|
||||||
} |
notified = true; |
||||||
time = AnimationUtils.clampWrapTime(time, animation.getLength(), loopMode); |
} |
||||||
if (time < 0){ |
control.notifyAnimCycleDone(this, animation.getName()); |
||||||
// Negative time indicates that speed should be inverted
|
} |
||||||
// (for cycle loop mode only)
|
} |
||||||
time = -time; |
time = AnimationUtils.clampWrapTime(time, animation.getLength(), loopMode); |
||||||
speed = -speed; |
if (time < 0){ |
||||||
} |
// Negative time indicates that speed should be inverted
|
||||||
} |
// (for cycle loop mode only)
|
||||||
} |
time = -time; |
||||||
|
speed = -speed; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,89 +1,93 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2012 jMonkeyEngine |
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
package com.jme3.cinematic; |
package com.jme3.cinematic; |
||||||
|
|
||||||
import com.jme3.cinematic.events.CinematicEvent; |
import com.jme3.cinematic.events.CinematicEvent; |
||||||
import com.jme3.export.*; |
import com.jme3.export.*; |
||||||
import java.io.IOException; |
import java.io.IOException; |
||||||
import java.util.ArrayList; |
import java.util.ArrayList; |
||||||
import java.util.List; |
import java.util.List; |
||||||
|
|
||||||
/** |
/** |
||||||
* |
* |
||||||
* @author Nehon |
* @author Nehon |
||||||
*/ |
*/ |
||||||
public class KeyFrame implements Savable { |
public class KeyFrame implements Savable { |
||||||
|
|
||||||
List<CinematicEvent> cinematicEvents = new ArrayList<CinematicEvent>(); |
public KeyFrame(){ |
||||||
private int index; |
|
||||||
|
} |
||||||
public List<CinematicEvent> getCinematicEvents() { |
|
||||||
return cinematicEvents; |
List<CinematicEvent> cinematicEvents = new ArrayList<>(); |
||||||
} |
private int index; |
||||||
|
|
||||||
public void setCinematicEvents(List<CinematicEvent> cinematicEvents) { |
public List<CinematicEvent> getCinematicEvents() { |
||||||
this.cinematicEvents = cinematicEvents; |
return cinematicEvents; |
||||||
} |
} |
||||||
|
|
||||||
public List<CinematicEvent> trigger() { |
public void setCinematicEvents(List<CinematicEvent> cinematicEvents) { |
||||||
for (CinematicEvent event : cinematicEvents) { |
this.cinematicEvents = cinematicEvents; |
||||||
event.play(); |
} |
||||||
} |
|
||||||
return cinematicEvents; |
public List<CinematicEvent> trigger() { |
||||||
} |
for (CinematicEvent event : cinematicEvents) { |
||||||
|
event.play(); |
||||||
public boolean isEmpty(){ |
} |
||||||
return cinematicEvents.isEmpty(); |
return cinematicEvents; |
||||||
} |
} |
||||||
|
|
||||||
public void write(JmeExporter ex) throws IOException { |
public boolean isEmpty(){ |
||||||
OutputCapsule oc = ex.getCapsule(this); |
return cinematicEvents.isEmpty(); |
||||||
oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); |
} |
||||||
oc.write(index, "index", 0); |
|
||||||
} |
public void write(JmeExporter ex) throws IOException { |
||||||
|
OutputCapsule oc = ex.getCapsule(this); |
||||||
public void read(JmeImporter im) throws IOException { |
oc.writeSavableArrayList((ArrayList) cinematicEvents, "cinematicEvents", null); |
||||||
InputCapsule ic = im.getCapsule(this); |
oc.write(index, "index", 0); |
||||||
cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); |
} |
||||||
index=ic.readInt("index", 0); |
|
||||||
} |
public void read(JmeImporter im) throws IOException { |
||||||
|
InputCapsule ic = im.getCapsule(this); |
||||||
public int getIndex() { |
cinematicEvents = ic.readSavableArrayList("cinematicEvents", null); |
||||||
return index; |
index=ic.readInt("index", 0); |
||||||
} |
} |
||||||
|
|
||||||
public void setIndex(int index) { |
public int getIndex() { |
||||||
this.index = index; |
return index; |
||||||
} |
} |
||||||
|
|
||||||
|
public void setIndex(int index) { |
||||||
} |
this.index = index; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
@ -0,0 +1,146 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2017 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.cinematic.events; |
||||||
|
|
||||||
|
import com.jme3.app.Application; |
||||||
|
import com.jme3.cinematic.Cinematic; |
||||||
|
import com.jme3.cinematic.TimeLine; |
||||||
|
import com.jme3.export.InputCapsule; |
||||||
|
import com.jme3.export.JmeExporter; |
||||||
|
import com.jme3.export.JmeImporter; |
||||||
|
import com.jme3.export.OutputCapsule; |
||||||
|
import com.jme3.export.Savable; |
||||||
|
import com.jme3.scene.CameraNode; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @author Rickard <neph1 @ github> |
||||||
|
*/ |
||||||
|
public class CameraEvent extends AbstractCinematicEvent{ |
||||||
|
|
||||||
|
private String cameraName; |
||||||
|
private Cinematic cinematic; |
||||||
|
|
||||||
|
public String getCameraName() { |
||||||
|
return cameraName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCameraName(String cameraName) { |
||||||
|
this.cameraName = cameraName; |
||||||
|
} |
||||||
|
|
||||||
|
public CameraEvent(){ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public CameraEvent(Cinematic parentEvent, String cameraName){ |
||||||
|
this.cinematic = parentEvent; |
||||||
|
this.cameraName = cameraName; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void initEvent(Application app, Cinematic cinematic) { |
||||||
|
super.initEvent(app, cinematic); |
||||||
|
this.cinematic = cinematic; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void play() { |
||||||
|
super.play(); |
||||||
|
stop(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onPlay() { |
||||||
|
cinematic.setActiveCamera(cameraName); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onUpdate(float tpf) { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onStop() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onPause() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void forceStop() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setTime(float time) { |
||||||
|
play(); |
||||||
|
} |
||||||
|
|
||||||
|
public Cinematic getCinematic() { |
||||||
|
return cinematic; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCinematic(Cinematic cinematic) { |
||||||
|
this.cinematic = cinematic; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* used internally for serialization |
||||||
|
* |
||||||
|
* @param ex |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void write(JmeExporter ex) throws IOException { |
||||||
|
super.write(ex); |
||||||
|
OutputCapsule oc = ex.getCapsule(this); |
||||||
|
oc.write(cameraName, "cameraName", null); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* used internally for serialization |
||||||
|
* |
||||||
|
* @param im |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void read(JmeImporter im) throws IOException { |
||||||
|
super.read(im); |
||||||
|
InputCapsule ic = im.getCapsule(this); |
||||||
|
cameraName = ic.readString("cameraName", null); |
||||||
|
} |
||||||
|
} |
@ -1,491 +1,478 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2016 jMonkeyEngine |
* Copyright (c) 2009-2018 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
package com.jme3.cinematic.events; |
package com.jme3.cinematic.events; |
||||||
|
|
||||||
import com.jme3.animation.AnimationUtils; |
import com.jme3.animation.AnimationUtils; |
||||||
import com.jme3.animation.LoopMode; |
import com.jme3.animation.LoopMode; |
||||||
import com.jme3.app.Application; |
import com.jme3.app.Application; |
||||||
import com.jme3.cinematic.Cinematic; |
import com.jme3.cinematic.Cinematic; |
||||||
import com.jme3.cinematic.MotionPath; |
import com.jme3.cinematic.MotionPath; |
||||||
import com.jme3.cinematic.PlayState; |
import com.jme3.cinematic.PlayState; |
||||||
import com.jme3.export.InputCapsule; |
import com.jme3.export.InputCapsule; |
||||||
import com.jme3.export.JmeExporter; |
import com.jme3.export.JmeExporter; |
||||||
import com.jme3.export.JmeImporter; |
import com.jme3.export.JmeImporter; |
||||||
import com.jme3.export.OutputCapsule; |
import com.jme3.export.OutputCapsule; |
||||||
import com.jme3.math.Quaternion; |
import com.jme3.math.Quaternion; |
||||||
import com.jme3.math.Vector3f; |
import com.jme3.math.Vector3f; |
||||||
import com.jme3.renderer.RenderManager; |
import com.jme3.renderer.RenderManager; |
||||||
import com.jme3.renderer.ViewPort; |
import com.jme3.renderer.ViewPort; |
||||||
import com.jme3.scene.Spatial; |
import com.jme3.scene.Spatial; |
||||||
import com.jme3.scene.control.Control; |
import com.jme3.scene.control.Control; |
||||||
import com.jme3.util.clone.Cloner; |
import com.jme3.util.clone.Cloner; |
||||||
import com.jme3.util.clone.JmeCloneable; |
import com.jme3.util.clone.JmeCloneable; |
||||||
import java.io.IOException; |
import java.io.IOException; |
||||||
|
|
||||||
/** |
/** |
||||||
* A MotionEvent is a control over the spatial that manages the position and direction of the spatial while following a motion Path. |
* A MotionEvent is a control over the spatial that manages the position and direction of the spatial while following a motion Path. |
||||||
* |
* |
||||||
* You must first create a MotionPath and then create a MotionEvent to associate a spatial and the path. |
* You must first create a MotionPath and then create a MotionEvent to associate a spatial and the path. |
||||||
* |
* |
||||||
* @author Nehon |
* @author Nehon |
||||||
*/ |
*/ |
||||||
public class MotionEvent extends AbstractCinematicEvent implements Control, JmeCloneable { |
public class MotionEvent extends AbstractCinematicEvent implements Control, JmeCloneable { |
||||||
|
|
||||||
protected Spatial spatial; |
protected Spatial spatial; |
||||||
protected int currentWayPoint; |
protected int currentWayPoint; |
||||||
protected float currentValue; |
protected float currentValue; |
||||||
protected Vector3f direction = new Vector3f(); |
protected Vector3f direction = new Vector3f(); |
||||||
protected Vector3f lookAt = null; |
protected Vector3f lookAt = null; |
||||||
protected Vector3f upVector = Vector3f.UNIT_Y; |
protected Vector3f upVector = Vector3f.UNIT_Y; |
||||||
protected Quaternion rotation = null; |
protected Quaternion rotation = null; |
||||||
protected Direction directionType = Direction.None; |
protected Direction directionType = Direction.None; |
||||||
protected MotionPath path; |
protected MotionPath path; |
||||||
private boolean isControl = true; |
private boolean isControl = true; |
||||||
private int travelDirection = 1; |
private int travelDirection = 1; |
||||||
/** |
/** |
||||||
* the distance traveled by the spatial on the path |
* the distance traveled by the spatial on the path |
||||||
*/ |
*/ |
||||||
protected float traveledDistance = 0; |
protected float traveledDistance = 0; |
||||||
|
|
||||||
/** |
/** |
||||||
* Enum for the different type of target direction behavior. |
* Enum for the different type of target direction behavior. |
||||||
*/ |
*/ |
||||||
public enum Direction { |
public enum Direction { |
||||||
|
|
||||||
/** |
/** |
||||||
* The target stays in the starting direction. |
* The target stays in the starting direction. |
||||||
*/ |
*/ |
||||||
None, |
None, |
||||||
/** |
/** |
||||||
* The target rotates with the direction of the path. |
* The target rotates with the direction of the path. |
||||||
*/ |
*/ |
||||||
Path, |
Path, |
||||||
/** |
/** |
||||||
* The target rotates with the direction of the path but with the addition of a rotation. |
* The target rotates with the direction of the path but with the addition of a rotation. |
||||||
* You need to use the setRotation method when using this Direction. |
* You need to use the setRotation method when using this Direction. |
||||||
*/ |
*/ |
||||||
PathAndRotation, |
PathAndRotation, |
||||||
/** |
/** |
||||||
* The target rotates with the given rotation. |
* The target rotates with the given rotation. |
||||||
*/ |
*/ |
||||||
Rotation, |
Rotation, |
||||||
/** |
/** |
||||||
* The target looks at a point. |
* The target looks at a point. |
||||||
* You need to use the setLookAt method when using this direction. |
* You need to use the setLookAt method when using this direction. |
||||||
*/ |
*/ |
||||||
LookAt |
LookAt |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Create MotionEvent, |
* Create MotionEvent, |
||||||
* when using this constructor don't forget to assign spatial and path. |
* when using this constructor don't forget to assign spatial and path. |
||||||
*/ |
*/ |
||||||
public MotionEvent() { |
public MotionEvent() { |
||||||
super(); |
super(); |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Creates a MotionPath for the given spatial on the given motion path. |
* Creates a MotionPath for the given spatial on the given motion path. |
||||||
* @param spatial |
* @param spatial |
||||||
* @param path |
* @param path |
||||||
*/ |
*/ |
||||||
public MotionEvent(Spatial spatial, MotionPath path) { |
public MotionEvent(Spatial spatial, MotionPath path) { |
||||||
super(); |
super(); |
||||||
spatial.addControl(this); |
spatial.addControl(this); |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Creates a MotionPath for the given spatial on the given motion path. |
* Creates a MotionPath for the given spatial on the given motion path. |
||||||
* @param spatial |
* @param spatial |
||||||
* @param path |
* @param path |
||||||
*/ |
*/ |
||||||
public MotionEvent(Spatial spatial, MotionPath path, float initialDuration) { |
public MotionEvent(Spatial spatial, MotionPath path, float initialDuration) { |
||||||
super(initialDuration); |
super(initialDuration); |
||||||
spatial.addControl(this); |
spatial.addControl(this); |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Creates a MotionPath for the given spatial on the given motion path. |
* Creates a MotionPath for the given spatial on the given motion path. |
||||||
* @param spatial |
* @param spatial |
||||||
* @param path |
* @param path |
||||||
*/ |
*/ |
||||||
public MotionEvent(Spatial spatial, MotionPath path, LoopMode loopMode) { |
public MotionEvent(Spatial spatial, MotionPath path, LoopMode loopMode) { |
||||||
super(); |
super(); |
||||||
spatial.addControl(this); |
spatial.addControl(this); |
||||||
this.path = path; |
this.path = path; |
||||||
this.loopMode = loopMode; |
this.loopMode = loopMode; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Creates a MotionPath for the given spatial on the given motion path. |
* Creates a MotionPath for the given spatial on the given motion path. |
||||||
* @param spatial |
* @param spatial |
||||||
* @param path |
* @param path |
||||||
*/ |
*/ |
||||||
public MotionEvent(Spatial spatial, MotionPath path, float initialDuration, LoopMode loopMode) { |
public MotionEvent(Spatial spatial, MotionPath path, float initialDuration, LoopMode loopMode) { |
||||||
super(initialDuration); |
super(initialDuration); |
||||||
spatial.addControl(this); |
spatial.addControl(this); |
||||||
this.path = path; |
this.path = path; |
||||||
this.loopMode = loopMode; |
this.loopMode = loopMode; |
||||||
} |
} |
||||||
|
|
||||||
public void update(float tpf) { |
public void update(float tpf) { |
||||||
if (isControl) { |
if (isControl) { |
||||||
internalUpdate(tpf); |
internalUpdate(tpf); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void internalUpdate(float tpf) { |
public void internalUpdate(float tpf) { |
||||||
if (playState == PlayState.Playing) { |
if (playState == PlayState.Playing) { |
||||||
time = time + (tpf * speed); |
time = time + (tpf * speed); |
||||||
if (loopMode == LoopMode.Loop && time < 0) { |
if (loopMode == LoopMode.Loop && time < 0) { |
||||||
time = initialDuration; |
time = initialDuration; |
||||||
} |
} |
||||||
if ((time >= initialDuration || time < 0) && loopMode == LoopMode.DontLoop) { |
if ((time >= initialDuration || time < 0) && loopMode == LoopMode.DontLoop) { |
||||||
if (time >= initialDuration) { |
if (time >= initialDuration) { |
||||||
path.triggerWayPointReach(path.getNbWayPoints() - 1, this); |
path.triggerWayPointReach(path.getNbWayPoints() - 1, this); |
||||||
} |
} |
||||||
stop(); |
stop(); |
||||||
} else { |
} else { |
||||||
time = AnimationUtils.clampWrapTime(time, initialDuration, loopMode); |
time = AnimationUtils.clampWrapTime(time, initialDuration, loopMode); |
||||||
if(time<0){ |
if(time<0){ |
||||||
speed = - speed; |
speed = - speed; |
||||||
time = - time; |
time = - time; |
||||||
} |
} |
||||||
onUpdate(tpf); |
onUpdate(tpf); |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void initEvent(Application app, Cinematic cinematic) { |
public void initEvent(Application app, Cinematic cinematic) { |
||||||
super.initEvent(app, cinematic); |
super.initEvent(app, cinematic); |
||||||
isControl = false; |
isControl = false; |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void setTime(float time) { |
public void setTime(float time) { |
||||||
super.setTime(time); |
super.setTime(time); |
||||||
onUpdate(0); |
onUpdate(0); |
||||||
} |
} |
||||||
|
|
||||||
public void onUpdate(float tpf) { |
public void onUpdate(float tpf) { |
||||||
traveledDistance = path.interpolatePath(time, this, tpf); |
traveledDistance = path.interpolatePath(time, this, tpf); |
||||||
computeTargetDirection(); |
computeTargetDirection(); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void write(JmeExporter ex) throws IOException { |
public void write(JmeExporter ex) throws IOException { |
||||||
super.write(ex); |
super.write(ex); |
||||||
OutputCapsule oc = ex.getCapsule(this); |
OutputCapsule oc = ex.getCapsule(this); |
||||||
oc.write(lookAt, "lookAt", null); |
oc.write(lookAt, "lookAt", null); |
||||||
oc.write(upVector, "upVector", Vector3f.UNIT_Y); |
oc.write(upVector, "upVector", Vector3f.UNIT_Y); |
||||||
oc.write(rotation, "rotation", null); |
oc.write(rotation, "rotation", null); |
||||||
oc.write(directionType, "directionType", Direction.None); |
oc.write(directionType, "directionType", Direction.None); |
||||||
oc.write(path, "path", null); |
oc.write(path, "path", null); |
||||||
oc.write(spatial, "spatial", null); |
oc.write(spatial, "spatial", null); |
||||||
} |
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void read(JmeImporter im) throws IOException { |
public void read(JmeImporter im) throws IOException { |
||||||
super.read(im); |
super.read(im); |
||||||
InputCapsule in = im.getCapsule(this); |
InputCapsule in = im.getCapsule(this); |
||||||
lookAt = (Vector3f) in.readSavable("lookAt", null); |
lookAt = (Vector3f) in.readSavable("lookAt", null); |
||||||
upVector = (Vector3f) in.readSavable("upVector", Vector3f.UNIT_Y); |
upVector = (Vector3f) in.readSavable("upVector", Vector3f.UNIT_Y); |
||||||
rotation = (Quaternion) in.readSavable("rotation", null); |
rotation = (Quaternion) in.readSavable("rotation", null); |
||||||
directionType = in.readEnum("directionType", Direction.class, Direction.None); |
directionType = in.readEnum("directionType", Direction.class, Direction.None); |
||||||
path = (MotionPath) in.readSavable("path", null); |
path = (MotionPath) in.readSavable("path", null); |
||||||
spatial = (Spatial) in.readSavable("spatial", null); |
spatial = (Spatial) in.readSavable("spatial", null); |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* This method is meant to be called by the motion path only. |
* This method is meant to be called by the motion path only. |
||||||
* @return |
* @return |
||||||
*/ |
*/ |
||||||
public boolean needsDirection() { |
public boolean needsDirection() { |
||||||
return directionType == Direction.Path || directionType == Direction.PathAndRotation; |
return directionType == Direction.Path || directionType == Direction.PathAndRotation; |
||||||
} |
} |
||||||
|
|
||||||
private void computeTargetDirection() { |
private void computeTargetDirection() { |
||||||
switch (directionType) { |
switch (directionType) { |
||||||
case Path: |
case Path: |
||||||
Quaternion q = new Quaternion(); |
Quaternion q = new Quaternion(); |
||||||
q.lookAt(direction, upVector); |
q.lookAt(direction, upVector); |
||||||
spatial.setLocalRotation(q); |
spatial.setLocalRotation(q); |
||||||
break; |
break; |
||||||
case LookAt: |
case LookAt: |
||||||
if (lookAt != null) { |
if (lookAt != null) { |
||||||
spatial.lookAt(lookAt, upVector); |
spatial.lookAt(lookAt, upVector); |
||||||
} |
} |
||||||
break; |
break; |
||||||
case PathAndRotation: |
case PathAndRotation: |
||||||
if (rotation != null) { |
if (rotation != null) { |
||||||
Quaternion q2 = new Quaternion(); |
Quaternion q2 = new Quaternion(); |
||||||
q2.lookAt(direction, upVector); |
q2.lookAt(direction, upVector); |
||||||
q2.multLocal(rotation); |
q2.multLocal(rotation); |
||||||
spatial.setLocalRotation(q2); |
spatial.setLocalRotation(q2); |
||||||
} |
} |
||||||
break; |
break; |
||||||
case Rotation: |
case Rotation: |
||||||
if (rotation != null) { |
if (rotation != null) { |
||||||
spatial.setLocalRotation(rotation); |
spatial.setLocalRotation(rotation); |
||||||
} |
} |
||||||
break; |
break; |
||||||
case None: |
case None: |
||||||
break; |
break; |
||||||
default: |
default: |
||||||
break; |
break; |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Clone this control for the given spatial. |
* Clone this control for the given spatial. |
||||||
* @param spatial |
* @param spatial |
||||||
* @return |
* @return |
||||||
*/ |
*/ |
||||||
@Override |
@Deprecated |
||||||
public Control cloneForSpatial(Spatial spatial) { |
@Override |
||||||
MotionEvent control = new MotionEvent(); |
public Control cloneForSpatial(Spatial spatial) { |
||||||
control.setPath(path); |
throw new UnsupportedOperationException(); |
||||||
control.playState = playState; |
} |
||||||
control.currentWayPoint = currentWayPoint; |
|
||||||
control.currentValue = currentValue; |
@Override |
||||||
control.direction = direction.clone(); |
public Object jmeClone() { |
||||||
control.lookAt = lookAt; |
MotionEvent control = new MotionEvent(); |
||||||
control.upVector = upVector.clone(); |
control.path = path; |
||||||
control.rotation = rotation; |
control.playState = playState; |
||||||
control.initialDuration = initialDuration; |
control.currentWayPoint = currentWayPoint; |
||||||
control.speed = speed; |
control.currentValue = currentValue; |
||||||
control.loopMode = loopMode; |
control.direction = direction.clone(); |
||||||
control.directionType = directionType; |
control.lookAt = lookAt; |
||||||
|
control.upVector = upVector.clone(); |
||||||
return control; |
control.rotation = rotation; |
||||||
} |
control.initialDuration = initialDuration; |
||||||
|
control.speed = speed; |
||||||
@Override |
control.loopMode = loopMode; |
||||||
public Object jmeClone() { |
control.directionType = directionType; |
||||||
MotionEvent control = new MotionEvent(); |
control.spatial = spatial; |
||||||
control.path = path; |
|
||||||
control.playState = playState; |
return control; |
||||||
control.currentWayPoint = currentWayPoint; |
} |
||||||
control.currentValue = currentValue; |
|
||||||
control.direction = direction.clone(); |
@Override |
||||||
control.lookAt = lookAt; |
public void cloneFields( Cloner cloner, Object original ) { |
||||||
control.upVector = upVector.clone(); |
this.spatial = cloner.clone(spatial); |
||||||
control.rotation = rotation; |
} |
||||||
control.initialDuration = initialDuration; |
|
||||||
control.speed = speed; |
@Override |
||||||
control.loopMode = loopMode; |
public void onPlay() { |
||||||
control.directionType = directionType; |
traveledDistance = 0; |
||||||
control.spatial = spatial; |
} |
||||||
|
|
||||||
return control; |
@Override |
||||||
} |
public void onStop() { |
||||||
|
currentWayPoint = 0; |
||||||
@Override |
} |
||||||
public void cloneFields( Cloner cloner, Object original ) { |
|
||||||
this.spatial = cloner.clone(spatial); |
@Override |
||||||
} |
public void onPause() { |
||||||
|
} |
||||||
@Override |
|
||||||
public void onPlay() { |
/** |
||||||
traveledDistance = 0; |
* This method is meant to be called by the motion path only. |
||||||
} |
* @return |
||||||
|
*/ |
||||||
@Override |
public float getCurrentValue() { |
||||||
public void onStop() { |
return currentValue; |
||||||
currentWayPoint = 0; |
} |
||||||
} |
|
||||||
|
/** |
||||||
@Override |
* This method is meant to be called by the motion path only. |
||||||
public void onPause() { |
* |
||||||
} |
*/ |
||||||
|
public void setCurrentValue(float currentValue) { |
||||||
/** |
this.currentValue = currentValue; |
||||||
* This method is meant to be called by the motion path only. |
} |
||||||
* @return |
|
||||||
*/ |
/** |
||||||
public float getCurrentValue() { |
* This method is meant to be called by the motion path only. |
||||||
return currentValue; |
* @return |
||||||
} |
*/ |
||||||
|
public int getCurrentWayPoint() { |
||||||
/** |
return currentWayPoint; |
||||||
* This method is meant to be called by the motion path only. |
} |
||||||
* |
|
||||||
*/ |
/** |
||||||
public void setCurrentValue(float currentValue) { |
* This method is meant to be called by the motion path only. |
||||||
this.currentValue = currentValue; |
* |
||||||
} |
*/ |
||||||
|
public void setCurrentWayPoint(int currentWayPoint) { |
||||||
/** |
this.currentWayPoint = currentWayPoint; |
||||||
* This method is meant to be called by the motion path only. |
} |
||||||
* @return |
|
||||||
*/ |
/** |
||||||
public int getCurrentWayPoint() { |
* Returns the direction the spatial is moving. |
||||||
return currentWayPoint; |
* @return |
||||||
} |
*/ |
||||||
|
public Vector3f getDirection() { |
||||||
/** |
return direction; |
||||||
* This method is meant to be called by the motion path only. |
} |
||||||
* |
|
||||||
*/ |
/** |
||||||
public void setCurrentWayPoint(int currentWayPoint) { |
* Sets the direction of the spatial, using the Y axis as the up vector. |
||||||
this.currentWayPoint = currentWayPoint; |
* Use MotionEvent#setDirection((Vector3f direction,Vector3f upVector) if |
||||||
} |
* you want a custum up vector. |
||||||
|
* This method is used by the motion path. |
||||||
/** |
* @param direction |
||||||
* Returns the direction the spatial is moving. |
*/ |
||||||
* @return |
public void setDirection(Vector3f direction) { |
||||||
*/ |
setDirection(direction, Vector3f.UNIT_Y); |
||||||
public Vector3f getDirection() { |
} |
||||||
return direction; |
|
||||||
} |
/** |
||||||
|
* Sets the direction of the spatial with the given up vector. |
||||||
/** |
* This method is used by the motion path. |
||||||
* Sets the direction of the spatial, using the Y axis as the up vector. |
* @param direction |
||||||
* Use MotionEvent#setDirection((Vector3f direction,Vector3f upVector) if |
* @param upVector the up vector to consider for this direction. |
||||||
* you want a custum up vector. |
*/ |
||||||
* This method is used by the motion path. |
public void setDirection(Vector3f direction,Vector3f upVector) { |
||||||
* @param direction |
this.direction.set(direction); |
||||||
*/ |
this.upVector.set(upVector); |
||||||
public void setDirection(Vector3f direction) { |
} |
||||||
setDirection(direction, Vector3f.UNIT_Y); |
|
||||||
} |
/** |
||||||
|
* Returns the direction type of the target. |
||||||
/** |
* @return the direction type. |
||||||
* Sets the direction of the spatial with the given up vector. |
*/ |
||||||
* This method is used by the motion path. |
public Direction getDirectionType() { |
||||||
* @param direction |
return directionType; |
||||||
* @param upVector the up vector to consider for this direction. |
} |
||||||
*/ |
|
||||||
public void setDirection(Vector3f direction,Vector3f upVector) { |
/** |
||||||
this.direction.set(direction); |
* Sets the direction type of the target. |
||||||
this.upVector.set(upVector); |
* On each update the direction given to the target can have different behavior. |
||||||
} |
* See the Direction Enum for explanations. |
||||||
|
* @param directionType the direction type. |
||||||
/** |
*/ |
||||||
* Returns the direction type of the target. |
public void setDirectionType(Direction directionType) { |
||||||
* @return the direction type. |
this.directionType = directionType; |
||||||
*/ |
} |
||||||
public Direction getDirectionType() { |
|
||||||
return directionType; |
/** |
||||||
} |
* Set the lookAt for the target. |
||||||
|
* This can be used only if direction Type is Direction.LookAt. |
||||||
/** |
* @param lookAt the position to look at. |
||||||
* Sets the direction type of the target. |
* @param upVector the up vector. |
||||||
* On each update the direction given to the target can have different behavior. |
*/ |
||||||
* See the Direction Enum for explanations. |
public void setLookAt(Vector3f lookAt, Vector3f upVector) { |
||||||
* @param directionType the direction type. |
this.lookAt = lookAt; |
||||||
*/ |
this.upVector = upVector; |
||||||
public void setDirectionType(Direction directionType) { |
} |
||||||
this.directionType = directionType; |
|
||||||
} |
/** |
||||||
|
* Returns the rotation of the target. |
||||||
/** |
* @return the rotation quaternion. |
||||||
* Set the lookAt for the target. |
*/ |
||||||
* This can be used only if direction Type is Direction.LookAt. |
public Quaternion getRotation() { |
||||||
* @param lookAt the position to look at. |
return rotation; |
||||||
* @param upVector the up vector. |
} |
||||||
*/ |
|
||||||
public void setLookAt(Vector3f lookAt, Vector3f upVector) { |
/** |
||||||
this.lookAt = lookAt; |
* Sets the rotation of the target. |
||||||
this.upVector = upVector; |
* This can be used only if direction Type is Direction.PathAndRotation or Direction.Rotation. |
||||||
} |
* With PathAndRotation the target will face the direction of the path multiplied by the given Quaternion. |
||||||
|
* With Rotation the rotation of the target will be set with the given Quaternion. |
||||||
/** |
* @param rotation the rotation quaternion. |
||||||
* Returns the rotation of the target. |
*/ |
||||||
* @return the rotation quaternion. |
public void setRotation(Quaternion rotation) { |
||||||
*/ |
this.rotation = rotation; |
||||||
public Quaternion getRotation() { |
} |
||||||
return rotation; |
|
||||||
} |
/** |
||||||
|
* Return the motion path this control follows. |
||||||
/** |
* @return |
||||||
* Sets the rotation of the target. |
*/ |
||||||
* This can be used only if direction Type is Direction.PathAndRotation or Direction.Rotation. |
public MotionPath getPath() { |
||||||
* With PathAndRotation the target will face the direction of the path multiplied by the given Quaternion. |
return path; |
||||||
* With Rotation the rotation of the target will be set with the given Quaternion. |
} |
||||||
* @param rotation the rotation quaternion. |
|
||||||
*/ |
/** |
||||||
public void setRotation(Quaternion rotation) { |
* Sets the motion path to follow. |
||||||
this.rotation = rotation; |
* @param path |
||||||
} |
*/ |
||||||
|
public void setPath(MotionPath path) { |
||||||
/** |
this.path = path; |
||||||
* Return the motion path this control follows. |
} |
||||||
* @return |
|
||||||
*/ |
public void setEnabled(boolean enabled) { |
||||||
public MotionPath getPath() { |
if (enabled) { |
||||||
return path; |
play(); |
||||||
} |
} else { |
||||||
|
pause(); |
||||||
/** |
} |
||||||
* Sets the motion path to follow. |
} |
||||||
* @param path |
|
||||||
*/ |
public boolean isEnabled() { |
||||||
public void setPath(MotionPath path) { |
return playState != PlayState.Stopped; |
||||||
this.path = path; |
} |
||||||
} |
|
||||||
|
public void render(RenderManager rm, ViewPort vp) { |
||||||
public void setEnabled(boolean enabled) { |
} |
||||||
if (enabled) { |
|
||||||
play(); |
public void setSpatial(Spatial spatial) { |
||||||
} else { |
this.spatial = spatial; |
||||||
pause(); |
} |
||||||
} |
|
||||||
} |
public Spatial getSpatial() { |
||||||
|
return spatial; |
||||||
public boolean isEnabled() { |
} |
||||||
return playState != PlayState.Stopped; |
|
||||||
} |
/** |
||||||
|
* Return the distance traveled by the spatial on the path. |
||||||
public void render(RenderManager rm, ViewPort vp) { |
* @return |
||||||
} |
*/ |
||||||
|
public float getTraveledDistance() { |
||||||
public void setSpatial(Spatial spatial) { |
return traveledDistance; |
||||||
this.spatial = spatial; |
} |
||||||
} |
} |
||||||
|
|
||||||
public Spatial getSpatial() { |
|
||||||
return spatial; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Return the distance traveled by the spatial on the path. |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
public float getTraveledDistance() { |
|
||||||
return traveledDistance; |
|
||||||
} |
|
||||||
} |
|
||||||
|
@ -1,229 +1,230 @@ |
|||||||
/* |
/* |
||||||
* Copyright (c) 2009-2012 jMonkeyEngine |
* Copyright (c) 2009-2012 jMonkeyEngine |
||||||
* All rights reserved. |
* All rights reserved. |
||||||
* |
* |
||||||
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
||||||
* modification, are permitted provided that the following conditions are |
* modification, are permitted provided that the following conditions are |
||||||
* met: |
* met: |
||||||
* |
* |
||||||
* * Redistributions of source code must retain the above copyright |
* * Redistributions of source code must retain the above copyright |
||||||
* notice, this list of conditions and the following disclaimer. |
* notice, this list of conditions and the following disclaimer. |
||||||
* |
* |
||||||
* * Redistributions in binary form must reproduce the above copyright |
* * Redistributions in binary form must reproduce the above copyright |
||||||
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
||||||
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
||||||
* |
* |
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
||||||
* without specific prior written permission. |
* without specific prior written permission. |
||||||
* |
* |
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
*/ |
*/ |
||||||
package com.jme3.cinematic.events; |
package com.jme3.cinematic.events; |
||||||
|
|
||||||
import com.jme3.animation.LoopMode; |
import com.jme3.animation.LoopMode; |
||||||
import com.jme3.app.Application; |
import com.jme3.app.Application; |
||||||
import com.jme3.audio.AudioNode; |
import com.jme3.audio.AudioNode; |
||||||
import com.jme3.audio.AudioSource; |
import com.jme3.audio.AudioSource; |
||||||
import com.jme3.cinematic.Cinematic; |
import com.jme3.cinematic.Cinematic; |
||||||
import com.jme3.export.InputCapsule; |
import com.jme3.export.InputCapsule; |
||||||
import com.jme3.export.JmeExporter; |
import com.jme3.export.JmeExporter; |
||||||
import com.jme3.export.JmeImporter; |
import com.jme3.export.JmeImporter; |
||||||
import com.jme3.export.OutputCapsule; |
import com.jme3.export.OutputCapsule; |
||||||
import java.io.IOException; |
import java.io.IOException; |
||||||
|
|
||||||
/** |
/** |
||||||
* A sound track to be played in a cinematic. |
* A sound track to be played in a cinematic. |
||||||
* @author Nehon |
* @author Nehon |
||||||
*/ |
*/ |
||||||
public class SoundEvent extends AbstractCinematicEvent { |
public class SoundEvent extends AbstractCinematicEvent { |
||||||
|
|
||||||
protected String path; |
protected String path; |
||||||
protected AudioNode audioNode; |
protected AudioNode audioNode; |
||||||
protected boolean stream = false; |
protected boolean stream = false; |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path) { |
public SoundEvent(String path) { |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param stream true to make the audio data streamed |
* @param stream true to make the audio data streamed |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, boolean stream) { |
public SoundEvent(String path, boolean stream) { |
||||||
this(path); |
this(path); |
||||||
this.stream = stream; |
this.stream = stream; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param stream true to make the audio data streamed |
* @param stream true to make the audio data streamed |
||||||
* @param initialDuration the initial duration of the event |
* @param initialDuration the initial duration of the event |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, boolean stream, float initialDuration) { |
public SoundEvent(String path, boolean stream, float initialDuration) { |
||||||
super(initialDuration); |
super(initialDuration); |
||||||
this.path = path; |
this.path = path; |
||||||
this.stream = stream; |
this.stream = stream; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param stream true to make the audio data streamed |
* @param stream true to make the audio data streamed |
||||||
* @param loopMode the loopMode |
* @param loopMode the loopMode |
||||||
* @see LoopMode |
* @see LoopMode |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, boolean stream, LoopMode loopMode) { |
public SoundEvent(String path, boolean stream, LoopMode loopMode) { |
||||||
super(loopMode); |
super(loopMode); |
||||||
this.path = path; |
this.path = path; |
||||||
this.stream = stream; |
this.stream = stream; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param stream true to make the audio data streamed |
* @param stream true to make the audio data streamed |
||||||
* @param initialDuration the initial duration of the event |
* @param initialDuration the initial duration of the event |
||||||
* @param loopMode the loopMode |
* @param loopMode the loopMode |
||||||
* @see LoopMode |
* @see LoopMode |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, boolean stream, float initialDuration, LoopMode loopMode) { |
public SoundEvent(String path, boolean stream, float initialDuration, LoopMode loopMode) { |
||||||
super(initialDuration, loopMode); |
super(initialDuration, loopMode); |
||||||
this.path = path; |
this.path = path; |
||||||
this.stream = stream; |
this.stream = stream; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param initialDuration the initial duration of the event |
* @param initialDuration the initial duration of the event |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, float initialDuration) { |
public SoundEvent(String path, float initialDuration) { |
||||||
super(initialDuration); |
super(initialDuration); |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param loopMode the loopMode |
* @param loopMode the loopMode |
||||||
* @see LoopMode |
* @see LoopMode |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, LoopMode loopMode) { |
public SoundEvent(String path, LoopMode loopMode) { |
||||||
super(loopMode); |
super(loopMode); |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound track from the given resource path |
* creates a sound track from the given resource path |
||||||
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
* @param path the path to an audio file (ie : "Sounds/mySound.wav") |
||||||
* @param initialDuration the initial duration of the event |
* @param initialDuration the initial duration of the event |
||||||
* @param loopMode the loopMode |
* @param loopMode the loopMode |
||||||
* @see LoopMode |
* @see LoopMode |
||||||
*/ |
*/ |
||||||
public SoundEvent(String path, float initialDuration, LoopMode loopMode) { |
public SoundEvent(String path, float initialDuration, LoopMode loopMode) { |
||||||
super(initialDuration, loopMode); |
super(initialDuration, loopMode); |
||||||
this.path = path; |
this.path = path; |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* creates a sound event |
* creates a sound event |
||||||
* used for serialization |
* used for serialization |
||||||
*/ |
*/ |
||||||
public SoundEvent() { |
public SoundEvent() { |
||||||
} |
super(); |
||||||
|
} |
||||||
@Override |
|
||||||
public void initEvent(Application app, Cinematic cinematic) { |
@Override |
||||||
super.initEvent(app, cinematic); |
public void initEvent(Application app, Cinematic cinematic) { |
||||||
audioNode = new AudioNode(app.getAssetManager(), path, stream); |
super.initEvent(app, cinematic); |
||||||
audioNode.setPositional(false); |
audioNode = new AudioNode(app.getAssetManager(), path, stream); |
||||||
setLoopMode(loopMode); |
audioNode.setPositional(false); |
||||||
} |
setLoopMode(loopMode); |
||||||
|
} |
||||||
@Override |
|
||||||
public void setTime(float time) { |
@Override |
||||||
super.setTime(time); |
public void setTime(float time) { |
||||||
//can occur on rewind
|
super.setTime(time); |
||||||
if (time < 0f) { |
//can occur on rewind
|
||||||
stop(); |
if (time < 0f) { |
||||||
}else{ |
stop(); |
||||||
audioNode.setTimeOffset(time); |
}else{ |
||||||
} |
audioNode.setTimeOffset(time); |
||||||
} |
} |
||||||
|
} |
||||||
@Override |
|
||||||
public void onPlay() { |
@Override |
||||||
audioNode.play(); |
public void onPlay() { |
||||||
} |
audioNode.play(); |
||||||
|
} |
||||||
@Override |
|
||||||
public void onStop() { |
@Override |
||||||
audioNode.stop(); |
public void onStop() { |
||||||
|
audioNode.stop(); |
||||||
} |
|
||||||
|
} |
||||||
@Override |
|
||||||
public void onPause() { |
@Override |
||||||
audioNode.pause(); |
public void onPause() { |
||||||
} |
audioNode.pause(); |
||||||
|
} |
||||||
@Override |
|
||||||
public void onUpdate(float tpf) { |
@Override |
||||||
if (audioNode.getStatus() == AudioSource.Status.Stopped) { |
public void onUpdate(float tpf) { |
||||||
stop(); |
if (audioNode.getStatus() == AudioSource.Status.Stopped) { |
||||||
} |
stop(); |
||||||
} |
} |
||||||
|
} |
||||||
/** |
|
||||||
* Returns the underlying audio node of this sound track |
/** |
||||||
* @return |
* Returns the underlying audio node of this sound track |
||||||
*/ |
* @return |
||||||
public AudioNode getAudioNode() { |
*/ |
||||||
return audioNode; |
public AudioNode getAudioNode() { |
||||||
} |
return audioNode; |
||||||
|
} |
||||||
@Override |
|
||||||
public void setLoopMode(LoopMode loopMode) { |
@Override |
||||||
super.setLoopMode(loopMode); |
public void setLoopMode(LoopMode loopMode) { |
||||||
|
super.setLoopMode(loopMode); |
||||||
if (loopMode != LoopMode.DontLoop) { |
|
||||||
audioNode.setLooping(true); |
if (loopMode != LoopMode.DontLoop) { |
||||||
} else { |
audioNode.setLooping(true); |
||||||
audioNode.setLooping(false); |
} else { |
||||||
} |
audioNode.setLooping(false); |
||||||
} |
} |
||||||
|
} |
||||||
@Override |
|
||||||
public void write(JmeExporter ex) throws IOException { |
@Override |
||||||
super.write(ex); |
public void write(JmeExporter ex) throws IOException { |
||||||
OutputCapsule oc = ex.getCapsule(this); |
super.write(ex); |
||||||
oc.write(path, "path", ""); |
OutputCapsule oc = ex.getCapsule(this); |
||||||
oc.write(stream, "stream", false); |
oc.write(path, "path", ""); |
||||||
} |
oc.write(stream, "stream", false); |
||||||
|
} |
||||||
@Override |
|
||||||
public void read(JmeImporter im) throws IOException { |
@Override |
||||||
super.read(im); |
public void read(JmeImporter im) throws IOException { |
||||||
InputCapsule ic = im.getCapsule(this); |
super.read(im); |
||||||
path = ic.readString("path", ""); |
InputCapsule ic = im.getCapsule(this); |
||||||
stream = ic.readBoolean("stream", false); |
path = ic.readString("path", ""); |
||||||
|
stream = ic.readBoolean("stream", false); |
||||||
} |
|
||||||
} |
} |
||||||
|
} |
||||||
|
@ -0,0 +1,45 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2009-2018 jMonkeyEngine |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* |
||||||
|
* * Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in the |
||||||
|
* documentation and/or other materials provided with the distribution. |
||||||
|
* |
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||||
|
* may be used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
*/ |
||||||
|
package com.jme3.material; |
||||||
|
|
||||||
|
/** |
||||||
|
* This class is to provide some constants materials. |
||||||
|
* |
||||||
|
* @author oualid |
||||||
|
*/ |
||||||
|
public class Materials { |
||||||
|
|
||||||
|
public static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; |
||||||
|
public static final String LIGHTING = "Common/MatDefs/Light/Lighting.j3md"; |
||||||
|
public static final String PBR = "Common/MatDefs/Light/PBRLighting.j3md"; |
||||||
|
|
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue