@Override
 public TrackWrapper clone() {
   if (boneTrack != null) {
     return new TrackWrapper(boneTrack.clone());
   }
   return new TrackWrapper(spatialTrack.clone());
 }
 public void setTime(
     float time, float weight, AnimControl control, AnimChannel channel, TempVars vars) {
   if (boneTrack != null) {
     boneTrack.setTime(time, weight, control, channel, vars);
   } else {
     spatialTrack.setTime(time, weight, control, channel, vars);
   }
 }
 /**
  * Set the translations, rotations and scales for this bone track
  *
  * @param times a float array with the time of each frame
  * @param translations the translation of the bone for each frame
  * @param rotations the rotation of the bone for each frame
  * @param scales the scale of the bone for each frame
  */
 public void setKeyframes(
     float[] times, Vector3f[] translations, Quaternion[] rotations, Vector3f[] scales) {
   if (boneTrack != null) {
     boneTrack.setKeyframes(times, translations, rotations, scales);
   } else {
     spatialTrack.setKeyframes(times, translations, rotations, scales);
   }
 }
 public float getLength() {
   return spatialTrack == null ? boneTrack.getLength() : spatialTrack.getLength();
 }
 /** @return the array of translations of this track */
 public Vector3f[] getTranslations() {
   if (boneTrack != null) {
     return boneTrack.getTranslations();
   }
   return spatialTrack.getTranslations();
 }
 /** @return the arrays of time for this track */
 public float[] getTimes() {
   if (boneTrack != null) {
     return boneTrack.getTimes();
   }
   return spatialTrack.getTimes();
 }
 /** @return the array of scales for this track */
 public Vector3f[] getScales() {
   if (boneTrack != null) {
     return boneTrack.getScales();
   }
   return spatialTrack.getScales();
 }
 /** @return the array of rotations of this track */
 public Quaternion[] getRotations() {
   if (boneTrack != null) {
     return boneTrack.getRotations();
   }
   return spatialTrack.getRotations();
 }