SHA256
Add NonTile in Advanced Settings
This commit is contained in:
8 files changed
+225
-66
No files matched your search
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -379,7 +379,7 @@ namespace ADOFAIRenderer.Core
|
|||||||
GCS.nextSpeedRun = 1;
|
GCS.nextSpeedRun = 1;
|
||||||
GCS.customLevelIndex = 0;
|
GCS.customLevelIndex = 0;
|
||||||
|
|
||||||
if (Configuration.RandomSeed.HasValue) Random.InitState(Configuration.RandomSeed.Value);
|
if (Configuration.AdvancedConfig.RandomSeed.HasValue) Random.InitState(Configuration.AdvancedConfig.RandomSeed.Value);
|
||||||
ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "scnGame");
|
ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "scnGame");
|
||||||
skipPressToStart = true;
|
skipPressToStart = true;
|
||||||
_renderSetup = true;
|
_renderSetup = true;
|
||||||
@@ -387,7 +387,7 @@ namespace ADOFAIRenderer.Core
|
|||||||
|
|
||||||
private IEnumerator SetupPlay()
|
private IEnumerator SetupPlay()
|
||||||
{
|
{
|
||||||
if (Configuration.AudioConfig.RenderAudio && GetOutputExtension(Configuration.VideoConfig!.Codec) != ".mp4")
|
if (Configuration.AudioConfig.RenderAudio && GetOutputExtension(Configuration.VideoConfig.Codec) != ".mp4")
|
||||||
{
|
{
|
||||||
Configuration.AudioConfig.AudioSampleRate = 48000;
|
Configuration.AudioConfig.AudioSampleRate = 48000;
|
||||||
}
|
}
|
||||||
@@ -430,7 +430,7 @@ namespace ADOFAIRenderer.Core
|
|||||||
scrController.instance.levelWasSkipped = true;
|
scrController.instance.levelWasSkipped = true;
|
||||||
|
|
||||||
if (!scrConductor.instance || !scrConductor.instance.song) yield break;
|
if (!scrConductor.instance || !scrConductor.instance.song) yield break;
|
||||||
if (Configuration.ProcessAudio)
|
if (Configuration.AdvancedConfig.ProcessAudio)
|
||||||
{
|
{
|
||||||
AudioSpectrumGenerator.Initialize(scrConductor.instance.song.clip);
|
AudioSpectrumGenerator.Initialize(scrConductor.instance.song.clip);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,30 @@ namespace ADOFAIRenderer.Data
|
|||||||
{
|
{
|
||||||
configObj.Remove("AudioConfig");
|
configObj.Remove("AudioConfig");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4. legacy top-level Advanced properties -> AdvancedConfig
|
||||||
|
string[] legacyAdvancedProps = { "RandomSeed", "ProcessAudio", "NonTile" };
|
||||||
|
foreach (var prop in legacyAdvancedProps)
|
||||||
|
{
|
||||||
|
var legacyToken = configObj[prop];
|
||||||
|
if (legacyToken != null && legacyToken.Type != JTokenType.Null)
|
||||||
|
{
|
||||||
|
if (configObj["AdvancedConfig"] == null || configObj["AdvancedConfig"]!.Type == JTokenType.Null)
|
||||||
|
{
|
||||||
|
configObj["AdvancedConfig"] = new JObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
var advancedConfigObj = (JObject)configObj["AdvancedConfig"]!;
|
||||||
|
advancedConfigObj[prop] ??= legacyToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
configObj.Remove(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configObj["AdvancedConfig"] != null && configObj["AdvancedConfig"]!.Type == JTokenType.Null)
|
||||||
|
{
|
||||||
|
configObj.Remove("AdvancedConfig");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var preset = jObject.ToObject<RenderPreset>();
|
var preset = jObject.ToObject<RenderPreset>();
|
||||||
|
|||||||
@@ -10,14 +10,19 @@ namespace ADOFAIRenderer.Data
|
|||||||
public int RenderWidth { get; set; }
|
public int RenderWidth { get; set; }
|
||||||
public int RenderHeight { get; set; }
|
public int RenderHeight { get; set; }
|
||||||
|
|
||||||
public VideoEncodingConfig VideoConfig { get; set; } = new VideoEncodingConfig();
|
public VideoEncodingConfig VideoConfig { get; set; } = new();
|
||||||
public AudioEncodingConfig AudioConfig { get; set; } = new AudioEncodingConfig();
|
public AudioEncodingConfig AudioConfig { get; set; } = new();
|
||||||
|
public AdvancedConfig AdvancedConfig { get; set; } = new();
|
||||||
|
|
||||||
public double DelayAfterLevelEnd { get; set; }
|
public double DelayAfterLevelEnd { get; set; }
|
||||||
public bool ShowJudgementText { get; set; }
|
public bool ShowJudgementText { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AdvancedConfig
|
||||||
|
{
|
||||||
public int? RandomSeed { get; set; } = null;
|
public int? RandomSeed { get; set; } = null;
|
||||||
public bool ProcessAudio { get; set; }
|
public bool ProcessAudio { get; set; } = true;
|
||||||
|
public bool NonTile { get; set; } = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VideoEncodingConfig
|
public class VideoEncodingConfig
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ namespace ADOFAIRenderer.Patch.Engine
|
|||||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||||
public static bool Prefix(AudioSource __instance, float[] samples, int channel, FFTWindow window)
|
public static bool Prefix(AudioSource __instance, float[] samples, int channel, FFTWindow window)
|
||||||
{
|
{
|
||||||
if (!RenderManager.IsCapturingActive || !RenderPatch || !RenderManager.Instance.Configuration.ProcessAudio) return true;
|
if (!RenderManager.IsCapturingActive || !RenderPatch || !RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio) return true;
|
||||||
AudioSpectrumGenerator.GetSpectrumData(samples, channel, window);
|
AudioSpectrumGenerator.GetSpectrumData(samples, channel, window);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ namespace ADOFAIRenderer.Patch.Engine
|
|||||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||||
public static void Prefix(ref bool stream)
|
public static void Prefix(ref bool stream)
|
||||||
{
|
{
|
||||||
if (RenderManager.Instance && RenderManager.Instance.OverrideLoading && RenderManager.Instance.Configuration.ProcessAudio)
|
if (RenderManager.Instance && RenderManager.Instance.OverrideLoading && RenderManager.Instance.Configuration.AdvancedConfig.ProcessAudio)
|
||||||
stream = false;
|
stream = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+188
-58
@@ -24,6 +24,9 @@ namespace ADOFAIRenderer.UI
|
|||||||
private Button _audioEncodingConfigButton = null!;
|
private Button _audioEncodingConfigButton = null!;
|
||||||
private VisualElement _audioEncodingConfigContainer = null!;
|
private VisualElement _audioEncodingConfigContainer = null!;
|
||||||
|
|
||||||
|
private Button _advancedSettingsButton = null!;
|
||||||
|
private VisualElement? _advancedConfigContainer;
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
_root = uiDocument.rootVisualElement;
|
_root = uiDocument.rootVisualElement;
|
||||||
@@ -84,6 +87,161 @@ namespace ADOFAIRenderer.UI
|
|||||||
{
|
{
|
||||||
Melon<RenderMod>.Logger.Error("Button 'PresetSettingsButton'을(를) 찾을 수 없습니다.");
|
Melon<RenderMod>.Logger.Error("Button 'PresetSettingsButton'을(를) 찾을 수 없습니다.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_advancedSettingsButton = _root.Q<Button>("AdvancedSettingsButton");
|
||||||
|
if (_advancedSettingsButton == null)
|
||||||
|
{
|
||||||
|
var bottomRow = CreateRow();
|
||||||
|
bottomRow.pickingMode = PickingMode.Ignore;
|
||||||
|
bottomRow.style.position = Position.Absolute;
|
||||||
|
bottomRow.style.right = 0f;
|
||||||
|
bottomRow.style.bottom = 0f;
|
||||||
|
bottomRow.style.justifyContent = Justify.FlexEnd;
|
||||||
|
|
||||||
|
_advancedSettingsButton = new Button { name = "AdvancedSettingsButton", text = "고급 설정..." };
|
||||||
|
bottomRow.Add(_advancedSettingsButton);
|
||||||
|
|
||||||
|
var targetContainer = _root.childCount > 0 ? _root[0] : _root;
|
||||||
|
targetContainer.Add(bottomRow);
|
||||||
|
Melon<RenderMod>.Logger.Msg("[UI] AdvancedSettingsButton 동적 생성 완료.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_advancedSettingsButton.text = "고급 설정...";
|
||||||
|
Melon<RenderMod>.Logger.Msg($"[UI] AdvancedSettingsButton 발견: pickingMode={_advancedSettingsButton.pickingMode}, enabledSelf={_advancedSettingsButton.enabledSelf}");
|
||||||
|
}
|
||||||
|
|
||||||
|
_advancedSettingsButton.RegisterCallback<ClickEvent>(_ => OpenAdvancedConfig());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenAdvancedConfig()
|
||||||
|
{
|
||||||
|
var config = RenderManager.Instance.Configuration;
|
||||||
|
config.AdvancedConfig ??= GenerateAdvancedConfig();
|
||||||
|
|
||||||
|
var tempConfig = new AdvancedConfig
|
||||||
|
{
|
||||||
|
ProcessAudio = config.AdvancedConfig.ProcessAudio,
|
||||||
|
RandomSeed = config.AdvancedConfig.RandomSeed,
|
||||||
|
NonTile = config.AdvancedConfig.NonTile
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_advancedConfigContainer != null && _root.Contains(_advancedConfigContainer))
|
||||||
|
{
|
||||||
|
_root.Remove(_advancedConfigContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
_advancedConfigContainer = new VisualElement
|
||||||
|
{
|
||||||
|
name = "AdvancedSettingsContainer",
|
||||||
|
style =
|
||||||
|
{
|
||||||
|
position = Position.Absolute,
|
||||||
|
width = Length.Percent(100),
|
||||||
|
height = Length.Percent(100),
|
||||||
|
left = 0,
|
||||||
|
top = 0,
|
||||||
|
backgroundColor = new StyleColor(new Color(0.15f, 0.15f, 0.15f, 1.0f)),
|
||||||
|
justifyContent = Justify.Center,
|
||||||
|
alignItems = Align.Center
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 1. 타이틀 로우
|
||||||
|
var titleRow = CreateRow();
|
||||||
|
var titleLabel = new Label("고급 설정")
|
||||||
|
{
|
||||||
|
style =
|
||||||
|
{
|
||||||
|
fontSize = 24,
|
||||||
|
color = new StyleColor(Color.white)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
titleRow.Add(titleLabel);
|
||||||
|
_advancedConfigContainer.Add(titleRow);
|
||||||
|
|
||||||
|
// 2. 오디오 처리 로우
|
||||||
|
var processAudioRow = CreateRow();
|
||||||
|
var processAudioLabel = CreateFormLabel("오디오 처리");
|
||||||
|
var processAudioToggle = new Toggle { name = "AdvancedProcessAudioToggle", label = "", value = tempConfig.ProcessAudio };
|
||||||
|
processAudioRow.Add(processAudioLabel);
|
||||||
|
processAudioRow.Add(processAudioToggle);
|
||||||
|
_advancedConfigContainer.Add(processAudioRow);
|
||||||
|
|
||||||
|
// 3. 논타일 모드 로우
|
||||||
|
var nonTileRow = CreateRow();
|
||||||
|
var nonTileLabel = CreateFormLabel("논타일 모드");
|
||||||
|
var nonTileToggle = new Toggle { name = "AdvancedNonTileToggle", label = "", value = tempConfig.NonTile };
|
||||||
|
nonTileRow.Add(nonTileLabel);
|
||||||
|
nonTileRow.Add(nonTileToggle);
|
||||||
|
_advancedConfigContainer.Add(nonTileRow);
|
||||||
|
|
||||||
|
// 4. 랜덤 시드 로우
|
||||||
|
var randomSeedRow = CreateRow();
|
||||||
|
var randomSeedLabel = CreateFormLabel("랜덤 시드 (입력 선택)");
|
||||||
|
var randomSeedField = new IntegerField { name = "AdvancedRandomSeed", label = "", value = tempConfig.RandomSeed ?? 0 };
|
||||||
|
|
||||||
|
if (!tempConfig.RandomSeed.HasValue)
|
||||||
|
{
|
||||||
|
var textProperty = typeof(IntegerField).GetProperty("text", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy);
|
||||||
|
if (textProperty == null)
|
||||||
|
{
|
||||||
|
textProperty = typeof(TextInputBaseField<int>).GetProperty("text", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy);
|
||||||
|
}
|
||||||
|
textProperty?.SetValue(randomSeedField, string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
randomSeedRow.Add(randomSeedLabel);
|
||||||
|
randomSeedRow.Add(randomSeedField);
|
||||||
|
_advancedConfigContainer.Add(randomSeedRow);
|
||||||
|
|
||||||
|
// 5. 제어 버튼 로우 (취소 / 저장)
|
||||||
|
var buttonRow = CreateRow();
|
||||||
|
var cancelBtn = new Button { text = "취소" };
|
||||||
|
var saveBtn = new Button { text = "저장" };
|
||||||
|
|
||||||
|
buttonRow.Add(cancelBtn);
|
||||||
|
buttonRow.Add(saveBtn);
|
||||||
|
_advancedConfigContainer.Add(buttonRow);
|
||||||
|
|
||||||
|
cancelBtn.RegisterCallback<ClickEvent>(_ =>
|
||||||
|
{
|
||||||
|
ToggleAdvancedScreens(false);
|
||||||
|
_root.Remove(_advancedConfigContainer);
|
||||||
|
_advancedConfigContainer = null!;
|
||||||
|
});
|
||||||
|
|
||||||
|
saveBtn.RegisterCallback<ClickEvent>(_ =>
|
||||||
|
{
|
||||||
|
tempConfig.ProcessAudio = processAudioToggle.value;
|
||||||
|
tempConfig.NonTile = nonTileToggle.value;
|
||||||
|
if (!string.IsNullOrEmpty(randomSeedField.text))
|
||||||
|
{
|
||||||
|
tempConfig.RandomSeed = randomSeedField.value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tempConfig.RandomSeed = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
config.AdvancedConfig = tempConfig;
|
||||||
|
|
||||||
|
ToggleAdvancedScreens(false);
|
||||||
|
_root.Remove(_advancedConfigContainer);
|
||||||
|
_advancedConfigContainer = null!;
|
||||||
|
});
|
||||||
|
|
||||||
|
_root.Add(_advancedConfigContainer);
|
||||||
|
ToggleAdvancedScreens(true);
|
||||||
|
|
||||||
|
void ToggleAdvancedScreens(bool showAdvanced)
|
||||||
|
{
|
||||||
|
if (_root.childCount > 0)
|
||||||
|
{
|
||||||
|
_root[0].style.display = showAdvanced ? DisplayStyle.None : DisplayStyle.Flex;
|
||||||
|
}
|
||||||
|
_advancedConfigContainer.style.display = showAdvanced ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
@@ -149,7 +307,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
var codecRow = CreateRow();
|
var codecRow = CreateRow();
|
||||||
var codecLabel = CreateFormLabel("코덱");
|
var codecLabel = CreateFormLabel("코덱");
|
||||||
var codecChoices = new List<string>(System.Enum.GetNames(typeof(Codec)));
|
var codecChoices = new List<string>(System.Enum.GetNames(typeof(Codec)));
|
||||||
var codecDropdown = new DropdownField(codecChoices, tempConfig.Codec.ToString());
|
var codecDropdown = new DropdownField(codecChoices, tempConfig.Codec.ToString()) { name = "VideoCodec" };
|
||||||
codecRow.Add(codecLabel);
|
codecRow.Add(codecLabel);
|
||||||
codecRow.Add(codecDropdown);
|
codecRow.Add(codecDropdown);
|
||||||
_videoEncodingConfigContainer.Add(codecRow);
|
_videoEncodingConfigContainer.Add(codecRow);
|
||||||
@@ -158,7 +316,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
var modeRow = CreateRow();
|
var modeRow = CreateRow();
|
||||||
var modeLabel = CreateFormLabel("모드");
|
var modeLabel = CreateFormLabel("모드");
|
||||||
var modeChoices = new List<string>(System.Enum.GetNames(typeof(RateControlMode)));
|
var modeChoices = new List<string>(System.Enum.GetNames(typeof(RateControlMode)));
|
||||||
var modeDropdown = new DropdownField(modeChoices, tempConfig.RateControlMode.ToString());
|
var modeDropdown = new DropdownField(modeChoices, tempConfig.RateControlMode.ToString()) { name = "VideoRateControlMode" };
|
||||||
modeRow.Add(modeLabel);
|
modeRow.Add(modeLabel);
|
||||||
modeRow.Add(modeDropdown);
|
modeRow.Add(modeDropdown);
|
||||||
_videoEncodingConfigContainer.Add(modeRow);
|
_videoEncodingConfigContainer.Add(modeRow);
|
||||||
@@ -166,7 +324,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 5. 비트레이트 로우
|
// 5. 비트레이트 로우
|
||||||
var bitrateRow = CreateRow();
|
var bitrateRow = CreateRow();
|
||||||
var bitrateLabel = CreateFormLabel("비트레이트(kbps)");
|
var bitrateLabel = CreateFormLabel("비트레이트(kbps)");
|
||||||
var bitrateField = new IntegerField { name = "EncodingBitrate", label = "", value = tempConfig.Bitrate };
|
var bitrateField = new IntegerField { name = "VideoBitrate", label = "", value = tempConfig.Bitrate };
|
||||||
bitrateRow.Add(bitrateLabel);
|
bitrateRow.Add(bitrateLabel);
|
||||||
bitrateRow.Add(bitrateField);
|
bitrateRow.Add(bitrateField);
|
||||||
_videoEncodingConfigContainer.Add(bitrateRow);
|
_videoEncodingConfigContainer.Add(bitrateRow);
|
||||||
@@ -174,7 +332,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 5.5. 최대 비트레이트 로우 (VBR 전용)
|
// 5.5. 최대 비트레이트 로우 (VBR 전용)
|
||||||
var maxBitrateRow = CreateRow();
|
var maxBitrateRow = CreateRow();
|
||||||
var maxBitrateLabel = CreateFormLabel("최대 비트레이트(kbps)");
|
var maxBitrateLabel = CreateFormLabel("최대 비트레이트(kbps)");
|
||||||
var maxBitrateField = new IntegerField { name = "EncodingMaxBitrate", label = "", value = tempConfig.MaxBitrate };
|
var maxBitrateField = new IntegerField { name = "VideoMaxBitrate", label = "", value = tempConfig.MaxBitrate };
|
||||||
maxBitrateRow.Add(maxBitrateLabel);
|
maxBitrateRow.Add(maxBitrateLabel);
|
||||||
maxBitrateRow.Add(maxBitrateField);
|
maxBitrateRow.Add(maxBitrateField);
|
||||||
_videoEncodingConfigContainer.Add(maxBitrateRow);
|
_videoEncodingConfigContainer.Add(maxBitrateRow);
|
||||||
@@ -182,7 +340,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 6. QP 로우
|
// 6. QP 로우
|
||||||
var qpRow = CreateRow();
|
var qpRow = CreateRow();
|
||||||
var qpLabel = CreateFormLabel("품질 (QP)");
|
var qpLabel = CreateFormLabel("품질 (QP)");
|
||||||
var qpField = new IntegerField { name = "EncodingQP", label = "", value = tempConfig.QP };
|
var qpField = new IntegerField { name = "VideoQP", label = "", value = tempConfig.QP };
|
||||||
qpRow.Add(qpLabel);
|
qpRow.Add(qpLabel);
|
||||||
qpRow.Add(qpField);
|
qpRow.Add(qpField);
|
||||||
_videoEncodingConfigContainer.Add(qpRow);
|
_videoEncodingConfigContainer.Add(qpRow);
|
||||||
@@ -190,7 +348,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 6.5. 키프레임 간격 로우 (초 단위)
|
// 6.5. 키프레임 간격 로우 (초 단위)
|
||||||
var keyframeRow = CreateRow();
|
var keyframeRow = CreateRow();
|
||||||
var keyframeLabel = CreateFormLabel("키프레임 간격(초)");
|
var keyframeLabel = CreateFormLabel("키프레임 간격(초)");
|
||||||
var keyframeField = new DoubleField { name = "EncodingKeyframeInterval", label = "", value = tempConfig.KeyframeInterval };
|
var keyframeField = new DoubleField { name = "VideoKeyframeInterval", label = "", value = tempConfig.KeyframeInterval };
|
||||||
keyframeRow.Add(keyframeLabel);
|
keyframeRow.Add(keyframeLabel);
|
||||||
keyframeRow.Add(keyframeField);
|
keyframeRow.Add(keyframeField);
|
||||||
_videoEncodingConfigContainer.Add(keyframeRow);
|
_videoEncodingConfigContainer.Add(keyframeRow);
|
||||||
@@ -198,7 +356,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 6.75. 강제 소프트웨어 인코더 로우 (라벨 + 토글)
|
// 6.75. 강제 소프트웨어 인코더 로우 (라벨 + 토글)
|
||||||
var forceSoftwareRow = CreateRow();
|
var forceSoftwareRow = CreateRow();
|
||||||
var forceSoftwareLabel = CreateFormLabel("소프트웨어 인코더");
|
var forceSoftwareLabel = CreateFormLabel("소프트웨어 인코더");
|
||||||
var forceSoftwareToggle = new Toggle { name = "ForceSoftwareEncoder", label = "", value = tempConfig.ForceSoftwareEncoder };
|
var forceSoftwareToggle = new Toggle { name = "VideoForceSoftwareEncoderToggle", label = "", value = tempConfig.ForceSoftwareEncoder };
|
||||||
forceSoftwareRow.Add(forceSoftwareLabel);
|
forceSoftwareRow.Add(forceSoftwareLabel);
|
||||||
forceSoftwareRow.Add(forceSoftwareToggle);
|
forceSoftwareRow.Add(forceSoftwareToggle);
|
||||||
_videoEncodingConfigContainer.Add(forceSoftwareRow);
|
_videoEncodingConfigContainer.Add(forceSoftwareRow);
|
||||||
@@ -224,13 +382,13 @@ namespace ADOFAIRenderer.UI
|
|||||||
|
|
||||||
var encodingValidator = new IntegerInputValidator(_videoEncodingConfigContainer);
|
var encodingValidator = new IntegerInputValidator(_videoEncodingConfigContainer);
|
||||||
encodingValidator
|
encodingValidator
|
||||||
.AddLimits("EncodingBitrate", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 1000000))
|
.AddLimits("VideoBitrate", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 1000000))
|
||||||
.AddLimits("EncodingMaxBitrate", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 1000000))
|
.AddLimits("VideoMaxBitrate", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 1000000))
|
||||||
.AddLimits("EncodingQP", new RangeIntegerLimit(0, 51));
|
.AddLimits("VideoQP", new RangeIntegerLimit(0, 51));
|
||||||
encodingValidator.SetupValidation();
|
encodingValidator.SetupValidation();
|
||||||
|
|
||||||
var doubleValidator = new DoubleInputValidator(_videoEncodingConfigContainer);
|
var doubleValidator = new DoubleInputValidator(_videoEncodingConfigContainer);
|
||||||
doubleValidator.AddLimits("EncodingKeyframeInterval", new PositiveOnlyDoubleLimit(), new RangeDoubleLimit(0.1, 60.0));
|
doubleValidator.AddLimits("VideoKeyframeInterval", new PositiveOnlyDoubleLimit(), new RangeDoubleLimit(0.1, 60.0));
|
||||||
doubleValidator.SetupValidation();
|
doubleValidator.SetupValidation();
|
||||||
|
|
||||||
modeDropdown.RegisterValueChangedCallback(evt => UpdateVisibility(evt.newValue));
|
modeDropdown.RegisterValueChangedCallback(evt => UpdateVisibility(evt.newValue));
|
||||||
@@ -364,7 +522,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
// 2. 오디오 렌더링 활성화 로우 (라벨 + 토글)
|
// 2. 오디오 렌더링 활성화 로우 (라벨 + 토글)
|
||||||
var renderAudioRow = CreateRow();
|
var renderAudioRow = CreateRow();
|
||||||
var renderAudioLabel = CreateFormLabel("오디오 렌더링 활성화");
|
var renderAudioLabel = CreateFormLabel("오디오 렌더링 활성화");
|
||||||
var renderAudioToggle = new Toggle { name = "RenderAudioToggle", label = "", value = tempAudioConfig.RenderAudio };
|
var renderAudioToggle = new Toggle { name = "AudioRenderAudioToggle", label = "", value = tempAudioConfig.RenderAudio };
|
||||||
renderAudioRow.Add(renderAudioLabel);
|
renderAudioRow.Add(renderAudioLabel);
|
||||||
renderAudioRow.Add(renderAudioToggle);
|
renderAudioRow.Add(renderAudioToggle);
|
||||||
_audioEncodingConfigContainer.Add(renderAudioRow);
|
_audioEncodingConfigContainer.Add(renderAudioRow);
|
||||||
@@ -380,7 +538,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
var sampleRateDropdown = new DropdownField(
|
var sampleRateDropdown = new DropdownField(
|
||||||
new List<string> { "44100", "48000" },
|
new List<string> { "44100", "48000" },
|
||||||
sampleRateStr
|
sampleRateStr
|
||||||
);
|
) { name = "AudioSampleRate" };
|
||||||
sampleRateRow.Add(sampleRateLabel);
|
sampleRateRow.Add(sampleRateLabel);
|
||||||
sampleRateRow.Add(sampleRateDropdown);
|
sampleRateRow.Add(sampleRateDropdown);
|
||||||
_audioEncodingConfigContainer.Add(sampleRateRow);
|
_audioEncodingConfigContainer.Add(sampleRateRow);
|
||||||
@@ -391,7 +549,7 @@ namespace ADOFAIRenderer.UI
|
|||||||
var channelsDropdown = new DropdownField(
|
var channelsDropdown = new DropdownField(
|
||||||
new List<string> { "1 (Mono)", "2 (Stereo)" },
|
new List<string> { "1 (Mono)", "2 (Stereo)" },
|
||||||
tempAudioConfig.AudioChannels == 1 ? "1 (Mono)" : "2 (Stereo)"
|
tempAudioConfig.AudioChannels == 1 ? "1 (Mono)" : "2 (Stereo)"
|
||||||
);
|
) { name = "AudioChannels" };
|
||||||
channelsRow.Add(channelsLabel);
|
channelsRow.Add(channelsLabel);
|
||||||
channelsRow.Add(channelsDropdown);
|
channelsRow.Add(channelsDropdown);
|
||||||
_audioEncodingConfigContainer.Add(channelsRow);
|
_audioEncodingConfigContainer.Add(channelsRow);
|
||||||
@@ -478,13 +636,10 @@ namespace ADOFAIRenderer.UI
|
|||||||
|
|
||||||
var widthField = _root.Q<IntegerField>("RenderWidth");
|
var widthField = _root.Q<IntegerField>("RenderWidth");
|
||||||
var heightField = _root.Q<IntegerField>("RenderHeight");
|
var heightField = _root.Q<IntegerField>("RenderHeight");
|
||||||
var randomSeedField = _root.Q<IntegerField>("RandomSeed");
|
|
||||||
var renderFpsField = _root.Q<DoubleField>("RenderFPS");
|
var renderFpsField = _root.Q<DoubleField>("RenderFPS");
|
||||||
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
||||||
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
||||||
|
|
||||||
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
||||||
var processAudio = _root.Q<Toggle>("ProcessAudioToggle");
|
|
||||||
|
|
||||||
// Copy validated values to Configuration manually
|
// Copy validated values to Configuration manually
|
||||||
var config = RenderManager.Instance.Configuration;
|
var config = RenderManager.Instance.Configuration;
|
||||||
@@ -494,16 +649,12 @@ namespace ADOFAIRenderer.UI
|
|||||||
config.VideoFPS = videoFpsField.value;
|
config.VideoFPS = videoFpsField.value;
|
||||||
config.DelayAfterLevelEnd = delayField.value;
|
config.DelayAfterLevelEnd = delayField.value;
|
||||||
|
|
||||||
config.ShowJudgementText = showJudgementText.value;
|
if (showJudgementText != null)
|
||||||
config.ProcessAudio = processAudio.value;
|
config.ShowJudgementText = showJudgementText.value;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(randomSeedField.text))
|
|
||||||
config.RandomSeed = randomSeedField.value;
|
|
||||||
else
|
|
||||||
config.RandomSeed = null;
|
|
||||||
|
|
||||||
RenderManager.Instance.Configuration.VideoConfig ??= GenerateEncodingConfig();
|
RenderManager.Instance.Configuration.VideoConfig ??= GenerateEncodingConfig();
|
||||||
RenderManager.Instance.Configuration.AudioConfig ??= GenerateAudioEncodingConfig();
|
RenderManager.Instance.Configuration.AudioConfig ??= GenerateAudioEncodingConfig();
|
||||||
|
RenderManager.Instance.Configuration.AdvancedConfig ??= GenerateAdvancedConfig();
|
||||||
|
|
||||||
RenderManager.Instance.SetupCaptureDirectory();
|
RenderManager.Instance.SetupCaptureDirectory();
|
||||||
RenderManager.Instance.SetupGameScene();
|
RenderManager.Instance.SetupGameScene();
|
||||||
@@ -542,12 +693,10 @@ namespace ADOFAIRenderer.UI
|
|||||||
{
|
{
|
||||||
var widthField = _root.Q<IntegerField>("RenderWidth");
|
var widthField = _root.Q<IntegerField>("RenderWidth");
|
||||||
var heightField = _root.Q<IntegerField>("RenderHeight");
|
var heightField = _root.Q<IntegerField>("RenderHeight");
|
||||||
var randomSeedField = _root.Q<IntegerField>("RandomSeed");
|
|
||||||
var renderFpsField = _root.Q<DoubleField>("RenderFPS");
|
var renderFpsField = _root.Q<DoubleField>("RenderFPS");
|
||||||
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
||||||
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
||||||
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
||||||
var processAudio = _root.Q<Toggle>("ProcessAudioToggle");
|
|
||||||
|
|
||||||
if (widthField != null) widthField.value = config.RenderWidth;
|
if (widthField != null) widthField.value = config.RenderWidth;
|
||||||
if (heightField != null) heightField.value = config.RenderHeight;
|
if (heightField != null) heightField.value = config.RenderHeight;
|
||||||
@@ -555,28 +704,10 @@ namespace ADOFAIRenderer.UI
|
|||||||
if (videoFpsField != null) videoFpsField.value = config.VideoFPS;
|
if (videoFpsField != null) videoFpsField.value = config.VideoFPS;
|
||||||
if (delayField != null) delayField.value = config.DelayAfterLevelEnd;
|
if (delayField != null) delayField.value = config.DelayAfterLevelEnd;
|
||||||
if (showJudgementText != null) showJudgementText.value = config.ShowJudgementText;
|
if (showJudgementText != null) showJudgementText.value = config.ShowJudgementText;
|
||||||
if (processAudio != null) processAudio.value = config.ProcessAudio;
|
|
||||||
|
|
||||||
if (randomSeedField != null)
|
|
||||||
{
|
|
||||||
if (config.RandomSeed.HasValue)
|
|
||||||
{
|
|
||||||
randomSeedField.value = config.RandomSeed.Value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
randomSeedField.value = 0;
|
|
||||||
var textProperty = typeof(IntegerField).GetProperty("text", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy);
|
|
||||||
if (textProperty == null)
|
|
||||||
{
|
|
||||||
textProperty = typeof(TextInputBaseField<int>).GetProperty("text", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy);
|
|
||||||
}
|
|
||||||
textProperty?.SetValue(randomSeedField, string.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config.VideoConfig ??= GenerateEncodingConfig();
|
config.VideoConfig ??= GenerateEncodingConfig();
|
||||||
config.AudioConfig ??= GenerateAudioEncodingConfig();
|
config.AudioConfig ??= GenerateAudioEncodingConfig();
|
||||||
|
config.AdvancedConfig ??= GenerateAdvancedConfig();
|
||||||
|
|
||||||
RenderManager.Instance.Configuration = config;
|
RenderManager.Instance.Configuration = config;
|
||||||
}
|
}
|
||||||
@@ -906,8 +1037,6 @@ namespace ADOFAIRenderer.UI
|
|||||||
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
var videoFpsField = _root.Q<DoubleField>("VideoFPS");
|
||||||
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
var delayField = _root.Q<DoubleField>("DelayAfterLevelEnd");
|
||||||
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
var showJudgementText = _root.Q<Toggle>("ShowJudgementText");
|
||||||
var processAudio = _root.Q<Toggle>("ProcessAudioToggle");
|
|
||||||
var randomSeedField = _root.Q<IntegerField>("RandomSeed");
|
|
||||||
|
|
||||||
var currentConfig = new RenderConfig
|
var currentConfig = new RenderConfig
|
||||||
{
|
{
|
||||||
@@ -916,21 +1045,12 @@ namespace ADOFAIRenderer.UI
|
|||||||
RenderFPS = renderFpsField.value,
|
RenderFPS = renderFpsField.value,
|
||||||
VideoFPS = videoFpsField.value,
|
VideoFPS = videoFpsField.value,
|
||||||
DelayAfterLevelEnd = delayField.value,
|
DelayAfterLevelEnd = delayField.value,
|
||||||
ShowJudgementText = showJudgementText.value,
|
ShowJudgementText = showJudgementText?.value ?? true
|
||||||
ProcessAudio = processAudio.value
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(randomSeedField.text))
|
|
||||||
{
|
|
||||||
currentConfig.RandomSeed = randomSeedField.value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentConfig.RandomSeed = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentConfig.VideoConfig = RenderManager.Instance.Configuration.VideoConfig ?? GenerateEncodingConfig();
|
currentConfig.VideoConfig = RenderManager.Instance.Configuration.VideoConfig ?? GenerateEncodingConfig();
|
||||||
currentConfig.AudioConfig = RenderManager.Instance.Configuration.AudioConfig ?? GenerateAudioEncodingConfig();
|
currentConfig.AudioConfig = RenderManager.Instance.Configuration.AudioConfig ?? GenerateAudioEncodingConfig();
|
||||||
|
currentConfig.AdvancedConfig = RenderManager.Instance.Configuration.AdvancedConfig ?? GenerateAdvancedConfig();
|
||||||
|
|
||||||
PresetManager.SavePreset(presetName, currentConfig);
|
PresetManager.SavePreset(presetName, currentConfig);
|
||||||
nameField.value = string.Empty;
|
nameField.value = string.Empty;
|
||||||
@@ -1032,5 +1152,15 @@ namespace ADOFAIRenderer.UI
|
|||||||
AudioBitrate = 256000
|
AudioBitrate = 256000
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AdvancedConfig GenerateAdvancedConfig()
|
||||||
|
{
|
||||||
|
return new AdvancedConfig
|
||||||
|
{
|
||||||
|
ProcessAudio = true,
|
||||||
|
RandomSeed = null,
|
||||||
|
NonTile = false
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user