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.SliderConstraint; 35 import com.bulletphysics.linearmath.Transform; 36 import com.jme3.bullet.objects.PhysicsRigidBody; 37 import com.jme3.bullet.util.Converter; 38 import com.jme3.export.InputCapsule; 39 import com.jme3.export.JmeExporter; 40 import com.jme3.export.JmeImporter; 41 import com.jme3.export.OutputCapsule; 42 import com.jme3.math.Matrix3f; 43 import com.jme3.math.Vector3f; 44 import java.io.IOException; 45 46 /** 47 * <i>From bullet manual:</i><br> 48 * The slider constraint allows the body to rotate around one axis and translate along this axis. 49 * @author normenhansen 50 */ 51 public class SliderJoint extends PhysicsJoint { 52 protected Matrix3f rotA, rotB; 53 protected boolean useLinearReferenceFrameA; 54 SliderJoint()55 public SliderJoint() { 56 } 57 58 /** 59 * @param pivotA local translation of the joint connection point in node A 60 * @param pivotB local translation of the joint connection point in node B 61 */ SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA)62 public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) { 63 super(nodeA, nodeB, pivotA, pivotB); 64 this.rotA=rotA; 65 this.rotB=rotB; 66 this.useLinearReferenceFrameA=useLinearReferenceFrameA; 67 createJoint(); 68 } 69 70 /** 71 * @param pivotA local translation of the joint connection point in node A 72 * @param pivotB local translation of the joint connection point in node B 73 */ SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA)74 public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA) { 75 super(nodeA, nodeB, pivotA, pivotB); 76 this.rotA=new Matrix3f(); 77 this.rotB=new Matrix3f(); 78 this.useLinearReferenceFrameA=useLinearReferenceFrameA; 79 createJoint(); 80 } 81 getLowerLinLimit()82 public float getLowerLinLimit() { 83 return ((SliderConstraint) constraint).getLowerLinLimit(); 84 } 85 setLowerLinLimit(float lowerLinLimit)86 public void setLowerLinLimit(float lowerLinLimit) { 87 ((SliderConstraint) constraint).setLowerLinLimit(lowerLinLimit); 88 } 89 getUpperLinLimit()90 public float getUpperLinLimit() { 91 return ((SliderConstraint) constraint).getUpperLinLimit(); 92 } 93 setUpperLinLimit(float upperLinLimit)94 public void setUpperLinLimit(float upperLinLimit) { 95 ((SliderConstraint) constraint).setUpperLinLimit(upperLinLimit); 96 } 97 getLowerAngLimit()98 public float getLowerAngLimit() { 99 return ((SliderConstraint) constraint).getLowerAngLimit(); 100 } 101 setLowerAngLimit(float lowerAngLimit)102 public void setLowerAngLimit(float lowerAngLimit) { 103 ((SliderConstraint) constraint).setLowerAngLimit(lowerAngLimit); 104 } 105 getUpperAngLimit()106 public float getUpperAngLimit() { 107 return ((SliderConstraint) constraint).getUpperAngLimit(); 108 } 109 setUpperAngLimit(float upperAngLimit)110 public void setUpperAngLimit(float upperAngLimit) { 111 ((SliderConstraint) constraint).setUpperAngLimit(upperAngLimit); 112 } 113 getSoftnessDirLin()114 public float getSoftnessDirLin() { 115 return ((SliderConstraint) constraint).getSoftnessDirLin(); 116 } 117 setSoftnessDirLin(float softnessDirLin)118 public void setSoftnessDirLin(float softnessDirLin) { 119 ((SliderConstraint) constraint).setSoftnessDirLin(softnessDirLin); 120 } 121 getRestitutionDirLin()122 public float getRestitutionDirLin() { 123 return ((SliderConstraint) constraint).getRestitutionDirLin(); 124 } 125 setRestitutionDirLin(float restitutionDirLin)126 public void setRestitutionDirLin(float restitutionDirLin) { 127 ((SliderConstraint) constraint).setRestitutionDirLin(restitutionDirLin); 128 } 129 getDampingDirLin()130 public float getDampingDirLin() { 131 return ((SliderConstraint) constraint).getDampingDirLin(); 132 } 133 setDampingDirLin(float dampingDirLin)134 public void setDampingDirLin(float dampingDirLin) { 135 ((SliderConstraint) constraint).setDampingDirLin(dampingDirLin); 136 } 137 getSoftnessDirAng()138 public float getSoftnessDirAng() { 139 return ((SliderConstraint) constraint).getSoftnessDirAng(); 140 } 141 setSoftnessDirAng(float softnessDirAng)142 public void setSoftnessDirAng(float softnessDirAng) { 143 ((SliderConstraint) constraint).setSoftnessDirAng(softnessDirAng); 144 } 145 getRestitutionDirAng()146 public float getRestitutionDirAng() { 147 return ((SliderConstraint) constraint).getRestitutionDirAng(); 148 } 149 setRestitutionDirAng(float restitutionDirAng)150 public void setRestitutionDirAng(float restitutionDirAng) { 151 ((SliderConstraint) constraint).setRestitutionDirAng(restitutionDirAng); 152 } 153 getDampingDirAng()154 public float getDampingDirAng() { 155 return ((SliderConstraint) constraint).getDampingDirAng(); 156 } 157 setDampingDirAng(float dampingDirAng)158 public void setDampingDirAng(float dampingDirAng) { 159 ((SliderConstraint) constraint).setDampingDirAng(dampingDirAng); 160 } 161 getSoftnessLimLin()162 public float getSoftnessLimLin() { 163 return ((SliderConstraint) constraint).getSoftnessLimLin(); 164 } 165 setSoftnessLimLin(float softnessLimLin)166 public void setSoftnessLimLin(float softnessLimLin) { 167 ((SliderConstraint) constraint).setSoftnessLimLin(softnessLimLin); 168 } 169 getRestitutionLimLin()170 public float getRestitutionLimLin() { 171 return ((SliderConstraint) constraint).getRestitutionLimLin(); 172 } 173 setRestitutionLimLin(float restitutionLimLin)174 public void setRestitutionLimLin(float restitutionLimLin) { 175 ((SliderConstraint) constraint).setRestitutionLimLin(restitutionLimLin); 176 } 177 getDampingLimLin()178 public float getDampingLimLin() { 179 return ((SliderConstraint) constraint).getDampingLimLin(); 180 } 181 setDampingLimLin(float dampingLimLin)182 public void setDampingLimLin(float dampingLimLin) { 183 ((SliderConstraint) constraint).setDampingLimLin(dampingLimLin); 184 } 185 getSoftnessLimAng()186 public float getSoftnessLimAng() { 187 return ((SliderConstraint) constraint).getSoftnessLimAng(); 188 } 189 setSoftnessLimAng(float softnessLimAng)190 public void setSoftnessLimAng(float softnessLimAng) { 191 ((SliderConstraint) constraint).setSoftnessLimAng(softnessLimAng); 192 } 193 getRestitutionLimAng()194 public float getRestitutionLimAng() { 195 return ((SliderConstraint) constraint).getRestitutionLimAng(); 196 } 197 setRestitutionLimAng(float restitutionLimAng)198 public void setRestitutionLimAng(float restitutionLimAng) { 199 ((SliderConstraint) constraint).setRestitutionLimAng(restitutionLimAng); 200 } 201 getDampingLimAng()202 public float getDampingLimAng() { 203 return ((SliderConstraint) constraint).getDampingLimAng(); 204 } 205 setDampingLimAng(float dampingLimAng)206 public void setDampingLimAng(float dampingLimAng) { 207 ((SliderConstraint) constraint).setDampingLimAng(dampingLimAng); 208 } 209 getSoftnessOrthoLin()210 public float getSoftnessOrthoLin() { 211 return ((SliderConstraint) constraint).getSoftnessOrthoLin(); 212 } 213 setSoftnessOrthoLin(float softnessOrthoLin)214 public void setSoftnessOrthoLin(float softnessOrthoLin) { 215 ((SliderConstraint) constraint).setSoftnessOrthoLin(softnessOrthoLin); 216 } 217 getRestitutionOrthoLin()218 public float getRestitutionOrthoLin() { 219 return ((SliderConstraint) constraint).getRestitutionOrthoLin(); 220 } 221 setRestitutionOrthoLin(float restitutionOrthoLin)222 public void setRestitutionOrthoLin(float restitutionOrthoLin) { 223 ((SliderConstraint) constraint).setRestitutionOrthoLin(restitutionOrthoLin); 224 } 225 getDampingOrthoLin()226 public float getDampingOrthoLin() { 227 return ((SliderConstraint) constraint).getDampingOrthoLin(); 228 } 229 setDampingOrthoLin(float dampingOrthoLin)230 public void setDampingOrthoLin(float dampingOrthoLin) { 231 ((SliderConstraint) constraint).setDampingOrthoLin(dampingOrthoLin); 232 } 233 getSoftnessOrthoAng()234 public float getSoftnessOrthoAng() { 235 return ((SliderConstraint) constraint).getSoftnessOrthoAng(); 236 } 237 setSoftnessOrthoAng(float softnessOrthoAng)238 public void setSoftnessOrthoAng(float softnessOrthoAng) { 239 ((SliderConstraint) constraint).setSoftnessOrthoAng(softnessOrthoAng); 240 } 241 getRestitutionOrthoAng()242 public float getRestitutionOrthoAng() { 243 return ((SliderConstraint) constraint).getRestitutionOrthoAng(); 244 } 245 setRestitutionOrthoAng(float restitutionOrthoAng)246 public void setRestitutionOrthoAng(float restitutionOrthoAng) { 247 ((SliderConstraint) constraint).setRestitutionOrthoAng(restitutionOrthoAng); 248 } 249 getDampingOrthoAng()250 public float getDampingOrthoAng() { 251 return ((SliderConstraint) constraint).getDampingOrthoAng(); 252 } 253 setDampingOrthoAng(float dampingOrthoAng)254 public void setDampingOrthoAng(float dampingOrthoAng) { 255 ((SliderConstraint) constraint).setDampingOrthoAng(dampingOrthoAng); 256 } 257 isPoweredLinMotor()258 public boolean isPoweredLinMotor() { 259 return ((SliderConstraint) constraint).getPoweredLinMotor(); 260 } 261 setPoweredLinMotor(boolean poweredLinMotor)262 public void setPoweredLinMotor(boolean poweredLinMotor) { 263 ((SliderConstraint) constraint).setPoweredLinMotor(poweredLinMotor); 264 } 265 getTargetLinMotorVelocity()266 public float getTargetLinMotorVelocity() { 267 return ((SliderConstraint) constraint).getTargetLinMotorVelocity(); 268 } 269 setTargetLinMotorVelocity(float targetLinMotorVelocity)270 public void setTargetLinMotorVelocity(float targetLinMotorVelocity) { 271 ((SliderConstraint) constraint).setTargetLinMotorVelocity(targetLinMotorVelocity); 272 } 273 getMaxLinMotorForce()274 public float getMaxLinMotorForce() { 275 return ((SliderConstraint) constraint).getMaxLinMotorForce(); 276 } 277 setMaxLinMotorForce(float maxLinMotorForce)278 public void setMaxLinMotorForce(float maxLinMotorForce) { 279 ((SliderConstraint) constraint).setMaxLinMotorForce(maxLinMotorForce); 280 } 281 isPoweredAngMotor()282 public boolean isPoweredAngMotor() { 283 return ((SliderConstraint) constraint).getPoweredAngMotor(); 284 } 285 setPoweredAngMotor(boolean poweredAngMotor)286 public void setPoweredAngMotor(boolean poweredAngMotor) { 287 ((SliderConstraint) constraint).setPoweredAngMotor(poweredAngMotor); 288 } 289 getTargetAngMotorVelocity()290 public float getTargetAngMotorVelocity() { 291 return ((SliderConstraint) constraint).getTargetAngMotorVelocity(); 292 } 293 setTargetAngMotorVelocity(float targetAngMotorVelocity)294 public void setTargetAngMotorVelocity(float targetAngMotorVelocity) { 295 ((SliderConstraint) constraint).setTargetAngMotorVelocity(targetAngMotorVelocity); 296 } 297 getMaxAngMotorForce()298 public float getMaxAngMotorForce() { 299 return ((SliderConstraint) constraint).getMaxAngMotorForce(); 300 } 301 setMaxAngMotorForce(float maxAngMotorForce)302 public void setMaxAngMotorForce(float maxAngMotorForce) { 303 ((SliderConstraint) constraint).setMaxAngMotorForce(maxAngMotorForce); 304 } 305 306 @Override write(JmeExporter ex)307 public void write(JmeExporter ex) throws IOException { 308 super.write(ex); 309 OutputCapsule capsule = ex.getCapsule(this); 310 //TODO: standard values.. 311 capsule.write(((SliderConstraint) constraint).getDampingDirAng(), "dampingDirAng", 0f); 312 capsule.write(((SliderConstraint) constraint).getDampingDirLin(), "dampingDirLin", 0f); 313 capsule.write(((SliderConstraint) constraint).getDampingLimAng(), "dampingLimAng", 0f); 314 capsule.write(((SliderConstraint) constraint).getDampingLimLin(), "dampingLimLin", 0f); 315 capsule.write(((SliderConstraint) constraint).getDampingOrthoAng(), "dampingOrthoAng", 0f); 316 capsule.write(((SliderConstraint) constraint).getDampingOrthoLin(), "dampingOrthoLin", 0f); 317 capsule.write(((SliderConstraint) constraint).getLowerAngLimit(), "lowerAngLimit", 0f); 318 capsule.write(((SliderConstraint) constraint).getLowerLinLimit(), "lowerLinLimit", 0f); 319 capsule.write(((SliderConstraint) constraint).getMaxAngMotorForce(), "maxAngMotorForce", 0f); 320 capsule.write(((SliderConstraint) constraint).getMaxLinMotorForce(), "maxLinMotorForce", 0f); 321 capsule.write(((SliderConstraint) constraint).getPoweredAngMotor(), "poweredAngMotor", false); 322 capsule.write(((SliderConstraint) constraint).getPoweredLinMotor(), "poweredLinMotor", false); 323 capsule.write(((SliderConstraint) constraint).getRestitutionDirAng(), "restitutionDirAng", 0f); 324 capsule.write(((SliderConstraint) constraint).getRestitutionDirLin(), "restitutionDirLin", 0f); 325 capsule.write(((SliderConstraint) constraint).getRestitutionLimAng(), "restitutionLimAng", 0f); 326 capsule.write(((SliderConstraint) constraint).getRestitutionLimLin(), "restitutionLimLin", 0f); 327 capsule.write(((SliderConstraint) constraint).getRestitutionOrthoAng(), "restitutionOrthoAng", 0f); 328 capsule.write(((SliderConstraint) constraint).getRestitutionOrthoLin(), "restitutionOrthoLin", 0f); 329 330 capsule.write(((SliderConstraint) constraint).getSoftnessDirAng(), "softnessDirAng", 0f); 331 capsule.write(((SliderConstraint) constraint).getSoftnessDirLin(), "softnessDirLin", 0f); 332 capsule.write(((SliderConstraint) constraint).getSoftnessLimAng(), "softnessLimAng", 0f); 333 capsule.write(((SliderConstraint) constraint).getSoftnessLimLin(), "softnessLimLin", 0f); 334 capsule.write(((SliderConstraint) constraint).getSoftnessOrthoAng(), "softnessOrthoAng", 0f); 335 capsule.write(((SliderConstraint) constraint).getSoftnessOrthoLin(), "softnessOrthoLin", 0f); 336 337 capsule.write(((SliderConstraint) constraint).getTargetAngMotorVelocity(), "targetAngMotorVelicoty", 0f); 338 capsule.write(((SliderConstraint) constraint).getTargetLinMotorVelocity(), "targetLinMotorVelicoty", 0f); 339 340 capsule.write(((SliderConstraint) constraint).getUpperAngLimit(), "upperAngLimit", 0f); 341 capsule.write(((SliderConstraint) constraint).getUpperLinLimit(), "upperLinLimit", 0f); 342 343 capsule.write(useLinearReferenceFrameA, "useLinearReferenceFrameA", false); 344 } 345 346 @Override read(JmeImporter im)347 public void read(JmeImporter im) throws IOException { 348 super.read(im); 349 InputCapsule capsule = im.getCapsule(this); 350 float dampingDirAng = capsule.readFloat("dampingDirAng", 0f); 351 float dampingDirLin = capsule.readFloat("dampingDirLin", 0f); 352 float dampingLimAng = capsule.readFloat("dampingLimAng", 0f); 353 float dampingLimLin = capsule.readFloat("dampingLimLin", 0f); 354 float dampingOrthoAng = capsule.readFloat("dampingOrthoAng", 0f); 355 float dampingOrthoLin = capsule.readFloat("dampingOrthoLin", 0f); 356 float lowerAngLimit = capsule.readFloat("lowerAngLimit", 0f); 357 float lowerLinLimit = capsule.readFloat("lowerLinLimit", 0f); 358 float maxAngMotorForce = capsule.readFloat("maxAngMotorForce", 0f); 359 float maxLinMotorForce = capsule.readFloat("maxLinMotorForce", 0f); 360 boolean poweredAngMotor = capsule.readBoolean("poweredAngMotor", false); 361 boolean poweredLinMotor = capsule.readBoolean("poweredLinMotor", false); 362 float restitutionDirAng = capsule.readFloat("restitutionDirAng", 0f); 363 float restitutionDirLin = capsule.readFloat("restitutionDirLin", 0f); 364 float restitutionLimAng = capsule.readFloat("restitutionLimAng", 0f); 365 float restitutionLimLin = capsule.readFloat("restitutionLimLin", 0f); 366 float restitutionOrthoAng = capsule.readFloat("restitutionOrthoAng", 0f); 367 float restitutionOrthoLin = capsule.readFloat("restitutionOrthoLin", 0f); 368 369 float softnessDirAng = capsule.readFloat("softnessDirAng", 0f); 370 float softnessDirLin = capsule.readFloat("softnessDirLin", 0f); 371 float softnessLimAng = capsule.readFloat("softnessLimAng", 0f); 372 float softnessLimLin = capsule.readFloat("softnessLimLin", 0f); 373 float softnessOrthoAng = capsule.readFloat("softnessOrthoAng", 0f); 374 float softnessOrthoLin = capsule.readFloat("softnessOrthoLin", 0f); 375 376 float targetAngMotorVelicoty = capsule.readFloat("targetAngMotorVelicoty", 0f); 377 float targetLinMotorVelicoty = capsule.readFloat("targetLinMotorVelicoty", 0f); 378 379 float upperAngLimit = capsule.readFloat("upperAngLimit", 0f); 380 float upperLinLimit = capsule.readFloat("upperLinLimit", 0f); 381 382 useLinearReferenceFrameA = capsule.readBoolean("useLinearReferenceFrameA", false); 383 384 createJoint(); 385 386 ((SliderConstraint)constraint).setDampingDirAng(dampingDirAng); 387 ((SliderConstraint)constraint).setDampingDirLin(dampingDirLin); 388 ((SliderConstraint)constraint).setDampingLimAng(dampingLimAng); 389 ((SliderConstraint)constraint).setDampingLimLin(dampingLimLin); 390 ((SliderConstraint)constraint).setDampingOrthoAng(dampingOrthoAng); 391 ((SliderConstraint)constraint).setDampingOrthoLin(dampingOrthoLin); 392 ((SliderConstraint)constraint).setLowerAngLimit(lowerAngLimit); 393 ((SliderConstraint)constraint).setLowerLinLimit(lowerLinLimit); 394 ((SliderConstraint)constraint).setMaxAngMotorForce(maxAngMotorForce); 395 ((SliderConstraint)constraint).setMaxLinMotorForce(maxLinMotorForce); 396 ((SliderConstraint)constraint).setPoweredAngMotor(poweredAngMotor); 397 ((SliderConstraint)constraint).setPoweredLinMotor(poweredLinMotor); 398 ((SliderConstraint)constraint).setRestitutionDirAng(restitutionDirAng); 399 ((SliderConstraint)constraint).setRestitutionDirLin(restitutionDirLin); 400 ((SliderConstraint)constraint).setRestitutionLimAng(restitutionLimAng); 401 ((SliderConstraint)constraint).setRestitutionLimLin(restitutionLimLin); 402 ((SliderConstraint)constraint).setRestitutionOrthoAng(restitutionOrthoAng); 403 ((SliderConstraint)constraint).setRestitutionOrthoLin(restitutionOrthoLin); 404 405 ((SliderConstraint)constraint).setSoftnessDirAng(softnessDirAng); 406 ((SliderConstraint)constraint).setSoftnessDirLin(softnessDirLin); 407 ((SliderConstraint)constraint).setSoftnessLimAng(softnessLimAng); 408 ((SliderConstraint)constraint).setSoftnessLimLin(softnessLimLin); 409 ((SliderConstraint)constraint).setSoftnessOrthoAng(softnessOrthoAng); 410 ((SliderConstraint)constraint).setSoftnessOrthoLin(softnessOrthoLin); 411 412 ((SliderConstraint)constraint).setTargetAngMotorVelocity(targetAngMotorVelicoty); 413 ((SliderConstraint)constraint).setTargetLinMotorVelocity(targetLinMotorVelicoty); 414 415 ((SliderConstraint)constraint).setUpperAngLimit(upperAngLimit); 416 ((SliderConstraint)constraint).setUpperLinLimit(upperLinLimit); 417 } 418 createJoint()419 protected void createJoint(){ 420 Transform transA = new Transform(Converter.convert(rotA)); 421 Converter.convert(pivotA, transA.origin); 422 Converter.convert(rotA, transA.basis); 423 424 Transform transB = new Transform(Converter.convert(rotB)); 425 Converter.convert(pivotB, transB.origin); 426 Converter.convert(rotB, transB.basis); 427 428 constraint = new SliderConstraint(nodeA.getObjectId(), nodeB.getObjectId(), transA, transB, useLinearReferenceFrameA); 429 } 430 } 431