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 }
public void AddBonePose(SmdBonePose bonePose) { ExplicitBonePoses.Add(bonePose); ExplicitBonePoseByBoneName[bonePose.Bone.Name] = bonePose; }