rimworld-animation-studio/Assets/Scripts/AnimationComponents/AnimationClips/ThingAnimationClip.cs

54 lines
2.0 KiB
C#
Raw Normal View History

2022-09-13 05:36:34 +00:00
using System.Collections.Generic;
2022-09-19 00:07:44 +00:00
using System.Linq;
2022-09-13 05:36:34 +00:00
using System.Xml;
using System.Xml.Serialization;
namespace RimWorldAnimationStudio
{
public class ThingAnimationClip : AnimationClip
{
[XmlAttribute("Class")] public string className = "Rimworld_Animations.ThingAnimationClip";
2022-09-13 05:36:34 +00:00
[XmlArray("keyframes"), XmlArrayItem("li")] public List<ThingKeyframe> keyframes = new List<ThingKeyframe>();
[XmlIgnore] public SimpleCurve PositionX = new SimpleCurve();
[XmlIgnore] public SimpleCurve PositionZ = new SimpleCurve();
[XmlIgnore] public SimpleCurve Rotation = new SimpleCurve();
2022-09-19 00:07:44 +00:00
public override int duration { get { return keyframes.Max(x => x.atTick.Value); } }
2022-09-13 05:36:34 +00:00
public override void BuildSimpleCurves()
{
int duration = 0;
2022-09-19 00:07:44 +00:00
2022-09-13 05:36:34 +00:00
//getting the length of the whole clip
foreach (ThingKeyframe frame in keyframes)
{
duration += frame.tickDuration;
}
//guarantees loops don't get cut off mid-anim
2022-09-19 00:07:44 +00:00
//this.duration = duration;
2022-09-13 05:36:34 +00:00
int keyframePosition = 0;
foreach (ThingKeyframe frame in keyframes)
{
if (frame.atTick.HasValue)
{
PositionX.Add((float)frame.atTick / (float)duration, frame.positionX, true);
PositionZ.Add((float)frame.atTick / (float)duration, frame.positionZ, true);
Rotation.Add((float)frame.atTick / (float)duration, frame.rotation, true);
2022-09-13 05:36:34 +00:00
}
else
{
PositionX.Add((float)keyframePosition / (float)duration, frame.positionX, true);
PositionZ.Add((float)keyframePosition / (float)duration, frame.positionZ, true);
Rotation.Add((float)keyframePosition / (float)duration, frame.rotation, true);
2022-09-13 05:36:34 +00:00
keyframePosition += frame.tickDuration;
}
}
}
}
}