From 609d9759652f880eb6cccbf62f9e4f5a92fc3c06 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Sun, 24 Apr 2011 21:12:19 +0000 Subject: [PATCH] Fixed a hack in Bone class for the ragdoll, so Kirill can sleep again. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7303 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/animation/Bone.java | 26 ++++++++++++------- .../jme3/bullet/control/RagdollControl.java | 15 ++++------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/engine/src/core/com/jme3/animation/Bone.java b/engine/src/core/com/jme3/animation/Bone.java index 62ea58e80..5da1751db 100644 --- a/engine/src/core/com/jme3/animation/Bone.java +++ b/engine/src/core/com/jme3/animation/Bone.java @@ -39,6 +39,7 @@ import com.jme3.export.Savable; import com.jme3.math.Matrix3f; import com.jme3.math.Matrix4f; import com.jme3.math.Quaternion; +import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.util.TempVars; @@ -92,6 +93,9 @@ public final class Bone implements Savable { private Vector3f worldPos = new Vector3f(); private Quaternion worldRot = new Quaternion(); private Vector3f worldScale = new Vector3f(); + + //used for getCombinedTransform + private Transform tmpTransform=new Transform(); /** * Creates a new bone with the given name. @@ -372,17 +376,19 @@ public final class Bone implements Savable { worldPos.set(translation); worldRot.set(rotation); } - protected Vector3f tmpVec = new Vector3f(); - protected Quaternion tmpQuat = new Quaternion(); - - public Quaternion getTmpQuat() { - return tmpQuat; - } - - public Vector3f getTmpVec() { - return tmpVec; + + /** + * Returns teh local transform of this bone combined with the given position and rotation + * @param position a position + * @param rotation a rotation + * @return + */ + public Transform getCombinedTransform(Vector3f position, Quaternion rotation){ + rotation.mult(localPos, tmpTransform.getTranslation()).addLocal(position); + tmpTransform.setRotation(rotation).getRotation().multLocal(localRot); + return tmpTransform; } - + /** * Returns the attachment node. * Attach models and effects to this node to make diff --git a/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java b/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java index aef81be78..1d0a63d88 100644 --- a/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java +++ b/engine/src/jbullet/com/jme3/bullet/control/RagdollControl.java @@ -50,6 +50,7 @@ import com.jme3.bullet.objects.PhysicsRigidBody; import com.jme3.export.JmeExporter; import com.jme3.export.JmeImporter; import com.jme3.math.Quaternion; +import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; import com.jme3.renderer.ViewPort; @@ -83,7 +84,7 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener protected Skeleton skeleton; protected PhysicsSpace space; protected boolean enabled = true; - protected boolean debug = false; + protected boolean debug = false; protected PhysicsRigidBody baseRigidBody; protected float weightThreshold = 1.0f; protected Spatial targetModel; @@ -186,12 +187,8 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener bone.setUserTransformsWorld(pos, rot); for (Bone childBone : bone.getChildren()) { if (!boneList.contains(childBone.getName())) { - Vector3f tmpVec = childBone.getTmpVec(); - Quaternion tmpQuat = childBone.getTmpQuat(); - rot.mult(childBone.getLocalPosition(), tmpVec).addLocal(pos); - tmpQuat.set(rot).multLocal(childBone.getLocalRotation()); - setTransform(childBone, tmpVec, tmpQuat); - + Transform t = childBone.getCombinedTransform(pos, rot); + setTransform(childBone, t.getTranslation(), t.getRotation()); } } } @@ -592,7 +589,7 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener } } - if (hit && event.getAppliedImpulse() > eventDispatchImpulseThreshold) { + if (hit && event.getAppliedImpulse() > eventDispatchImpulseThreshold) { for (RagdollCollisionListener listener : listeners) { listener.collide(hitBone, hitObject, event); } @@ -680,6 +677,4 @@ public class RagdollControl implements PhysicsControl, PhysicsCollisionListener public void setEventDispatchImpulseThreshold(float eventDispatchImpulseThreshold) { this.eventDispatchImpulseThreshold = eventDispatchImpulseThreshold; } - - }