diff --git a/jme3-core/src/main/java/com/jme3/animation/Bone.java b/jme3-core/src/main/java/com/jme3/animation/Bone.java index fcbacb337..0d1a825dd 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Bone.java +++ b/jme3-core/src/main/java/com/jme3/animation/Bone.java @@ -35,6 +35,8 @@ import com.jme3.export.*; import com.jme3.math.*; import com.jme3.scene.Node; import com.jme3.util.TempVars; +import com.jme3.util.clone.JmeCloneable; +import com.jme3.util.clone.Cloner; import java.io.IOException; import java.util.ArrayList; @@ -62,13 +64,13 @@ import java.util.ArrayList; * @author Kirill Vainer * @author Rémy Bouquet */ -public final class Bone implements Savable { +public final class Bone implements Savable, JmeCloneable { // Version #2: Changed naming of transforms as they were misleading public static final int SAVABLE_VERSION = 2; private String name; private Bone parent; - private final ArrayList children = new ArrayList(); + private ArrayList children = new ArrayList(); /** * If enabled, user can control bone transform with setUserTransforms. * Animation transforms are not applied to this bone when enabled. @@ -167,6 +169,43 @@ public final class Bone implements Savable { */ public Bone() { } + + @Override + public Object jmeClone() { + try { + Bone clone = (Bone)super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } + } + + @Override + public void cloneFields( Cloner cloner, Object original ) { + + this.parent = cloner.clone(parent); + this.children = cloner.clone(children); + + this.attachNode = cloner.clone(attachNode); + + this.bindPos = cloner.clone(bindPos); + this.bindRot = cloner.clone(bindRot); + this.bindScale = cloner.clone(bindScale); + + this.modelBindInversePos = cloner.clone(modelBindInversePos); + this.modelBindInverseRot = cloner.clone(modelBindInverseRot); + this.modelBindInverseScale = cloner.clone(modelBindInverseScale); + + this.localPos = cloner.clone(localPos); + this.localRot = cloner.clone(localRot); + this.localScale = cloner.clone(localScale); + + this.modelPos = cloner.clone(modelPos); + this.modelRot = cloner.clone(modelRot); + this.modelScale = cloner.clone(modelScale); + + this.tmpTransform = cloner.clone(tmpTransform); + } /** * Returns the name of the bone, set in the constructor. diff --git a/jme3-core/src/main/java/com/jme3/animation/Skeleton.java b/jme3-core/src/main/java/com/jme3/animation/Skeleton.java index 8ae3ca507..47efc629d 100644 --- a/jme3-core/src/main/java/com/jme3/animation/Skeleton.java +++ b/jme3-core/src/main/java/com/jme3/animation/Skeleton.java @@ -122,11 +122,19 @@ public final class Skeleton implements Savable, JmeCloneable { @Override public Object jmeClone() { - return new Skeleton(this); + try { + Skeleton clone = (Skeleton)super.clone(); + return clone; + } catch (CloneNotSupportedException ex) { + throw new AssertionError(); + } } @Override public void cloneFields( Cloner cloner, Object original ) { + this.rootBones = cloner.clone(rootBones); + this.boneList = cloner.clone(boneList); + this.skinningMatrixes = cloner.clone(skinningMatrixes); } private void createSkinningMatrices() {