Beispiel #1
0
        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;
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        // 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);
        }