diff --git a/engine/src/core/com/jme3/animation/Bone.java b/engine/src/core/com/jme3/animation/Bone.java index 69f2ef7ae..fc8b4c536 100644 --- a/engine/src/core/com/jme3/animation/Bone.java +++ b/engine/src/core/com/jme3/animation/Bone.java @@ -114,8 +114,18 @@ public final class Bone implements Savable { } /** - * Copy constructor. local bind and world inverse bind transforms shallow copied. - * @param source + * Special-purpose copy constructor. + *

+ * Only copies the name and bind pose from the original. + *

+ * WARNING: Local bind pose and world inverse bind pose transforms shallow + * copied. Modifying that data on the original bone will cause it to + * be recomputed on any cloned bones. + *

+ * The rest of the data is NOT copied, as it will be + * generated automatically when the bone is animated. + * + * @param source The bone from which to copy the data. */ Bone(Bone source) { this.name = source.name; @@ -134,9 +144,7 @@ public final class Bone implements Savable { } /** - * Used for binary loading as a Savable; the object must be constructed, - * then the parameters usually present in the constructor for this class are - * restored from the file the object was saved to. + * Serialization only. Do not use. */ public Bone() { } @@ -223,6 +231,9 @@ public final class Bone implements Savable { /** * Returns the inverse world bind pose position. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. * * @return the inverse world bind pose position. */ @@ -232,6 +243,9 @@ public final class Bone implements Savable { /** * Returns the inverse world bind pose rotation. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. * * @return the inverse world bind pose rotation. */ @@ -241,12 +255,51 @@ public final class Bone implements Savable { /** * Returns the inverse world bind pose scale. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. * * @return the inverse world bind pose scale. */ public Vector3f getWorldBindInverseScale() { return worldBindInverseScale; } + + /** + * Returns the world bind pose position. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. + * + * @return the world bind pose position. + */ + public Vector3f getWorldBindPosition() { + return initialPos; + } + + /** + * Returns the world bind pose rotation. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. + * + * @return the world bind pose rotation. + */ + public Quaternion getWorldBindRotation() { + return initialRot; + } + + /** + * Returns the world bind pose scale. + *

+ * The bind pose transform of the bone is its "default" + * transform with no animation applied. + * + * @return the world bind pose scale. + */ + public Vector3f getWorldBindScale() { + return initialScale; + } /** * If enabled, user can control bone transform with setUserTransforms. @@ -259,7 +312,8 @@ public final class Bone implements Savable { /** * Add a new child to this bone. Shouldn't be used by user code. * Can corrupt skeleton. - * @param bone + * + * @param bone The bone to add */ public void addChild(Bone bone) { children.add(bone); @@ -267,7 +321,11 @@ public final class Bone implements Savable { } /** - * Updates the world transforms for this bone, and, possibly the attach node if not null. + * Updates the world transforms for this bone, and, possibly the attach node + * if not null. + *

+ * The world transform of this bone is computed by combining the parent's + * world transform with this bones' local transform. */ public final void updateWorldVectors() { if (parent != null) { @@ -376,8 +434,7 @@ public final class Bone implements Savable { } /** - * Set user transform. - * Combine the given transforms to bone's current transforms + * Sets user transform. */ public void setUserTransforms(Vector3f translation, Quaternion rotation, Vector3f scale) { if (!userControl) { @@ -397,12 +454,13 @@ public final class Bone implements Savable { * Must update all bones in skeleton for this to work. * @param translation * @param rotation - *///TODO: add scale here ??? + */ public void setUserTransformsWorld(Vector3f translation, Quaternion rotation) { if (!userControl) { throw new IllegalStateException("User control must be on bone to allow user transforms"); } - + + // TODO: add scale here ??? worldPos.set(translation); worldRot.set(rotation); } @@ -497,15 +555,11 @@ public final class Bone implements Savable { public void setBindTransforms(Vector3f translation, Quaternion rotation, Vector3f scale) { initialPos.set(translation); initialRot.set(rotation); - if (scale != null) { - initialScale.set(scale); - } - + initialScale.set(scale); + localPos.set(translation); localRot.set(rotation); - if (scale != null) { - localScale.set(scale); - } + localScale.set(scale); } private String toString(int depth) { @@ -562,12 +616,4 @@ public final class Bone implements Savable { output.write(initialScale, "initialScale", new Vector3f(1.0f, 1.0f, 1.0f)); output.writeSavableArrayList(children, "children", null); } - - public Vector3f getInitialPos() { - return initialPos; - } - - public Quaternion getInitialRot() { - return initialRot; - } } diff --git a/engine/src/core/com/jme3/animation/BoneAnimation.java b/engine/src/core/com/jme3/animation/BoneAnimation.java index 6793ae4e4..966e26a62 100644 --- a/engine/src/core/com/jme3/animation/BoneAnimation.java +++ b/engine/src/core/com/jme3/animation/BoneAnimation.java @@ -40,7 +40,7 @@ import java.io.IOException; import java.util.BitSet; /** - * Bone animation updates each of its tracks with the skeleton and time + * BoneAnimation updates each of its tracks with the skeleton and time * to apply the animation. * * @author Kirill Vainer @@ -69,36 +69,40 @@ public final class BoneAnimation implements Savable { } /** - * Returns the animation name - * @return + * The name of the bone animation + * @return name of the bone animation */ - public String getName() { + public String getName(){ return name; } /** - * returns the animation length (in seconds) - * @return + * Returns the length in seconds of this animation + * + * @return the length in seconds of this animation */ - public float getLength() { + public float getLength(){ return length; } /** - * Sets the bone tracks to this bone animation - * @see BoneTrack - * @param tracks + * Set the {@link BoneTrack}s to be used by this animation. + *

+ * The array should be organized so that the appropriate BoneTrack can + * be retrieved based on a bone index. + * + * @param tracks The tracks to set. */ - public void setTracks(BoneTrack[] tracks) { + public void setTracks(BoneTrack[] tracks){ this.tracks = tracks; } /** - * returns the bone tracks of this animation - * @see BoneTrack - * @return + * Returns the tracks set in {@link #setTracks(com.jme3.animation.BoneTrack[]) }. + * + * @return the tracks set previously */ - public BoneTrack[] getTracks() { + public BoneTrack[] getTracks(){ return tracks; } diff --git a/engine/src/core/com/jme3/animation/Skeleton.java b/engine/src/core/com/jme3/animation/Skeleton.java index 666a51543..88dca1329 100644 --- a/engine/src/core/com/jme3/animation/Skeleton.java +++ b/engine/src/core/com/jme3/animation/Skeleton.java @@ -44,14 +44,17 @@ import java.util.ArrayList; import java.util.List; /** - * A skeleton is a hierarchy of bones. + * Skeleton is a convenience class for managing a bone hierarchy. * Skeleton updates the world transforms to reflect the current local * animated matrixes. + * + * @author Kirill Vainer */ public final class Skeleton implements Savable { private Bone[] rootBones; private Bone[] boneList; + /** * Contains the skinning matrices, multiplying it by a vertex effected by a bone * will cause it to go to the animated position. @@ -59,8 +62,13 @@ public final class Skeleton implements Savable { private transient Matrix4f[] skinningMatrixes; /** - * Creates a skeleton from a bone list. The root bone is found automatically. - * @param boneList + * Creates a skeleton from a bone list. + * The root bones are found automatically. + *

+ * Note that using this constructor will cause the bones in the list + * to have their bind pose recomputed based on their local transforms. + * + * @param boneList The list of bones to manage by this Skeleton */ public Skeleton(Bone[] boneList) { this.boneList = boneList; @@ -84,9 +92,12 @@ public final class Skeleton implements Savable { } /** - * Copy constructor. - * Most of the skeleton data is deeply-copied except the bone bind and inverseBind transforms. - * @param source + * Special-purpose copy constructor. + *

+ * Shallow copies bind pose data from the source skeleton, does not + * copy any other data. + * + * @param source The source Skeleton to copy from */ public Skeleton(Skeleton source) { Bone[] sourceList = source.boneList; @@ -107,9 +118,7 @@ public final class Skeleton implements Savable { } /** - * Used for binary loading as a Savable; the object must be constructed, - * then the parameters usually present in the constructor for this class are - * restored from the file the object was saved to. + * Serialization only. Do not use. */ public Skeleton() { } diff --git a/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java b/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java index 08809f3a2..a7dd9dd19 100644 --- a/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java +++ b/engine/src/jbullet/com/jme3/bullet/control/KinematicRagdollControl.java @@ -193,9 +193,9 @@ public class KinematicRagdollControl implements PhysicsControl, PhysicsCollision if (link.bone.getParent() == null) { //offsetting the physic's position/rotation by the root bone inverse model space position/rotaion - modelPosition.set(p).subtractLocal(link.bone.getInitialPos()); + modelPosition.set(p).subtractLocal(link.bone.getWorldBindPosition()); targetModel.getParent().getWorldTransform().transformInverseVector(modelPosition, modelPosition); - modelRotation.set(q).multLocal(tmpRot2.set(link.bone.getInitialRot()).inverseLocal()); + modelRotation.set(q).multLocal(tmpRot2.set(link.bone.getWorldBindRotation()).inverseLocal()); //applying transforms to the model