159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2010 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage jme3test.bullet; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.*; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.app.SimpleApplication; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.TextureKey; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.BulletAppState; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.PhysicsSpace; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.PhysicsCollisionEvent; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.PhysicsCollisionObject; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.RagdollCollisionListener; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.shapes.SphereCollisionShape; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.control.KinematicRagdollControl; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.control.RigidBodyControl; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.font.BitmapText; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.KeyInput; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.MouseInput; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.ActionListener; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.KeyTrigger; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.controls.MouseButtonTrigger; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.light.DirectionalLight; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.FastMath; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Quaternion; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Geometry; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Node; 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.debug.SkeletonDebugger; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.shape.Sphere; 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.shape.Sphere.TextureMode; 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture; 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PHYSICS RAGDOLLS ARE NOT WORKING PROPERLY YET! 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author normenhansen 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TestBoneRagdoll extends SimpleApplication implements RagdollCollisionListener, AnimEventListener { 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private BulletAppState bulletAppState; 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material matBullet; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Node model; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KinematicRagdollControl ragdoll; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float bulletSize = 1f; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material mat; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material mat3; 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Sphere bullet; 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private SphereCollisionShape bulletCollisionShape; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static void main(String[] args) { 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TestBoneRagdoll app = new TestBoneRagdoll(); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta app.start(); 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void simpleInitApp() { 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initCrossHairs(); 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initMaterial(); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cam.setLocation(new Vector3f(0.26924422f, 6.646658f, 22.265987f)); 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cam.setRotation(new Quaternion(-2.302544E-4f, 0.99302495f, -0.117888905f, -0.0019395084f)); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletAppState = new BulletAppState(); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletAppState.setEnabled(true); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta stateManager.attach(bulletAppState); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bullet = new Sphere(32, 32, 1.0f, true, false); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bullet.setTextureMode(TextureMode.Projected); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletCollisionShape = new SphereCollisionShape(1.0f); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// bulletAppState.getPhysicsSpace().enableDebug(assetManager); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setupLight(); 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model = (Node) assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml"); 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // model.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X)); 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //debug view 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AnimControl control = model.getControl(AnimControl.class); 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton()); 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mat2.getAdditionalRenderState().setWireframe(true); 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mat2.setColor("Color", ColorRGBA.Green); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mat2.getAdditionalRenderState().setDepthTest(false); 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta skeletonDebug.setMaterial(mat2); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta skeletonDebug.setLocalTranslation(model.getLocalTranslation()); 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Note: PhysicsRagdollControl is still TODO, constructor will change 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll = new KinematicRagdollControl(0.5f); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setupSinbad(ragdoll); 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addCollisionListener(this); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.addControl(ragdoll); 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float eighth_pi = FastMath.PI * 0.125f; 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.setJointLimit("Waist", eighth_pi, eighth_pi, eighth_pi, eighth_pi, eighth_pi, eighth_pi); 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.setJointLimit("Chest", eighth_pi, eighth_pi, 0, 0, eighth_pi, eighth_pi); 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //Oto's head is almost rigid 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // ragdoll.setJointLimit("head", 0, 0, eighth_pi, -eighth_pi, 0, 0); 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getPhysicsSpace().add(ragdoll); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta speed = 1.3f; 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(model); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // rootNode.attachChild(skeletonDebug); 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta flyCam.setMoveSpeed(50); 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta animChannel = control.createChannel(); 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta animChannel.setAnim("Dance"); 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta control.addListener(this); 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addListener(new ActionListener() { 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onAction(String name, boolean isPressed, float tpf) { 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("toggle") && isPressed) { 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Vector3f v = new Vector3f(); 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta v.set(model.getLocalTranslation()); 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta v.y = 0; 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.setLocalTranslation(v); 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Quaternion q = new Quaternion(); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float[] angles = new float[3]; 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.getLocalRotation().toAngles(angles); 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta q.fromAngleAxis(angles[1], Vector3f.UNIT_Y); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta model.setLocalRotation(q); 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (angles[0] < 0) { 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta animChannel.setAnim("StandUpBack"); 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.blendToKinematicMode(0.5f); 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta animChannel.setAnim("StandUpFront"); 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.blendToKinematicMode(0.5f); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("bullet+") && isPressed) { 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletSize += 0.1f; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("bullet-") && isPressed) { 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletSize -= 0.1f; 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("stop") && isPressed) { 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.setEnabled(!ragdoll.isEnabled()); 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.setRagdollMode(); 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("shoot") && !isPressed) { 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Geometry bulletg = new Geometry("bullet", bullet); 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setMaterial(matBullet); 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setLocalTranslation(cam.getLocation()); 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setLocalScale(bulletSize); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletCollisionShape = new SphereCollisionShape(bulletSize); 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, bulletSize * 10); 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setCcdMotionThreshold(0.001f); 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setLinearVelocity(cam.getDirection().mult(80)); 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.addControl(bulletNode); 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(bulletg); 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getPhysicsSpace().add(bulletNode); 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (name.equals("boom") && !isPressed) { 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Geometry bulletg = new Geometry("bullet", bullet); 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setMaterial(matBullet); 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setLocalTranslation(cam.getLocation()); 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.setLocalScale(bulletSize); 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletCollisionShape = new SphereCollisionShape(bulletSize); 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta BombControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1); 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setForceFactor(8); 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setExplosionRadius(20); 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setCcdMotionThreshold(0.001f); 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletNode.setLinearVelocity(cam.getDirection().mult(180)); 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta bulletg.addControl(bulletNode); 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.attachChild(bulletg); 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getPhysicsSpace().add(bulletNode); 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }, "toggle", "shoot", "stop", "bullet+", "bullet-", "boom"); 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("toggle", new KeyTrigger(KeyInput.KEY_SPACE)); 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("boom", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("stop", new KeyTrigger(KeyInput.KEY_H)); 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("bullet-", new KeyTrigger(KeyInput.KEY_COMMA)); 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputManager.addMapping("bullet+", new KeyTrigger(KeyInput.KEY_PERIOD)); 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setupLight() { 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // AmbientLight al = new AmbientLight(); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // al.setColor(ColorRGBA.White.mult(1)); 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // rootNode.addLight(al); 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DirectionalLight dl = new DirectionalLight(); 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta rootNode.addLight(dl); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private PhysicsSpace getPhysicsSpace() { 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return bulletAppState.getPhysicsSpace(); 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initMaterial() { 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matBullet = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta key2.setGenerateMips(true); 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Texture tex2 = assetManager.loadTexture(key2); 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta matBullet.setTexture("ColorMap", tex2); 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected void initCrossHairs() { 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta BitmapText ch = new BitmapText(guiFont, false); 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ch.setSize(guiFont.getCharSet().getRenderedSize() * 2); 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ch.setText("+"); // crosshairs 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ch.setLocalTranslation( // center 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2, 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta guiNode.attachChild(ch); 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void collide(Bone bone, PhysicsCollisionObject object, PhysicsCollisionEvent event) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (object.getUserObject() != null && object.getUserObject() instanceof Geometry) { 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Geometry geom = (Geometry) object.getUserObject(); 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ("Floor".equals(geom.getName())) { 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.setRagdollMode(); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setupSinbad(KinematicRagdollControl ragdoll) { 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Ulna.L"); 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Ulna.R"); 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Chest"); 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Foot.L"); 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Foot.R"); 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Hand.R"); 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Hand.L"); 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Neck"); 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Root"); 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Stomach"); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Waist"); 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Humerus.L"); 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Humerus.R"); 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Thigh.L"); 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Thigh.R"); 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Calf.L"); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Calf.R"); 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Clavicle.L"); 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ragdoll.addBoneName("Clavicle.R"); 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float elTime = 0; 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean forward = true; 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AnimControl animControl; 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AnimChannel animChannel; 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Vector3f direction = new Vector3f(0, 0, 1); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Quaternion rotate = new Quaternion().fromAngleAxis(FastMath.PI / 8, Vector3f.UNIT_Y); 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean dance = true; 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void simpleUpdate(float tpf) { 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // System.out.println(((BoundingBox) model.getWorldBound()).getYExtent()); 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// elTime += tpf; 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (elTime > 3) { 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// elTime = 0; 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (dance) { 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// rotate.multLocal(direction); 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (Math.random() > 0.80) { 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// dance = true; 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// animChannel.setAnim("Dance"); 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } else { 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// dance = false; 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// animChannel.setAnim("RunBase"); 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// rotate.fromAngleAxis(FastMath.QUARTER_PI * ((float) Math.random() - 0.5f), Vector3f.UNIT_Y); 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// rotate.multLocal(direction); 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (!ragdoll.hasControl() && !dance) { 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (model.getLocalTranslation().getZ() < -10) { 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.z = 1; 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.normalizeLocal(); 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } else if (model.getLocalTranslation().getZ() > 10) { 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.z = -1; 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.normalizeLocal(); 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if (model.getLocalTranslation().getX() < -10) { 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.x = 1; 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.normalizeLocal(); 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } else if (model.getLocalTranslation().getX() > 10) { 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.x = -1; 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.normalizeLocal(); 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// model.move(direction.multLocal(tpf * 8)); 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// direction.normalizeLocal(); 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// model.lookAt(model.getLocalTranslation().add(direction), Vector3f.UNIT_Y); 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) { 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if(channel.getAnimationName().equals("StandUpFront")){ 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// channel.setAnim("Dance"); 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (channel.getAnimationName().equals("StandUpBack") || channel.getAnimationName().equals("StandUpFront")) { 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta channel.setLoopMode(LoopMode.DontLoop); 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta channel.setAnim("IdleTop", 5); 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta channel.setLoopMode(LoopMode.Loop); 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// if(channel.getAnimationName().equals("IdleTop")){ 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// channel.setAnim("StandUpFront"); 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// } 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 358