SHA256
forked from ADOFAIEditorForum/ADOFAIRenderer
Add Expiration Date
This commit is contained in:
2 files changed
+38
-34
No files matched your search
+5
-2
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using ADOFAIRenderer;
|
using ADOFAIRenderer;
|
||||||
using ADOFAIRenderer.Core;
|
using ADOFAIRenderer.Core;
|
||||||
using ADOFAIRenderer.Util;
|
using ADOFAIRenderer.Util;
|
||||||
@@ -6,8 +7,9 @@ using MelonLoader;
|
|||||||
using MelonLoader.Utils;
|
using MelonLoader.Utils;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
|
using Object = UnityEngine.Object;
|
||||||
|
|
||||||
[assembly: MelonInfo(typeof(RenderMod), "ADOFAI Renderer", "0.1.2-INDEV", "ADOFAI Editor Forum")]
|
[assembly: MelonInfo(typeof(RenderMod), "ADOFAI Renderer", "0.3.2-BETA", "ADOFAI Editor Forum")]
|
||||||
[assembly: MelonGame("7th Beat Games", "A Dance of Fire and Ice")]
|
[assembly: MelonGame("7th Beat Games", "A Dance of Fire and Ice")]
|
||||||
|
|
||||||
namespace ADOFAIRenderer
|
namespace ADOFAIRenderer
|
||||||
@@ -21,6 +23,7 @@ namespace ADOFAIRenderer
|
|||||||
public static AssetBundle ShaderBundle = null!;
|
public static AssetBundle ShaderBundle = null!;
|
||||||
public static ComputeShader ColorConversionShader = null!;
|
public static ComputeShader ColorConversionShader = null!;
|
||||||
public static bool IsFeatureDisabled = false;
|
public static bool IsFeatureDisabled = false;
|
||||||
|
public static DateTime ExpirationTime = new(2026, 09, 21, 0, 0, 0, DateTimeKind.Utc);
|
||||||
|
|
||||||
public override void OnInitializeMelon()
|
public override void OnInitializeMelon()
|
||||||
{
|
{
|
||||||
@@ -47,7 +50,7 @@ namespace ADOFAIRenderer
|
|||||||
ColorConversionShader = ShaderBundle.LoadAsset<ComputeShader>("ColorConversion");
|
ColorConversionShader = ShaderBundle.LoadAsset<ComputeShader>("ColorConversion");
|
||||||
Melon<RenderMod>.Logger.Msg("컬러 변환 Compute Shader 로드 완료.");
|
Melon<RenderMod>.Logger.Msg("컬러 변환 Compute Shader 로드 완료.");
|
||||||
}
|
}
|
||||||
catch (System.Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Melon<RenderMod>.Logger.Warning($"Shader 에셋번들을 로드할 수 없습니다. GPU 컬러 변환이 비활성화되며 CPU로 폴백합니다. 에러: {ex.Message}");
|
Melon<RenderMod>.Logger.Warning($"Shader 에셋번들을 로드할 수 없습니다. GPU 컬러 변환이 비활성화되며 CPU로 폴백합니다. 에러: {ex.Message}");
|
||||||
}
|
}
|
||||||
|
|||||||
+33
-32
@@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using ADOFAIRenderer.Core;
|
using ADOFAIRenderer.Core;
|
||||||
using ADOFAIRenderer.Data;
|
using ADOFAIRenderer.Data;
|
||||||
@@ -6,6 +7,7 @@ using ADOFAIRenderer.Util.FFmpeg;
|
|||||||
using MelonLoader;
|
using MelonLoader;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UIElements;
|
using UnityEngine.UIElements;
|
||||||
|
using UnityEngine.UIElements.Experimental;
|
||||||
|
|
||||||
namespace ADOFAIRenderer.UI;
|
namespace ADOFAIRenderer.UI;
|
||||||
|
|
||||||
@@ -90,9 +92,6 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
Melon<RenderMod>.Logger.Error("Button 'PresetSettingsButton'을(를) 찾을 수 없습니다.");
|
Melon<RenderMod>.Logger.Error("Button 'PresetSettingsButton'을(를) 찾을 수 없습니다.");
|
||||||
}
|
}
|
||||||
|
|
||||||
_advancedSettingsButton = _root.Q<Button>("AdvancedSettingsButton");
|
|
||||||
if (_advancedSettingsButton == null)
|
|
||||||
{
|
|
||||||
var bottomRow = CreateRow();
|
var bottomRow = CreateRow();
|
||||||
bottomRow.pickingMode = PickingMode.Ignore;
|
bottomRow.pickingMode = PickingMode.Ignore;
|
||||||
bottomRow.style.position = Position.Absolute;
|
bottomRow.style.position = Position.Absolute;
|
||||||
@@ -103,25 +102,19 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
_advancedSettingsButton = new Button { name = "AdvancedSettingsButton", text = "고급 설정..." };
|
_advancedSettingsButton = new Button { name = "AdvancedSettingsButton", text = "고급 설정..." };
|
||||||
bottomRow.Add(_advancedSettingsButton);
|
bottomRow.Add(_advancedSettingsButton);
|
||||||
|
|
||||||
var targetContainer = _root.childCount > 0 ? _root[0] : _root;
|
(_root.childCount > 0 ? _root[0] : _root).Add(bottomRow);
|
||||||
targetContainer.Add(bottomRow);
|
|
||||||
Melon<RenderMod>.Logger.Msg("[UI] AdvancedSettingsButton 동적 생성 완료.");
|
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());
|
_advancedSettingsButton.RegisterCallback<ClickEvent>(_ => OpenAdvancedConfig());
|
||||||
|
|
||||||
_versionLabel = _root.Q<Label>("VersionLabel");
|
var versionText =
|
||||||
if (_versionLabel == null)
|
$"<link='open_git'>ADOFAIRenderer v{Melon<RenderMod>.Instance.Info.Version}</link>";
|
||||||
{
|
if (DateTime.UtcNow >= RenderMod.ExpirationTime) versionText += " (Expired)";
|
||||||
_versionLabel = new Label($"<a href=\"https://git.yunizun.org/ADOFAIEditorForum/ADOFAIRenderer\">ADOFAIRenderer v{Melon<RenderMod>.Instance.Info.Version}</a>")
|
|
||||||
|
_versionLabel = new Label(versionText)
|
||||||
{
|
{
|
||||||
name = "VersionLabel",
|
name = "VersionLabel",
|
||||||
pickingMode = PickingMode.Ignore,
|
pickingMode = PickingMode.Position,
|
||||||
style =
|
style =
|
||||||
{
|
{
|
||||||
position = Position.Absolute,
|
position = Position.Absolute,
|
||||||
@@ -133,7 +126,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 기존 UI와 동일한 나눔스퀘어 폰트 적용
|
// 기존 UI와 동일한 폰트 적용
|
||||||
if (RenderMod.FontBundle)
|
if (RenderMod.FontBundle)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -144,16 +137,11 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
catch { /* ignored */ }
|
catch { /* ignored */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
var targetContainer = _root.childCount > 0 ? _root[0] : _root;
|
_versionLabel.RegisterCallback<PointerUpLinkTagEvent>(OnLinkTagClicked);
|
||||||
targetContainer.Add(_versionLabel);
|
|
||||||
|
(_root.childCount > 0 ? _root[0] : _root).Add(_versionLabel);
|
||||||
Melon<RenderMod>.Logger.Msg("[UI] VersionLabel 동적 생성 완료.");
|
Melon<RenderMod>.Logger.Msg("[UI] VersionLabel 동적 생성 완료.");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
_versionLabel.text = "Hello World";
|
|
||||||
Melon<RenderMod>.Logger.Msg($"[UI] VersionLabel 발견: {_versionLabel.text}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OpenAdvancedConfig()
|
private void OpenAdvancedConfig()
|
||||||
{
|
{
|
||||||
@@ -360,7 +348,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
// 3. 코덱 로우
|
// 3. 코덱 로우
|
||||||
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>(Enum.GetNames(typeof(Codec)));
|
||||||
var codecDropdown = new DropdownField(codecChoices, tempConfig.Codec.ToString()) { name = "VideoCodec" };
|
var codecDropdown = new DropdownField(codecChoices, tempConfig.Codec.ToString()) { name = "VideoCodec" };
|
||||||
codecRow.Add(codecLabel);
|
codecRow.Add(codecLabel);
|
||||||
codecRow.Add(codecDropdown);
|
codecRow.Add(codecDropdown);
|
||||||
@@ -369,7 +357,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
// 4. 모드 로우
|
// 4. 모드 로우
|
||||||
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>(Enum.GetNames(typeof(RateControlMode)));
|
||||||
var modeDropdown = new DropdownField(modeChoices, tempConfig.RateControlMode.ToString()) { name = "VideoRateControlMode" };
|
var modeDropdown = new DropdownField(modeChoices, tempConfig.RateControlMode.ToString()) { name = "VideoRateControlMode" };
|
||||||
modeRow.Add(modeLabel);
|
modeRow.Add(modeLabel);
|
||||||
modeRow.Add(modeDropdown);
|
modeRow.Add(modeDropdown);
|
||||||
@@ -473,11 +461,11 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
|
|
||||||
saveBtn.RegisterCallback<ClickEvent>(_ =>
|
saveBtn.RegisterCallback<ClickEvent>(_ =>
|
||||||
{
|
{
|
||||||
if (System.Enum.TryParse<RateControlMode>(modeDropdown.value, out var mode))
|
if (Enum.TryParse<RateControlMode>(modeDropdown.value, out var mode))
|
||||||
{
|
{
|
||||||
tempConfig.RateControlMode = mode;
|
tempConfig.RateControlMode = mode;
|
||||||
}
|
}
|
||||||
if (System.Enum.TryParse<Codec>(codecDropdown.value, out var codec))
|
if (Enum.TryParse<Codec>(codecDropdown.value, out var codec))
|
||||||
{
|
{
|
||||||
tempConfig.Codec = codec;
|
tempConfig.Codec = codec;
|
||||||
}
|
}
|
||||||
@@ -518,7 +506,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
// 가시성 필터링 업데이트 (행 단위로 보임/숨김 제어)
|
// 가시성 필터링 업데이트 (행 단위로 보임/숨김 제어)
|
||||||
void UpdateVisibility(string selectedModeStr)
|
void UpdateVisibility(string selectedModeStr)
|
||||||
{
|
{
|
||||||
if (!System.Enum.TryParse<RateControlMode>(selectedModeStr, out var mode)) return;
|
if (!Enum.TryParse<RateControlMode>(selectedModeStr, out var mode)) return;
|
||||||
bitrateRow.style.display = mode is RateControlMode.CBR or RateControlMode.VBR ? DisplayStyle.Flex : DisplayStyle.None;
|
bitrateRow.style.display = mode is RateControlMode.CBR or RateControlMode.VBR ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
maxBitrateRow.style.display = mode == RateControlMode.VBR ? DisplayStyle.Flex : DisplayStyle.None;
|
maxBitrateRow.style.display = mode == RateControlMode.VBR ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
qpRow.style.display = mode == RateControlMode.CQP ? DisplayStyle.Flex : DisplayStyle.None;
|
qpRow.style.display = mode == RateControlMode.CQP ? DisplayStyle.Flex : DisplayStyle.None;
|
||||||
@@ -982,7 +970,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
nameField.value = string.Empty;
|
nameField.value = string.Empty;
|
||||||
RefreshPresets();
|
RefreshPresets();
|
||||||
}
|
}
|
||||||
catch (System.Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
CommonWarningDialogUI.ShowDialog(
|
CommonWarningDialogUI.ShowDialog(
|
||||||
"저장 실패",
|
"저장 실패",
|
||||||
@@ -1045,7 +1033,7 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
alignItems = Align.Center,
|
alignItems = Align.Center,
|
||||||
paddingBottom = 5,
|
paddingBottom = 5,
|
||||||
paddingTop = 5,
|
paddingTop = 5,
|
||||||
borderBottomWidth = (i == presets.Count - 1) ? 0 : 1,
|
borderBottomWidth = i == presets.Count - 1 ? 0 : 1,
|
||||||
borderBottomColor = new StyleColor(new Color(0.2f, 0.2f, 0.2f, 0.8f))
|
borderBottomColor = new StyleColor(new Color(0.2f, 0.2f, 0.2f, 0.8f))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1186,4 +1174,17 @@ internal class RenderConfigUIManager : MonoBehaviour
|
|||||||
};
|
};
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void OnLinkTagClicked(PointerUpLinkTagEvent evt)
|
||||||
|
{
|
||||||
|
switch (evt.linkID)
|
||||||
|
{
|
||||||
|
case "open_git":
|
||||||
|
Application.OpenURL("https://git.yunizun.org/ADOFAIEditorForum/ADOFAIRenderer");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Melon<RenderMod>.Logger.Msg($"Clicked Link: {evt.linkID}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user