public SpriterObject Clone()
{
var so = new SpriterObject(FlatRedBallServices.GlobalContentManager, false)
{
Animations = new Dictionary<string, SpriterObjectAnimation>()
};
var allObjects =
Animations.Select(a => a.Value)
.SelectMany(v => v.KeyFrames)
.SelectMany(kf => kf.Values)
.Select(kfv => kfv.Key)
.GroupBy(k => k.Name)
.Select(g => g.First().Clone<PositionedObject>())
.ToList();
foreach (var animationPair in Animations)
{
var keyframes = new List<KeyFrame>();
animationPair.Value.KeyFrames.ForEach(kf =>
{
var keyFrame = new KeyFrame
{
Time = kf.Time,
Values = new Dictionary<PositionedObject, KeyFrameValues>(kf.Values.Count)
};
foreach (var kfPair in kf.Values)
{
var parent = kfPair.Value.Parent == null || kfPair.Value.Parent.Name == null
? null
: allObjects.First(k => k.Name == kfPair.Value.Parent.Name);
var kfv = new KeyFrameValues
{
Alpha = kfPair.Value.Alpha,
Parent = parent,
RelativePosition = kfPair.Value.RelativePosition,
RelativeRotation = kfPair.Value.RelativeRotation,
RelativeScaleX = kfPair.Value.RelativeScaleX,
RelativeScaleY = kfPair.Value.RelativeScaleY,
Spin = kfPair.Value.Spin,
Texture = kfPair.Value.Texture
};
keyFrame.Values[allObjects.First(k => k.Name == kfPair.Key.Name)] = kfv;
}
keyframes.Add(keyFrame);
});
so.Animations[animationPair.Key] = new SpriterObjectAnimation(animationPair.Value.Name,
animationPair.Value.Looping,
animationPair.Value.TotalTime,
keyframes);
}
so.ObjectList = so.Animations.Select(a => a.Value)
.SelectMany(v => v.KeyFrames)
.SelectMany(kf => kf.Values)
.Select(kfv => kfv.Key)
.GroupBy(k => k.Name)
.Select(g => g.First())
.ToList();
return so;
}