|
|
|
@ -32,23 +32,30 @@ |
|
|
|
|
|
|
|
|
|
package jme3test.model.anim; |
|
|
|
|
|
|
|
|
|
import com.jme3.animation.*; |
|
|
|
|
import com.jme3.anim.AnimClip; |
|
|
|
|
import com.jme3.anim.AnimComposer; |
|
|
|
|
import com.jme3.anim.SkinningControl; |
|
|
|
|
import com.jme3.anim.tween.Tween; |
|
|
|
|
import com.jme3.anim.tween.action.Action; |
|
|
|
|
import com.jme3.anim.tween.action.BaseAction; |
|
|
|
|
import com.jme3.anim.tween.action.LinearBlendSpace; |
|
|
|
|
import com.jme3.app.SimpleApplication; |
|
|
|
|
import com.jme3.input.KeyInput; |
|
|
|
|
import com.jme3.input.controls.ActionListener; |
|
|
|
|
import com.jme3.input.controls.KeyTrigger; |
|
|
|
|
import com.jme3.light.DirectionalLight; |
|
|
|
|
import com.jme3.math.*; |
|
|
|
|
import com.jme3.scene.*; |
|
|
|
|
import com.jme3.math.ColorRGBA; |
|
|
|
|
import com.jme3.math.Quaternion; |
|
|
|
|
import com.jme3.math.Vector3f; |
|
|
|
|
import com.jme3.scene.Geometry; |
|
|
|
|
import com.jme3.scene.Node; |
|
|
|
|
import com.jme3.scene.Spatial; |
|
|
|
|
import com.jme3.scene.shape.Box; |
|
|
|
|
|
|
|
|
|
//TODO rework this Test when the new animation system is done.
|
|
|
|
|
public class TestOgreAnim extends SimpleApplication |
|
|
|
|
implements AnimEventListener, ActionListener { |
|
|
|
|
public class TestOgreAnim extends SimpleApplication implements ActionListener { |
|
|
|
|
|
|
|
|
|
private AnimChannel channel; |
|
|
|
|
private AnimControl control; |
|
|
|
|
private Geometry geom; |
|
|
|
|
private AnimComposer animComposer; |
|
|
|
|
private static LoopAction currentAction; |
|
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
|
|
|
TestOgreAnim app = new TestOgreAnim(); |
|
|
|
@ -66,25 +73,25 @@ public class TestOgreAnim extends SimpleApplication |
|
|
|
|
dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); |
|
|
|
|
rootNode.addLight(dl); |
|
|
|
|
|
|
|
|
|
Spatial model = assetManager.loadModel("Models/Oto/OtoOldAnim.j3o"); |
|
|
|
|
Spatial model = assetManager.loadModel("Models/Oto/Oto.mesh.xml"); |
|
|
|
|
model.center(); |
|
|
|
|
|
|
|
|
|
control = model.getControl(AnimControl.class); |
|
|
|
|
control.addListener(this); |
|
|
|
|
channel = control.createChannel(); |
|
|
|
|
|
|
|
|
|
for (String anim : control.getAnimationNames()) |
|
|
|
|
System.out.println(anim); |
|
|
|
|
animComposer = model.getControl(AnimComposer.class); |
|
|
|
|
animComposer.actionBlended("Attack", new LinearBlendSpace(0f, 0.5f), "Dodge"); |
|
|
|
|
for (AnimClip animClip : animComposer.getAnimClips()) { |
|
|
|
|
Action action = animComposer.action(animClip.getName()); |
|
|
|
|
animComposer.addAction(animClip.getName(), new LoopAction(action, animComposer)); |
|
|
|
|
} |
|
|
|
|
currentAction = (LoopAction) animComposer.setCurrentAction("stand"); // Walk, pull, Dodge, stand, push
|
|
|
|
|
|
|
|
|
|
channel.setAnim("stand"); |
|
|
|
|
geom = (Geometry)((Node)model).getChild(0); |
|
|
|
|
SkeletonControl skeletonControl = model.getControl(SkeletonControl.class); |
|
|
|
|
SkinningControl skinningControl = model.getControl(SkinningControl.class); |
|
|
|
|
skinningControl.setHardwareSkinningPreferred(false); |
|
|
|
|
|
|
|
|
|
Box b = new Box(.25f, 3f, .25f); |
|
|
|
|
Geometry item = new Geometry("Item", b); |
|
|
|
|
item.move(0, 1.5f, 0); |
|
|
|
|
item.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m")); |
|
|
|
|
Node n = skeletonControl.getAttachmentsNode("hand.right"); |
|
|
|
|
Node n = skinningControl.getAttachmentsNode("hand.right"); |
|
|
|
|
n.attachChild(item); |
|
|
|
|
|
|
|
|
|
rootNode.attachChild(model); |
|
|
|
@ -94,35 +101,47 @@ public class TestOgreAnim extends SimpleApplication |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void simpleUpdate(float tpf) { |
|
|
|
|
super.simpleUpdate(tpf); |
|
|
|
|
// geom.getMesh().createCollisionData();
|
|
|
|
|
|
|
|
|
|
public void onAction(String binding, boolean value, float tpf) { |
|
|
|
|
if (binding.equals("Attack") && value) { |
|
|
|
|
if (currentAction != null && !currentAction.equals(animComposer.getAction("Dodge"))) { |
|
|
|
|
currentAction = (LoopAction) animComposer.setCurrentAction("Dodge"); |
|
|
|
|
currentAction.setNextAnim("stand"); |
|
|
|
|
currentAction.setSpeed(0.1f); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static class LoopAction extends BaseAction { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) { |
|
|
|
|
if (animName.equals("Dodge")){ |
|
|
|
|
channel.setAnim("stand", 0.50f); |
|
|
|
|
channel.setLoopMode(LoopMode.DontLoop); |
|
|
|
|
channel.setSpeed(1f); |
|
|
|
|
final AnimComposer ac; |
|
|
|
|
private boolean loop = false; |
|
|
|
|
private String nextAnim = null; |
|
|
|
|
|
|
|
|
|
public LoopAction(Tween delegate, AnimComposer ac) { |
|
|
|
|
super(delegate); |
|
|
|
|
this.ac = ac; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setLoop(boolean loop) { |
|
|
|
|
this.loop = loop; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { |
|
|
|
|
public void setNextAnim(String nextAction) { |
|
|
|
|
this.nextAnim = nextAction; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onAction(String binding, boolean value, float tpf) { |
|
|
|
|
if (binding.equals("Attack") && value){ |
|
|
|
|
if (!channel.getAnimationName().equals("Dodge")){ |
|
|
|
|
channel.setAnim("Dodge", 0.50f); |
|
|
|
|
channel.setLoopMode(LoopMode.Cycle); |
|
|
|
|
channel.setSpeed(0.10f); |
|
|
|
|
public boolean interpolate(double t) { |
|
|
|
|
boolean running = super.interpolate(t); |
|
|
|
|
if (!loop && !running) { |
|
|
|
|
setSpeed(0); |
|
|
|
|
ac.removeCurrentAction(AnimComposer.DEFAULT_LAYER); |
|
|
|
|
if (nextAnim != null && ac.hasAction(nextAnim)) { |
|
|
|
|
currentAction = (LoopAction) ac.setCurrentAction(nextAnim); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return running; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|