Files
ADOFAIRenderer/UI/RenderButton.cs
T

144 lines
6.0 KiB
C#

using System.Linq;
using ADOFAIRenderer.Core;
using ADOFAIRenderer.Util.FFmpeg;
using MelonLoader;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace ADOFAIRenderer.UI
{
public class RenderButton : MonoBehaviour
{
[Header("Input Fields")]
[SerializeField] private TMP_InputField targetFPSInput = null!;
[SerializeField] private TMP_InputField videoFPSInput = null!;
[SerializeField] private TMP_InputField renderWidthInput = null!;
[SerializeField] private TMP_InputField renderHeightInput = null!;
[SerializeField] private TMP_InputField bitrateInput = null!;
[SerializeField] private TMP_InputField waitAfterEndInput = null!;
[SerializeField] private TMP_InputField randomSeedInput = null!;
[Header("Dropdown")]
[SerializeField] private TMP_Dropdown codecDropdown = null!;
[Header("Toggle")]
[SerializeField] private Toggle showHitTextToggle = null!;
private Button _buttonComponent = null!;
private void Start()
{
_buttonComponent = GetComponent<Button>();
_buttonComponent.onClick.AddListener(OnClick);
RenderMod.FixEventSystem();
if (codecDropdown == null) return;
codecDropdown.ClearOptions();
var options = System.Enum.GetNames(typeof(VideoFFmpeg.Codec)).ToList();
codecDropdown.AddOptions(options);
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "scnEditor");
}
}
public void OnClick()
{
if (IsAnyFieldEmpty()) return;
if (RenderManager.IsActive) return;
if (!double.TryParse(targetFPSInput.text, out var targetFPS) || targetFPS <= 0)
{
Melon<RenderMod>.Logger.Error("올바르지 않은 Target FPS 값입니다. 0보다 큰 숫자여야 합니다.");
return;
}
if (!double.TryParse(videoFPSInput.text, out var videoFPS) || videoFPS <= 0)
{
Melon<RenderMod>.Logger.Error("올바르지 않은 Video FPS 값입니다. 0보다 큰 숫자여야 합니다.");
return;
}
if (!int.TryParse(renderWidthInput.text, out var renderWidth) || renderWidth <= 0 || renderWidth > SystemInfo.maxTextureSize)
{
Melon<RenderMod>.Logger.Error($"올바르지 않은 Render Width 값입니다. 1에서 {SystemInfo.maxTextureSize} 사이의 정수여야 합니다.");
return;
}
if (!int.TryParse(renderHeightInput.text, out var renderHeight) || renderHeight <= 0 || renderHeight > SystemInfo.maxTextureSize)
{
Melon<RenderMod>.Logger.Error($"올바르지 않은 Render Height 값입니다. 1에서 {SystemInfo.maxTextureSize} 사이의 정수여야 합니다.");
return;
}
if (!int.TryParse(bitrateInput.text, out var bitrate) || bitrate <= 0)
{
Melon<RenderMod>.Logger.Error("올바르지 않은 Bitrate 값입니다. 0보다 큰 정수여야 합니다.");
return;
}
if (!double.TryParse(waitAfterEndInput.text, out var waitAfterEnd) || waitAfterEnd < 0)
{
Melon<RenderMod>.Logger.Error("올바르지 않은 Wait After End 값입니다. 0 이상의 숫자여야 합니다.");
return;
}
int? parsedRandomSeed = null;
var randomSeedText = randomSeedInput.text.Truncate(int.MaxValue);
if (!randomSeedText.IsNullOrEmpty())
{
if (!int.TryParse(randomSeedText, out var seedVal))
{
Melon<RenderMod>.Logger.Error("올바르지 않은 Random Seed 값입니다. 비어 있거나 정수여야 합니다.");
return;
}
parsedRandomSeed = seedVal;
}
if (RenderManager.Instance)
{
Melon<RenderMod>.Logger.Msg($"레벨 로드: {RenderManager.Instance.levelPath}");
}
var selectedCodecIndex = codecDropdown.value;
var selectedCodecName = codecDropdown.options[selectedCodecIndex].text;
var showHitText = showHitTextToggle != null && showHitTextToggle.isOn;
if (RenderManager.Instance)
{
RenderManager.Instance.Configuration = new RenderManager.RenderSettings
{
TargetFPS = targetFPS,
VideoFPS = videoFPS,
RenderWidth = renderWidth,
RenderHeight = renderHeight,
Bitrate = bitrate,
Codec = selectedCodecName,
EndWaitTime = waitAfterEnd,
ShowHitText = showHitText,
RandomSeed = parsedRandomSeed
};
}
RenderManager.Instance!.SetupCaptureDirectory();
RenderManager.Instance.SetupGameScene();
}
private bool IsAnyFieldEmpty()
{
if (string.IsNullOrWhiteSpace(targetFPSInput.text)) return true;
if (string.IsNullOrWhiteSpace(videoFPSInput.text)) return true;
if (string.IsNullOrWhiteSpace(renderWidthInput.text)) return true;
if (string.IsNullOrWhiteSpace(renderHeightInput.text)) return true;
if (string.IsNullOrWhiteSpace(bitrateInput.text)) return true;
if (string.IsNullOrWhiteSpace(waitAfterEndInput.text)) return true;
// 드롭다운은 기본적으로 항상 무언가 선택되어 있지만(0번 항목 등),
// 만약 '선택 안함(-1)' 같은 예외 처리가 필요하다면 아래처럼 검사할 수 있습니다.
return codecDropdown.value < 0;
}
}
}