animationcontroller.java
来自「java 3d game jme 工程开发源代码」· Java 代码 · 共 503 行 · 第 1/2 页
JAVA
503 行
/*
* Copyright (c) 2003-2009 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.jme.animation;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import com.jme.math.FastMath;
import com.jme.scene.Controller;
import com.jme.scene.Spatial;
import com.jme.util.export.InputCapsule;
import com.jme.util.export.JMEExporter;
import com.jme.util.export.JMEImporter;
import com.jme.util.export.OutputCapsule;
import com.jme.util.export.Savable;
/**
* AnimationController provides a method for managing multiple BoneAnimations.
* AnimationController maintains a list of available animations to play, and
* a reference to the currently active animation. The currently active animation
* can be set via index into the animation set, the name of the animation or
* a reference to the animation itself. If blending is used, the active animation
* is not immediately switched, but instead morphs with an incoming animation via
* crossfading for a specified period of time. When the blend is complete, the
* active animation is set to the incoming animation.
*
* The
*
* @see com.jme.animation.BoneAnimation
* @author mpowell
*
*/
public class AnimationController extends Controller implements Savable {
private static final long serialVersionUID = 1L;
private ArrayList<BoneAnimation> animationSets;
private Bone skeleton;
private Spatial modelNode;
private BoneAnimation activeAnimation;
// private class ModifierData {
// public BoneAnimation animation;
// public float blendTime;
// }
// private ArrayList<ModifierData> activeAnimationsList = new ArrayList<ModifierData>();
private BoneAnimation blendAnimation;
private float currentBlendTime;
private float endBlendTime;
private boolean needsSync;
private int previousTest = -1;
private AnimationProperties props;
public AnimationController() {
}
public void addAnimation(BoneAnimation bac) {
if (bac == null) {
return;
}
if (animationSets == null) {
animationSets = new ArrayList<BoneAnimation>();
}
animationSets.add(bac);
if (skeleton != null) {
bac.assignSkeleton(skeleton);
}
}
public boolean hasAnimation(String name) {
if (animationSets != null) {
for (int i = 0; i < animationSets.size(); i++) {
if (animationSets.get(i).getName().equalsIgnoreCase(name)) {
return true;
}
}
}
return false;
}
public BoneAnimation getAnimation(String name) {
if (animationSets != null) {
for (int i = 0; i < animationSets.size(); i++) {
if (animationSets.get(i).getName().equalsIgnoreCase(name)) {
return animationSets.get(i);
}
}
}
return null;
}
public void removeAnimation(BoneAnimation bac) {
if (animationSets != null) {
animationSets.remove(bac);
if (animationSets.size() == 0) {
activeAnimation = null;
} else if (bac == activeAnimation) {
activeAnimation = animationSets.get(0);
}
}
}
public void removeAnimation(int index) {
if (animationSets == null || index < 0 || index >= animationSets.size()) {
return;
}
BoneAnimation bac = animationSets.get(index);
animationSets.remove(index);
if (animationSets.size() == 0) {
activeAnimation = null;
} else if (bac == activeAnimation) {
activeAnimation = animationSets.get(0);
}
}
public BoneAnimation getActiveAnimation() {
return activeAnimation;
}
public void setCurrentFrame(int frame) {
if (activeAnimation != null) {
activeAnimation.setCurrentFrame(frame);
}
}
public void clearAnimations() {
if (animationSets != null) {
animationSets.clear();
}
}
public BoneAnimation getAnimation(int i) {
if (animationSets != null) {
return animationSets.get(i);
} else {
return null;
}
}
public ArrayList<BoneAnimation> getAnimations() {
return animationSets;
}
public void clearActiveAnimation() {
activeAnimation = null;
blendAnimation = null;
}
public void setBlendAnimation(BoneAnimation blendAnimation,
float blendTime, boolean sync) {
// don't blend between the same animation
if (blendAnimation == this.blendAnimation) {
return;
}
if(blendAnimation == this.activeAnimation /*&& this.blendAnimation == null*/) {
needsSync = false;
this.blendAnimation = blendAnimation;
this.blendAnimation.setCurrentFrame(this.activeAnimation.getCurrentFrame());
currentBlendTime = 1;
} else {
// if (this.blendAnimation != null) {
// ModifierData modifierData = new ModifierData();
// modifierData.animation = this.blendAnimation;
// modifierData.blendTime = this.currentBlendTime;
// activeAnimationsList.add(modifierData);
// }
blendAnimation.reset();
this.blendAnimation = blendAnimation;
if (sync) {
needsSync = true;
calculateSyncFrame();
} else {
needsSync = false;
}
currentBlendTime = 0f;
endBlendTime = blendTime;
}
}
private void calculateSyncFrame() {
if (activeAnimation != null && blendAnimation != null
&& previousTest != activeAnimation.getCurrentFrame()) {
previousTest = activeAnimation.getCurrentFrame();
// Make sure current animation has sync tags.
Set<String> activeTags = activeAnimation.getAllSyncTags();
if (activeTags == null || activeTags.size() == 0) {
needsSync = false;
return;
}
// Make sure blend animation has sync tags.
Set<String> blendTags = blendAnimation.getAllSyncTags();
if (blendTags == null || blendTags.size() == 0) {
needsSync = false;
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?