Improved undo redo function and timelines

This commit is contained in:
AbstractConcept 2022-09-21 00:40:58 -05:00
parent 1af7f41d63
commit e36ef6a368
372 changed files with 4086 additions and 211 deletions

View file

@ -27,7 +27,7 @@ namespace RimWorldAnimationStudio
public Transform animationTimelines;
public Transform actorBodies;
public Toggle stretchkeyframesToggle;
public InputField playBackSpeedField;
[Header("Prefabs")]
public ActorBody actorBodyPrefab;
@ -39,7 +39,8 @@ namespace RimWorldAnimationStudio
private int cycleIndex = 0;
private bool isDirty = true;
private bool isTimelineDirty = true;
private float playBackSpeed = 1f;
public void MakeDirty()
{ isDirty = true; }
@ -53,17 +54,17 @@ namespace RimWorldAnimationStudio
// Dirty animation, reset
if (Workspace.animationDef != null && isDirty)
{ Initialize(); return; }
{ Initialize(); }
// Update tick if animating
if (isAnimating)
{
timeSinceLastUpdate += Time.deltaTime;
if (timeSinceLastUpdate < 1f / 60f)
if (timeSinceLastUpdate < 1 / (playBackSpeed * 60f))
{ return; }
timeSinceLastUpdate -= 1f / 60f;
timeSinceLastUpdate -= 1 / (playBackSpeed * 60f);
stageTick += 1;
if (stageTick > Workspace.StageWindowSize)
@ -237,7 +238,7 @@ namespace RimWorldAnimationStudio
Actor actor = new Actor();
actor.MakeNew();
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Actor addition");
}
public void RemoveActor()
@ -254,7 +255,7 @@ namespace RimWorldAnimationStudio
Workspace.animationDef.actors.RemoveAt(Workspace.actorID);
Workspace.actorID = Workspace.actorID >= Workspace.animationDef.actors.Count ? Workspace.actorID = Workspace.animationDef.actors.Count - 1 : Workspace.actorID;
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Actor deletion");
}
public void AddPawnKeyframe()
@ -294,14 +295,12 @@ namespace RimWorldAnimationStudio
animationTimelines.GetComponentsInChildren<AnimationTimeline>()[Workspace.actorID].AddPawnKeyFrame(keyframe.keyframeID);
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Keyframe addition");
}
public void RemovePawnKeyframe()
{
RemovePawnKeyframe(Workspace.actorID, Workspace.keyframeID);
Workspace.Instance.MakeDirty();
}
public void RemovePawnKeyframe(int actorID, int keyframeID)
@ -318,9 +317,9 @@ namespace RimWorldAnimationStudio
PawnAnimationClip clip = Workspace.animationDef.animationStages[Workspace.stageID].animationClips[actorID];
clip.keyframes.Remove(keyframe);
clip.BuildSimpleCurves();
}
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Keyframe deletion");
}
}
public void ToggleAnimation()
@ -351,8 +350,6 @@ namespace RimWorldAnimationStudio
int.TryParse(animationClipTimeField.text, out int newStageTick);
stageTick = Mathf.Clamp(newStageTick, 1, Workspace.StageWindowSize);
stageTimelineSlider.value = stageTick;
Workspace.Instance.MakeDirty();
}
public void OnAnimationClipLengthFieldChange()
@ -390,7 +387,7 @@ namespace RimWorldAnimationStudio
animationClipLengthField.text = newStageWindowSize.ToString();
Workspace.animationDef.animationStages[Workspace.stageID].stageWindowSize = newStageWindowSize;
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Stage length");
}
public void StretchKeyframes(int newStageWindowSize)
@ -418,7 +415,7 @@ namespace RimWorldAnimationStudio
if (int.TryParse(cyclesNormalField.text, out int cycles))
{ Workspace.animationDef.animationStages[Workspace.stageID].playTimeTicks = cycles * Workspace.StageWindowSize; }
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Cycle count (normal)");
}
public void OnCycleFastFieldChange()
@ -428,7 +425,13 @@ namespace RimWorldAnimationStudio
if (int.TryParse(cyclesFastField.text, out int cycles))
{ Workspace.animationDef.animationStages[Workspace.stageID].playTimeTicksQuick = cycles * Workspace.StageWindowSize; }
Workspace.Instance.MakeDirty();
Workspace.Instance.RecordEvent("Cycle count (fast)");
}
public void OnPlayBackSpeedChange()
{
if (float.TryParse(playBackSpeedField.text, out playBackSpeed))
{ playBackSpeed = Mathf.Clamp(playBackSpeed, 0.01f, 4f); }
}
private int lastactorCount = 0;