private void WriteKeyframes(ContentWriter output, IList <KeyframeContent> keyframes) { Int32 count = keyframes.Count; output.Write((Int32)count); for (int i = 0; i < count; i++) { KeyframeContent keyframe = keyframes[i]; output.Write(keyframe.Bone); output.Write(keyframe.Time.Ticks); output.Write(keyframe.Transform.M11); output.Write(keyframe.Transform.M12); output.Write(keyframe.Transform.M13); output.Write(keyframe.Transform.M21); output.Write(keyframe.Transform.M22); output.Write(keyframe.Transform.M23); output.Write(keyframe.Transform.M31); output.Write(keyframe.Transform.M32); output.Write(keyframe.Transform.M33); output.Write(keyframe.Transform.M41); output.Write(keyframe.Transform.M42); output.Write(keyframe.Transform.M43); } return; }
static int CompareKeyframeTimes(KeyframeContent a, KeyframeContent b) { int cmpTime = a.Time.CompareTo(b.Time); if (cmpTime == 0) { return(a.Bone.CompareTo(b.Bone)); } return(cmpTime); }
// the player currently requires all bones to have a keyframe at time zero private List <KeyframeContent> EnsureFirstKeyframeExists(TimeSpan duration, List <KeyframeContent> keyframes) { int keyframeCount = keyframes.Count; // find bones HashSet <int> bonesSet = new HashSet <int>(); int maxBone = 0; for (int i = 0; i < keyframeCount; i++) { int bone = keyframes[i].Bone; maxBone = Math.Max(maxBone, bone); bonesSet.Add(bone); } int boneCount = bonesSet.Count; // split bones List <KeyframeContent>[] boneFrames = new List <KeyframeContent> [maxBone + 1]; for (int i = 0; i < keyframeCount; i++) { int bone = keyframes[i].Bone; if (boneFrames[bone] == null) { boneFrames[bone] = new List <KeyframeContent>(); } boneFrames[bone].Add(keyframes[i]); } // System.Diagnostics.Debug.WriteLine("Duration: " + duration); System.Diagnostics.Debug.WriteLine("keyframeCount: " + keyframeCount); for (int b = 0; b < boneFrames.Length; b++) { if (boneFrames[b] == null) { continue; } if (boneFrames[b][0].Time != TimeSpan.Zero) { var keyframe0 = new KeyframeContent(boneFrames[b][0].Bone, TimeSpan.Zero, boneFrames[b][0].Transform); boneFrames[b].Insert(0, keyframe0); } } List <KeyframeContent> newKeyframes = new List <KeyframeContent>(); for (int b = 0; b < boneFrames.Length; b++) { if (boneFrames[b] != null) { for (int k = 0; k < boneFrames[b].Count; ++k) { newKeyframes.Add(boneFrames[b][k]); } } } newKeyframes.Sort(CompareKeyframeTimes); return(newKeyframes); }