@SuppressWarnings("unchecked")
  public void read(JMEImporter e) throws IOException {
    super.read(e);
    InputCapsule capsule = e.getCapsule(this);

    numObjects = capsule.readInt("numObjects", 0);

    Savable[] savs = capsule.readSavableArray("toChange", new Spatial[0]);
    if (savs == null) {
      toChange = null;
    } else {
      toChange = new Spatial[savs.length];
      for (int x = 0; x < savs.length; x++) {
        toChange[x] = (Spatial) savs[x];
      }
    }

    savs = capsule.readSavableArray("pivots", new TransformQuaternion[0]);
    if (savs == null) {
      pivots = null;
    } else {
      pivots = new TransformQuaternion[savs.length];
      for (int x = 0; x < savs.length; x++) {
        pivots[x] = (TransformQuaternion) savs[x];
      }
    }

    parentIndexes = capsule.readIntArray("parentIndexes", new int[0]);
    keyframes = capsule.readSavableArrayList("keyframes", new ArrayList());
    haveChanged = capsule.readBooleanArray("haveChanged", new boolean[0]);

    beginPointTime = (PointInTime) capsule.readSavable("beginPointTime", null);
    endPointTime = (PointInTime) capsule.readSavable("endPointTime", null);
  }
  /** <b>This method foces interpolation mode, regardless of input</b> */
  @SuppressWarnings("unchecked")
  public void read(JMEImporter e) throws IOException {
    InputCapsule cap = e.getCapsule(this);
    name = cap.readString("name", null);
    keyframeTime = cap.readFloatArray("keyframeTime", null);
    interpolationType = cap.readIntArray("interpolationType", null);
    boneTransforms = cap.readSavableArrayList("boneTransforms", null);
    currentTime = cap.readFloat("currentTime", 0);
    currentFrame = cap.readInt("currentFrame", 1);
    prevFrame = cap.readInt("prevFrame", 0);
    endFrame = cap.readInt("endFrame", 0);
    startFrame = cap.readInt("startFrame", 0);
    interpolationRate = cap.readFloat("interpolationRate", DEFAULT_RATE);
    lastTime = cap.readFloat("lastTime", 0);
    cycleMode = cap.readInt("cycleMode", 1);
    interpolate = cap.readBoolean("interpolate", true);
    children = cap.readSavableArrayList("children", null);

    int[] frames = cap.readIntArray("eventFrames", null);

    if (frames != null) {
      for (int i = 0; i < frames.length; i++) {
        ArrayList<Savable> events = cap.readSavableArrayList("event" + frames[i], null);
        for (int j = 0; j < events.size(); j++) {
          AnimationEventManager.getInstance()
              .addAnimationEvent(this, frames[i], (AnimationEvent) events.get(i));
        }
      }
    }

    // Update the method Javadoc when non-interpolation is supported again.
    interpolationType = new int[keyframeTime.length];
    for (int i = 0; i < keyframeTime.length; i++) {
      interpolationType[i] = BoneAnimation.LINEAR;
    }
  }