Browse Source

Convert Skeleton and Bone over to use the JME cloner system for cloning...
this should do automatic fix-up and hopefully make bones attachments work
properly again in clones.

Paul Speed 8 năm trước cách đây
mục cha
commit
63e8c9c485

+ 41 - 2
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<Bone> children = new ArrayList<Bone>();
+    private ArrayList<Bone> children = new ArrayList<Bone>();
     /**
      * 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.

+ 9 - 1
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() {