1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 package com.jme3.bullet.joints; 33 34 import com.bulletphysics.dynamics.constraintsolver.TypedConstraint; 35 import com.jme3.bullet.objects.PhysicsRigidBody; 36 import com.jme3.export.*; 37 import com.jme3.math.Vector3f; 38 import java.io.IOException; 39 40 /** 41 * <p>PhysicsJoint - Basic Phyiscs Joint</p> 42 * @author normenhansen 43 */ 44 public abstract class PhysicsJoint implements Savable { 45 46 protected TypedConstraint constraint; 47 protected PhysicsRigidBody nodeA; 48 protected PhysicsRigidBody nodeB; 49 protected Vector3f pivotA; 50 protected Vector3f pivotB; 51 protected boolean collisionBetweenLinkedBodys = true; 52 PhysicsJoint()53 public PhysicsJoint() { 54 } 55 56 /** 57 * @param pivotA local translation of the joint connection point in node A 58 * @param pivotB local translation of the joint connection point in node B 59 */ PhysicsJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB)60 public PhysicsJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) { 61 this.nodeA = nodeA; 62 this.nodeB = nodeB; 63 this.pivotA = pivotA; 64 this.pivotB = pivotB; 65 nodeA.addJoint(this); 66 nodeB.addJoint(this); 67 } 68 getAppliedImpulse()69 public float getAppliedImpulse(){ 70 return constraint.getAppliedImpulse(); 71 } 72 73 /** 74 * @return the constraint 75 */ getObjectId()76 public TypedConstraint getObjectId() { 77 return constraint; 78 } 79 80 /** 81 * @return the collisionBetweenLinkedBodys 82 */ isCollisionBetweenLinkedBodys()83 public boolean isCollisionBetweenLinkedBodys() { 84 return collisionBetweenLinkedBodys; 85 } 86 87 /** 88 * toggles collisions between linked bodys<br> 89 * joint has to be removed from and added to PhyiscsSpace to apply this. 90 * @param collisionBetweenLinkedBodys set to false to have no collisions between linked bodys 91 */ setCollisionBetweenLinkedBodys(boolean collisionBetweenLinkedBodys)92 public void setCollisionBetweenLinkedBodys(boolean collisionBetweenLinkedBodys) { 93 this.collisionBetweenLinkedBodys = collisionBetweenLinkedBodys; 94 } 95 getBodyA()96 public PhysicsRigidBody getBodyA() { 97 return nodeA; 98 } 99 getBodyB()100 public PhysicsRigidBody getBodyB() { 101 return nodeB; 102 } 103 getPivotA()104 public Vector3f getPivotA() { 105 return pivotA; 106 } 107 getPivotB()108 public Vector3f getPivotB() { 109 return pivotB; 110 } 111 112 /** 113 * destroys this joint and removes it from its connected PhysicsRigidBodys joint lists 114 */ destroy()115 public void destroy() { 116 getBodyA().removeJoint(this); 117 getBodyB().removeJoint(this); 118 } 119 write(JmeExporter ex)120 public void write(JmeExporter ex) throws IOException { 121 OutputCapsule capsule = ex.getCapsule(this); 122 capsule.write(nodeA, "nodeA", null); 123 capsule.write(nodeB, "nodeB", null); 124 capsule.write(pivotA, "pivotA", null); 125 capsule.write(pivotB, "pivotB", null); 126 } 127 read(JmeImporter im)128 public void read(JmeImporter im) throws IOException { 129 InputCapsule capsule = im.getCapsule(this); 130 this.nodeA = ((PhysicsRigidBody) capsule.readSavable("nodeA", new PhysicsRigidBody())); 131 this.nodeB = (PhysicsRigidBody) capsule.readSavable("nodeB", new PhysicsRigidBody()); 132 this.pivotA = (Vector3f) capsule.readSavable("pivotA", new Vector3f()); 133 this.pivotB = (Vector3f) capsule.readSavable("pivotB", new Vector3f()); 134 } 135 136 } 137