|
@@ -35,6 +35,8 @@ import com.jme3.export.*;
|
|
import com.jme3.math.Quaternion;
|
|
import com.jme3.math.Quaternion;
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.util.TempVars;
|
|
import com.jme3.util.TempVars;
|
|
|
|
+import com.jme3.util.clone.Cloner;
|
|
|
|
+import com.jme3.util.clone.JmeCloneable;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.util.BitSet;
|
|
import java.util.BitSet;
|
|
|
|
|
|
@@ -43,7 +45,7 @@ import java.util.BitSet;
|
|
*
|
|
*
|
|
* @author Kirill Vainer
|
|
* @author Kirill Vainer
|
|
*/
|
|
*/
|
|
-public final class BoneTrack implements Track {
|
|
|
|
|
|
+public final class BoneTrack implements JmeCloneable, Track {
|
|
|
|
|
|
/**
|
|
/**
|
|
* Bone index in the skeleton which this track affects.
|
|
* Bone index in the skeleton which this track affects.
|
|
@@ -272,33 +274,48 @@ public final class BoneTrack implements Track {
|
|
public float[] getKeyFrameTimes() {
|
|
public float[] getKeyFrameTimes() {
|
|
return times;
|
|
return times;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * This method creates a clone of the current object.
|
|
|
|
- * @return a clone of the current object
|
|
|
|
|
|
+ * Create a deep clone of this track.
|
|
|
|
+ *
|
|
|
|
+ * @return a new track
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public BoneTrack clone() {
|
|
public BoneTrack clone() {
|
|
- int tablesLength = times.length;
|
|
|
|
-
|
|
|
|
- float[] times = this.times.clone();
|
|
|
|
- Vector3f[] sourceTranslations = this.getTranslations();
|
|
|
|
- Quaternion[] sourceRotations = this.getRotations();
|
|
|
|
- Vector3f[] sourceScales = this.getScales();
|
|
|
|
|
|
+ return Cloner.deepClone(this);
|
|
|
|
+ }
|
|
|
|
|
|
- Vector3f[] translations = new Vector3f[tablesLength];
|
|
|
|
- Quaternion[] rotations = new Quaternion[tablesLength];
|
|
|
|
- Vector3f[] scales = new Vector3f[tablesLength];
|
|
|
|
- for (int i = 0; i < tablesLength; ++i) {
|
|
|
|
- translations[i] = sourceTranslations[i].clone();
|
|
|
|
- rotations[i] = sourceRotations[i].clone();
|
|
|
|
- scales[i] = sourceScales != null ? sourceScales[i].clone() : new Vector3f(1.0f, 1.0f, 1.0f);
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Create a shallow clone for the JME cloner.
|
|
|
|
+ *
|
|
|
|
+ * @return a new track
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public BoneTrack jmeClone() {
|
|
|
|
+ try {
|
|
|
|
+ return (BoneTrack) super.clone();
|
|
|
|
+ } catch (CloneNotSupportedException exception) {
|
|
|
|
+ throw new RuntimeException("Can't clone track", exception);
|
|
}
|
|
}
|
|
-
|
|
|
|
- // Need to use the constructor here because of the final fields used in this class
|
|
|
|
- return new BoneTrack(targetBoneIndex, times, translations, rotations, scales);
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Callback from {@link com.jme3.util.clone.Cloner} to convert this
|
|
|
|
+ * shallow-cloned track into a deep-cloned one, using the specified cloner
|
|
|
|
+ * to resolve copied fields.
|
|
|
|
+ *
|
|
|
|
+ * @param cloner the cloner currently cloning this control (not null)
|
|
|
|
+ * @param original the track from which this track was shallow-cloned
|
|
|
|
+ * (unused)
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public void cloneFields(Cloner cloner, Object original) {
|
|
|
|
+ translations = cloner.clone(translations);
|
|
|
|
+ rotations = cloner.clone(rotations);
|
|
|
|
+ scales = cloner.clone(scales);
|
|
|
|
+ times = cloner.clone(times);
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public void write(JmeExporter ex) throws IOException {
|
|
public void write(JmeExporter ex) throws IOException {
|
|
OutputCapsule oc = ex.getCapsule(this);
|
|
OutputCapsule oc = ex.getCapsule(this);
|