// public AnimationInstance(Animation anim) { animation_ = anim; frameRate_ = anim.FrameRate; // The time of the last frame is less than the duration of the animation, // as the last frame has some duration itself. lastFrameTime_ = (anim.NumFrames - 1) / frameRate_; invFrameRate_ = 1.0f / frameRate_; duration_ = anim.NumFrames * invFrameRate_; int max = 0; // calculate max bone index // todo: do in content pipeline foreach (KeyValuePair <int, AnimationTrack> kvp in anim.Tracks) { if (kvp.Key >= max) { max = kvp.Key + 1; } } // Allocate animation keyframes (for lerping between times). keyframes_ = new Keyframe[max]; // Load all the tracks (one track per bone). tracks_ = new AnimationTrack[max]; foreach (int i in anim.Tracks.Keys) { keyframes_[i] = new Keyframe(); tracks_[i] = anim.Tracks[i]; } }
protected override AnimationTrackDictionary Read(ContentReader input, AnimationTrackDictionary existingInstance) { if (existingInstance == null) { existingInstance = new AnimationTrackDictionary(); } int num = input.ReadInt32(); for (int i = 0; i != num; ++i) { int index = input.ReadInt32(); AnimationTrack track = input.ReadObject <AnimationTrack>(); existingInstance.Add(index, track); } return(existingInstance); }