mirror of
https://gitgud.io/AbstractConcept/rimworld-animation-studio.git
synced 2024-08-15 00:43:27 +00:00
93 lines
3.6 KiB
C#
93 lines
3.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace RimWorldAnimationStudio
|
|
{
|
|
public class AnimationControlCard : MonoBehaviour
|
|
{
|
|
public InputField currentTimeField;
|
|
public InputField stageWindowLengthField;
|
|
public InputField playBackSpeedField;
|
|
public Button playToggleButton;
|
|
public Slider stageTimelineSlider;
|
|
|
|
private void Start()
|
|
{
|
|
EventsManager.onAnimationChanged.AddListener(delegate { UpdateGUI(); });
|
|
EventsManager.onStageIDChanged.AddListener(delegate { UpdateGUI(); });
|
|
EventsManager.onStageTickChanged.AddListener(delegate { UpdateGUI(); });
|
|
EventsManager.onAnimationToggled.AddListener(delegate { playToggleButton.image.color = Workspace.IsAnimating ? Constants.ColorGoldYellow : Constants.ColorWhite; });
|
|
|
|
stageTimelineSlider.onValueChanged.AddListener(delegate { OnStageTimelineSliderChange(); });
|
|
currentTimeField.onEndEdit.AddListener(delegate { OnCurrentTimeFieldChange(); });
|
|
stageWindowLengthField.onEndEdit.AddListener(delegate { OnStageWindowLengthFieldChange(); });
|
|
playBackSpeedField.onEndEdit.AddListener(delegate { OnPlayBackSpeedChange(); });
|
|
|
|
UpdateGUI();
|
|
}
|
|
|
|
public void OnStageTimelineSliderChange()
|
|
{
|
|
Workspace.StageTick = (int)stageTimelineSlider.value;
|
|
}
|
|
|
|
public void OnPlayBackSpeedChange()
|
|
{
|
|
Workspace.PlayBackSpeed = float.Parse(playBackSpeedField.text);
|
|
}
|
|
|
|
public void OnCurrentTimeFieldChange()
|
|
{
|
|
Workspace.StageTick = Mathf.Clamp(int.Parse(currentTimeField.text), Constants.minTick, Workspace.StageWindowSize);
|
|
|
|
UpdateGUI();
|
|
}
|
|
|
|
public void OnStageWindowLengthFieldChange()
|
|
{
|
|
int.TryParse(stageWindowLengthField.text, out int newStageWindowSize);
|
|
newStageWindowSize = Mathf.Clamp(newStageWindowSize, Constants.minAnimationClipLength, Constants.maxAnimationClipLength);
|
|
|
|
Debug.Log("Resizing animation clip length to " + newStageWindowSize.ToString() + " ticks.");
|
|
|
|
if (Workspace.stretchKeyframes)
|
|
{ Workspace.GetCurrentAnimationStage().StretchStageWindow(newStageWindowSize); }
|
|
|
|
else
|
|
{
|
|
foreach (PawnAnimationClip clip in Workspace.GetCurrentAnimationStage().AnimationClips)
|
|
{
|
|
List<PawnKeyframe> keyframes = clip.Keyframes.Where(x => x.atTick > newStageWindowSize)?.ToList();
|
|
|
|
if (keyframes.NullOrEmpty())
|
|
{ continue; }
|
|
|
|
foreach (PawnKeyframe keyframe in keyframes)
|
|
{
|
|
if (clip.Keyframes.Count <= 2)
|
|
{ break; }
|
|
|
|
clip.RemovePawnKeyframe(keyframe.keyframeID);
|
|
}
|
|
}
|
|
}
|
|
|
|
Workspace.GetCurrentAnimationStage().ResizeStageWindow(newStageWindowSize);
|
|
Workspace.RecordEvent("Stage length");
|
|
|
|
UpdateGUI();
|
|
}
|
|
|
|
public void UpdateGUI()
|
|
{
|
|
stageTimelineSlider.maxValue = Workspace.StageWindowSize;
|
|
stageTimelineSlider.SetValueWithoutNotify(Workspace.StageTick);
|
|
currentTimeField.SetTextWithoutNotify(Workspace.StageTick.ToString());
|
|
stageWindowLengthField.SetTextWithoutNotify(Workspace.StageWindowSize.ToString());
|
|
playBackSpeedField.SetTextWithoutNotify(Workspace.PlayBackSpeed.ToString());
|
|
}
|
|
}
|
|
}
|