|
@@ -10,6 +10,7 @@ import com.jme3.math.Quaternion;
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.math.Vector3f;
|
|
import com.jme3.scene.Spatial;
|
|
import com.jme3.scene.Spatial;
|
|
import com.jme3.util.TempVars;
|
|
import com.jme3.util.TempVars;
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
|
/**
|
|
/**
|
|
* This class represents the track for spatial animation.
|
|
* This class represents the track for spatial animation.
|
|
@@ -79,14 +80,18 @@ public class SpatialTrack implements Track {
|
|
|
|
|
|
int lastFrame = times.length - 1;
|
|
int lastFrame = times.length - 1;
|
|
if (time < 0 || lastFrame == 0) {
|
|
if (time < 0 || lastFrame == 0) {
|
|
- rotations.get(0, tempQ);
|
|
|
|
- translations.get(0, tempV);
|
|
|
|
|
|
+ if (rotations != null)
|
|
|
|
+ rotations.get(0, tempQ);
|
|
|
|
+ if (translations != null)
|
|
|
|
+ translations.get(0, tempV);
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
scales.get(0, tempS);
|
|
scales.get(0, tempS);
|
|
}
|
|
}
|
|
} else if (time >= times[lastFrame]) {
|
|
} else if (time >= times[lastFrame]) {
|
|
- rotations.get(lastFrame, tempQ);
|
|
|
|
- translations.get(lastFrame, tempV);
|
|
|
|
|
|
+ if (rotations != null)
|
|
|
|
+ rotations.get(lastFrame, tempQ);
|
|
|
|
+ if (translations != null)
|
|
|
|
+ translations.get(lastFrame, tempV);
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
scales.get(lastFrame, tempS);
|
|
scales.get(lastFrame, tempS);
|
|
}
|
|
}
|
|
@@ -101,13 +106,17 @@ public class SpatialTrack implements Track {
|
|
|
|
|
|
float blend = (time - times[startFrame]) / (times[endFrame] - times[startFrame]);
|
|
float blend = (time - times[startFrame]) / (times[endFrame] - times[startFrame]);
|
|
|
|
|
|
- rotations.get(startFrame, tempQ);
|
|
|
|
- translations.get(startFrame, tempV);
|
|
|
|
|
|
+ if (rotations != null)
|
|
|
|
+ rotations.get(startFrame, tempQ);
|
|
|
|
+ if (translations != null)
|
|
|
|
+ translations.get(startFrame, tempV);
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
scales.get(startFrame, tempS);
|
|
scales.get(startFrame, tempS);
|
|
}
|
|
}
|
|
- rotations.get(endFrame, tempQ2);
|
|
|
|
- translations.get(endFrame, tempV2);
|
|
|
|
|
|
+ if (rotations != null)
|
|
|
|
+ rotations.get(endFrame, tempQ2);
|
|
|
|
+ if (translations != null)
|
|
|
|
+ translations.get(endFrame, tempV2);
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
scales.get(endFrame, tempS2);
|
|
scales.get(endFrame, tempS2);
|
|
}
|
|
}
|
|
@@ -116,8 +125,10 @@ public class SpatialTrack implements Track {
|
|
tempS.interpolate(tempS2, blend);
|
|
tempS.interpolate(tempS2, blend);
|
|
}
|
|
}
|
|
|
|
|
|
- spatial.setLocalTranslation(tempV);
|
|
|
|
- spatial.setLocalRotation(tempQ);
|
|
|
|
|
|
+ if (translations != null)
|
|
|
|
+ spatial.setLocalTranslation(tempV);
|
|
|
|
+ if (rotations != null)
|
|
|
|
+ spatial.setLocalRotation(tempQ);
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
spatial.setLocalScale(tempS);
|
|
spatial.setLocalScale(tempS);
|
|
}
|
|
}
|
|
@@ -141,25 +152,24 @@ public class SpatialTrack implements Track {
|
|
throw new RuntimeException("BoneTrack with no keyframes!");
|
|
throw new RuntimeException("BoneTrack with no keyframes!");
|
|
}
|
|
}
|
|
|
|
|
|
- assert times.length == translations.length
|
|
|
|
- && times.length == rotations.length;
|
|
|
|
-
|
|
|
|
this.times = times;
|
|
this.times = times;
|
|
- this.translations = new CompactVector3Array();
|
|
|
|
- this.translations.add(translations);
|
|
|
|
- this.translations.freeze();
|
|
|
|
- this.rotations = new CompactQuaternionArray();
|
|
|
|
- this.rotations.add(rotations);
|
|
|
|
- this.rotations.freeze();
|
|
|
|
-
|
|
|
|
|
|
+ if (translations != null) {
|
|
|
|
+ assert times.length == translations.length;
|
|
|
|
+ this.translations = new CompactVector3Array();
|
|
|
|
+ this.translations.add(translations);
|
|
|
|
+ this.translations.freeze();
|
|
|
|
+ }
|
|
|
|
+ if (rotations != null) {
|
|
|
|
+ assert times.length == rotations.length;
|
|
|
|
+ this.rotations = new CompactQuaternionArray();
|
|
|
|
+ this.rotations.add(rotations);
|
|
|
|
+ this.rotations.freeze();
|
|
|
|
+ }
|
|
if (scales != null) {
|
|
if (scales != null) {
|
|
assert times.length == scales.length;
|
|
assert times.length == scales.length;
|
|
-
|
|
|
|
this.scales = new CompactVector3Array();
|
|
this.scales = new CompactVector3Array();
|
|
this.scales.add(scales);
|
|
this.scales.add(scales);
|
|
this.scales.freeze();
|
|
this.scales.freeze();
|
|
-
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -167,7 +177,7 @@ public class SpatialTrack implements Track {
|
|
* @return the array of rotations of this track
|
|
* @return the array of rotations of this track
|
|
*/
|
|
*/
|
|
public Quaternion[] getRotations() {
|
|
public Quaternion[] getRotations() {
|
|
- return rotations.toObjectArray();
|
|
|
|
|
|
+ return rotations == null ? null : rotations.toObjectArray();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -188,7 +198,7 @@ public class SpatialTrack implements Track {
|
|
* @return the array of translations of this track
|
|
* @return the array of translations of this track
|
|
*/
|
|
*/
|
|
public Vector3f[] getTranslations() {
|
|
public Vector3f[] getTranslations() {
|
|
- return translations.toObjectArray();
|
|
|
|
|
|
+ return translations == null ? null : translations.toObjectArray();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -206,21 +216,13 @@ public class SpatialTrack implements Track {
|
|
public SpatialTrack clone() {
|
|
public SpatialTrack clone() {
|
|
int tablesLength = times.length;
|
|
int tablesLength = times.length;
|
|
|
|
|
|
- float[] times = this.times.clone();
|
|
|
|
- Vector3f[] sourceTranslations = this.getTranslations();
|
|
|
|
- Quaternion[] sourceRotations = this.getRotations();
|
|
|
|
- Vector3f[] sourceScales = this.getScales();
|
|
|
|
-
|
|
|
|
- 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);
|
|
|
|
- }
|
|
|
|
|
|
+ float[] timesCopy = this.times.clone();
|
|
|
|
+ Vector3f[] translationsCopy = this.getTranslations() == null ? null : Arrays.copyOf(this.getTranslations(), tablesLength);
|
|
|
|
+ Quaternion[] rotationsCopy = this.getRotations() == null ? null : Arrays.copyOf(this.getRotations(), tablesLength);
|
|
|
|
+ Vector3f[] scalesCopy = this.getScales() == null ? null : Arrays.copyOf(this.getScales(), tablesLength);
|
|
|
|
+
|
|
//need to use the constructor here because of the final fields used in this class
|
|
//need to use the constructor here because of the final fields used in this class
|
|
- return new SpatialTrack(times, translations, rotations, scales);
|
|
|
|
|
|
+ return new SpatialTrack(timesCopy, translationsCopy, rotationsCopy, scalesCopy);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|