Browse Source

Migrate TestOgreComplexAnim to new anim system

Lots of code that did nothing in old test (on feet, hand). Only eft hand anim with the bone anim in simpleUpdate works. So I rework the test to do how actionSquence work and manipulate Armature and Joint with ArmatureMask apply.
So I think there is a bug in ArmatureDebugger when apply PointSize in material. In the render view all points on armature debug have same size.
Jérôme 5 năm trước cách đây
mục cha
commit
0e0c75c85c

+ 92 - 95
jme3-examples/src/main/java/jme3test/model/anim/TestOgreComplexAnim.java

@@ -32,107 +32,104 @@
 
 package jme3test.model.anim;
 
-import com.jme3.animation.*;
+import com.jme3.anim.AnimComposer;
+import com.jme3.anim.ArmatureMask;
+import com.jme3.anim.Joint;
+import com.jme3.anim.SkinningControl;
+import com.jme3.anim.tween.action.Action;
 import com.jme3.app.SimpleApplication;
 import com.jme3.light.DirectionalLight;
 import com.jme3.material.Material;
-import com.jme3.math.*;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.FastMath;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector3f;
 import com.jme3.scene.Node;
-import com.jme3.scene.debug.SkeletonDebugger;
+import com.jme3.scene.debug.custom.ArmatureDebugger;
 
-//TODO rework this Test when the new animation system is done.
 public class TestOgreComplexAnim extends SimpleApplication {
 
-    private AnimControl control;
-    private float angle = 0;
-    private float scale = 1;
-    private float rate = 1;
-
-    public static void main(String[] args) {
-        TestOgreComplexAnim app = new TestOgreComplexAnim();
-        app.start();
-    }
-
-    @Override
-    public void simpleInitApp() {
-        flyCam.setMoveSpeed(10f);
-        cam.setLocation(new Vector3f(6.4013605f, 7.488437f, 12.843031f));
-        cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f));
-
-        DirectionalLight dl = new DirectionalLight();
-        dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal());
-        dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f));
-        rootNode.addLight(dl);
-
-        Node model = (Node) assetManager.loadModel("Models/Oto/OtoOldAnim.j3o");
-
-        control = model.getControl(AnimControl.class);
-
-        AnimChannel feet = control.createChannel();
-        AnimChannel leftHand = control.createChannel();
-        AnimChannel rightHand = control.createChannel();
-
-        // feet will dodge
-        feet.addFromRootBone("hip.right");
-        feet.addFromRootBone("hip.left");
-        feet.setAnim("Dodge");
-        feet.setSpeed(2);
-        feet.setLoopMode(LoopMode.Cycle);
-
-        // will blend over 15 seconds to stand
-        feet.setAnim("Walk", 15);
-        feet.setSpeed(0.25f);
-        feet.setLoopMode(LoopMode.Cycle);
-
-        // left hand will pull
-        leftHand.addFromRootBone("uparm.right");
-        leftHand.setAnim("pull");
-        leftHand.setSpeed(.5f);
-
-        // will blend over 15 seconds to stand
-        leftHand.setAnim("stand", 15);
-
-        // right hand will push
-        rightHand.addBone("spinehigh");
-        rightHand.addFromRootBone("uparm.left");
-        rightHand.setAnim("push");
-
-        SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton());
-        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
-        mat.getAdditionalRenderState().setWireframe(true);
-        mat.setColor("Color", ColorRGBA.Green);
-        mat.setFloat("PointSize", 7f);
-        mat.getAdditionalRenderState().setDepthTest(false);
-        skeletonDebug.setMaterial(mat);
-
-        model.attachChild(skeletonDebug);
-        rootNode.attachChild(model);
-    }
-
-    @Override
-    public void simpleUpdate(float tpf){
-        Bone b = control.getSkeleton().getBone("spinehigh");
-        Bone b2 = control.getSkeleton().getBone("uparm.left");
-
-        angle += tpf * rate;
-        if (angle > FastMath.HALF_PI / 2f){
-            angle = FastMath.HALF_PI / 2f;
-            rate = -1;
-        }else if (angle < -FastMath.HALF_PI / 2f){
-            angle = -FastMath.HALF_PI / 2f;
-            rate = 1;
-        }
-
-        Quaternion q = new Quaternion();
-        q.fromAngles(0, angle, 0);
-
-        b.setUserControl(true);
-        b.setUserTransforms(Vector3f.ZERO, q, Vector3f.UNIT_XYZ);
-
-        b2.setUserControl(true);
-        b2.setUserTransforms(Vector3f.ZERO, Quaternion.IDENTITY, new Vector3f(1+angle,1+ angle, 1+angle));
-
-
-    }
+	private SkinningControl skinningControl;
+
+	private float angle = 0;
+	private float rate = 1;
+
+	public static void main(String[] args) {
+		TestOgreComplexAnim app = new TestOgreComplexAnim();
+		app.start();
+	}
+
+	@Override
+	public void simpleInitApp() {
+		flyCam.setMoveSpeed(10f);
+		cam.setLocation(new Vector3f(6.4013605f, 7.488437f, 12.843031f));
+		cam.setRotation(new Quaternion(-0.060740203f, 0.93925786f, -0.2398315f, -0.2378785f));
+
+		DirectionalLight dl = new DirectionalLight();
+		dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal());
+		dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f));
+		rootNode.addLight(dl);
+
+		Node model = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml");
+
+		skinningControl = model.getControl(SkinningControl.class);
+		AnimComposer ac = model.getControl(AnimComposer.class);
+
+		ArmatureMask feet = ArmatureMask.createMask(skinningControl.getArmature(), "hip.right", "hip.left");
+		Action dodgeAction = ac.action("Dodge");
+		dodgeAction.setMask(feet);
+		dodgeAction.setSpeed(2f);
+		Action walkAction = ac.action("Walk");
+		walkAction.setMask(feet);
+		walkAction.setSpeed(0.25f);
+
+		ArmatureMask rightHand = ArmatureMask.createMask(skinningControl.getArmature(), "uparm.right");
+		Action pullAction = ac.action("pull");
+		pullAction.setMask(rightHand);
+		pullAction.setSpeed(0.5f);
+		Action standAction = ac.action("stand");
+		standAction.setMask(rightHand);
+		standAction.setSpeed(0.5f);
+
+		ac.actionSequence("complexAction",
+		        ac.actionSequence("feetAction", dodgeAction, walkAction),
+		        ac.actionSequence("rightHandAction", pullAction, standAction));
+
+		ac.setCurrentAction("complexAction");
+
+		Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
+		mat.getAdditionalRenderState().setWireframe(true);
+		mat.setColor("Color", ColorRGBA.Green);
+		mat.setFloat("PointSize", 7f); // Bug ? do not change size of debug points ?
+		mat.getAdditionalRenderState().setDepthTest(false);
+
+		ArmatureDebugger armatureDebug = new ArmatureDebugger("armature", skinningControl.getArmature(),
+		        skinningControl.getArmature().getJointList());
+		armatureDebug.setMaterial(mat);
+		model.attachChild(armatureDebug);
+
+		rootNode.attachChild(model);
+	}
+
+	@Override
+	public void simpleUpdate(float tpf) {
+		Joint j = skinningControl.getArmature().getJoint("spinehigh");
+		Joint j2 = skinningControl.getArmature().getJoint("uparm.left");
+
+		angle += tpf * rate;
+		if (angle > FastMath.HALF_PI / 2f) {
+			angle = FastMath.HALF_PI / 2f;
+			rate = -1;
+		} else if (angle < -FastMath.HALF_PI / 2f) {
+			angle = -FastMath.HALF_PI / 2f;
+			rate = 1;
+		}
+
+		Quaternion q = new Quaternion();
+		q.fromAngles(0, angle, 0);
+
+		j.setLocalRotation(j.getInitialTransform().getRotation().mult(q));
+		j2.setLocalScale(j.getInitialTransform().getScale().mult(new Vector3f(1 + angle, 1 + angle, 1 + angle)));
+	}
 
 }