Beispiel #1
0
        public void BakeFrame()
        {
            List <SmdBone> remainingBones = new List <SmdBone>(Timeline.TargetSkeleton.Bones); // Bones which we still have to find pose data for

            foreach (SmdBonePose explicitBonePose in ExplicitBonePoses)
            {
                if (remainingBones.Contains(explicitBonePose.Bone))
                {
                    remainingBones.Remove(explicitBonePose.Bone);
                }
            }

            if (remainingBones.Count == 0)
            {
                return; // We already have pose data for every bone in the skeleton
            }
            // Rewind through the previous frames and grab the bone pose for any remaining bones until we either get them all or run out of timeline to rewind
            int prevFrameIndex = FrameIndex - 1;

            while (remainingBones.Count > 0 && prevFrameIndex > 0)
            {
                SmdTimelineFrame prevFrame = Timeline.ExplicitFrames[prevFrameIndex];
                foreach (SmdBonePose prevBonePose in prevFrame.ExplicitBonePoses)
                {
                    if (remainingBones.Contains(prevBonePose.Bone))
                    {
                        ExplicitBonePoses.Add(prevBonePose.Clone());
                        remainingBones.Remove(prevBonePose.Bone);
                    }
                }
                prevFrameIndex--;
            }
            ExplicitBonePoses = ExplicitBonePoses.OrderBy(p => p.Bone.ID).ToList(); // Restore order by bone ID
        }
Beispiel #2
0
 public void AddBonePose(SmdBonePose bonePose)
 {
     ExplicitBonePoses.Add(bonePose);
     ExplicitBonePoseByBoneName[bonePose.Bone.Name] = bonePose;
 }