diff --git a/.gitignore b/.gitignore index 8b8c619..e63010a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ GEMINI.md # Developer Description Files /AsyncInputAutoplayFix.md -/AudioMixerExplanation.md \ No newline at end of file +/AudioMixerExplanation.md +/O5Theme.md \ No newline at end of file diff --git a/ADOFAIRenderer.csproj b/ADOFAIRenderer.csproj index 8e83765..ce4984d 100644 --- a/ADOFAIRenderer.csproj +++ b/ADOFAIRenderer.csproj @@ -16,6 +16,9 @@ $(ADOFAI_PATH)\MelonLoader\net35\0Harmony.dll + + $(ADOFAI_PATH)\UserLibs\O5Kit.dll + $(ADOFAI_PATH)\A Dance of Fire and Ice_Data\Managed\Assembly-CSharp.dll @@ -81,37 +84,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/Bundle/Linux/scenes b/Bundle/Linux/scenes deleted file mode 100644 index 79405c9..0000000 Binary files a/Bundle/Linux/scenes and /dev/null differ diff --git a/Bundle/OSX/scenes b/Bundle/OSX/scenes deleted file mode 100644 index 1ef2d9c..0000000 Binary files a/Bundle/OSX/scenes and /dev/null differ diff --git a/Bundle/Win64/fonts b/Bundle/Win64/fonts index 4466c93..61b8cc7 100644 Binary files a/Bundle/Win64/fonts and b/Bundle/Win64/fonts differ diff --git a/Bundle/Win64/scenes b/Bundle/Win64/scenes deleted file mode 100644 index 058ddc6..0000000 Binary files a/Bundle/Win64/scenes and /dev/null differ diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index 6a08601..c531035 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -9,6 +9,7 @@ using System.Linq; using ADOFAIRenderer.API; using ADOFAIRenderer.Data; using ADOFAIRenderer.UI; +using ADOFAIRenderer.UI.Window; using ADOFAIRenderer.Util; using ADOFAIRenderer.Util.Audio; using ADOFAIRenderer.Util.FFmpeg; @@ -336,7 +337,8 @@ internal class RenderManager : MonoBehaviour (Func)Delegate.CreateDelegate(typeof(Func), scnEditor.instance, targetMethod); Application.wantsToQuit -= quitDelegate; - ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "Assets/Scenes/RenderSettingsScene.unity"); + RenderConfigWindow.CreateWindow(); + // ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "Assets/Scenes/RenderSettingsScene.unity"); }); } @@ -364,7 +366,7 @@ internal class RenderManager : MonoBehaviour { if (Configuration.AudioConfig.RenderAudio && Configuration.VideoConfig.Codec is Codec.VP9 or Codec.AV1 or Codec.VVC) { - Configuration.AudioConfig.AudioSampleRate = 48000; + if (Configuration.AudioConfig.AudioSampleRate == 44100) Configuration.AudioConfig.AudioSampleRate = 48000; } for (; countdown > 0; countdown--) @@ -773,7 +775,7 @@ internal class RenderManager : MonoBehaviour _frameReader?.Dispose(); AudioMixer?.Reset(); AudioMixer = null; SyncCalculator.Reset(); - + RenderContext.Reset(); ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "scnEditor"); diff --git a/Data/RenderConfig.cs b/Data/RenderConfig.cs index b6629d8..a1eb91c 100644 --- a/Data/RenderConfig.cs +++ b/Data/RenderConfig.cs @@ -44,7 +44,7 @@ public class VideoEncodingConfig public class AudioEncodingConfig { - private int _audioSampleRate = 44100; + private int _audioSampleRate = 48000; private int _audioChannels = 2; private int _audioBitrate = 256000; diff --git a/Localization/Locale/en.json b/Localization/Locale/en.json index f6a667e..fc2b0de 100644 --- a/Localization/Locale/en.json +++ b/Localization/Locale/en.json @@ -1,85 +1,35 @@ { - "ui.button.presets": "Presets", - "ui.placeholder.render_fps": "Render FPS", - "ui.placeholder.video_fps": "Video FPS", - "ui.placeholder.render_width": "Render Width (px)", - "ui.placeholder.render_height": "Render Height (px)", - "ui.button.video_config": "Video Encoding Config", - "ui.button.audio_config": "Audio Encoding Config", - "ui.placeholder.delay_after_end": "Delay After Level End", - "ui.toggle.show_judgement": "Show Judgement", - "ui.button.go_render": "Go Render", - "ui.button.advanced_settings": "Advanced Settings...", - "ui.version.expired": " (Expired)", - "ui.validation.required_fields": "Required input fields are empty or invalid. Please fill in all settings.", - - "ui.advanced.title": "Advanced Settings", - "ui.advanced.file_extension": "File Extension", - "ui.advanced.process_audio": "Process Audio", - "ui.advanced.non_tile_mode": "Non-Tile Mode", - "ui.advanced.random_seed": "Random Seed (Optional)", - "ui.button.cancel": "Cancel", - "ui.button.save": "Save", - - "ui.video.title": "Video Encoding Settings", - "ui.video.codec": "Codec", - "ui.video.rate_control": "Bitrate Control Mode", - "ui.video.bitrate": "Bitrate (kbps)", - "ui.video.max_bitrate": "Max Bitrate (kbps)", - "ui.video.qp": "Quality (QP)", - "ui.video.keyframe_interval": "Keyframe Interval (s)", - "ui.video.force_software": "Force Software Encoder", - "ui.video.qp_zero_warning": "Warning: Setting QP to 0 applies lossless encoding and may result in very large file sizes.", - - "ui.audio.title": "Audio Encoding Settings", - "ui.audio.rendering": "Audio Rendering", - "ui.audio.sample_rate": "Sample Rate (Hz)", - "ui.audio.channels": "Audio Channels", - "ui.audio.channels_mono": "1 (Mono)", - "ui.audio.channels_stereo": "2 (Stereo)", - "ui.audio.bitrate": "Audio Bitrate (kbps)", - - "ui.preset.title": "Preset Settings", - "ui.preset.new_name": "New Preset Name", - "ui.preset.no_presets": "No saved presets.", - "ui.button.load": "Load", - "ui.button.delete": "Delete", - "ui.button.close": "Close", - "ui.preset.save_failed": "Save Failed", - "ui.preset.enter_name": "Please enter a preset name.", - "ui.preset.invalid_inputs": "Cannot save preset because required input values are empty or invalid.", - "ui.preset.save_error": "An error occurred while saving the preset: {0}", - "ui.preset.delete_title": "Delete Preset", - "ui.preset.delete_confirm": "Are you sure you want to delete the preset '{0}'?", - "ui.button.yes": "Yes", - "ui.button.no": "No", - "ui.button.ok": "OK", - - "ui.ffmpeg.title": "FFmpeg Library Installation Required", - "ui.ffmpeg.desc_main": "FFmpeg shared libraries are required to render video.", - "ui.ffmpeg.desc_osx": "For macOS, reliable public builds are unavailable, so FFmpeg 8.1 must be built manually.\nClick the button below to open the official FFmpeg website.", - "ui.ffmpeg.desc_auto": "Click the button below to automatically download and install from the internet.\n(Download size: ~70MB, extracted to UserLibs folder)", - "ui.ffmpeg.button_download": "Download & Install", - "ui.ffmpeg.button_open_web": "Open Download Page", - "ui.ffmpeg.button_cancel": "Cancel", - "ui.ffmpeg.button_opening": "Opening...", - "ui.ffmpeg.status_downloading": "Downloading... ({0:F1}%)", - "ui.ffmpeg.status_extracting": "Extracting FFmpeg files...", - "ui.ffmpeg.status_done": "Done! Restarting audio/video engine...", - "ui.ffmpeg.status_failed": "Failed to download FFmpeg: {0}", - - "ui.escape.cancelling": "Cancelling in {0:F1}s..\nHold Esc to cancel render", - - "ui.monitor.title": "ADOFAI Renderer Realtime Monitor", - "ui.monitor.queue": "• Queue: {0} / {1} frames", - "ui.monitor.rendered_frames": "• Rendered Frames: {0}", - "ui.monitor.frames_sent": "• Frames Sent: {0}", - "ui.monitor.throttling": "• Throttling Controls: {0} times", - "ui.monitor.readback_failures": "• Readback Hard Failures: {0} times", - "ui.monitor.skip_retry": "• Render Skip-Retry: {0} / {1}", - "ui.monitor.memory": "• Mono Heap Memory: {0:F2} MB", - - "ui.notification.complete_title": "Rendering Complete!", - "ui.notification.complete_msg": "{0} saved successfully.", - "ui.notification.video_fallback": "Video" + "ui.render_config.window_title": "Render Config", + "ui.render_config.render_fps": "Render FPS", + "ui.render_config.video_fps": "Video FPS", + "ui.render_config.render_width": "Render Width", + "ui.render_config.render_height": "Render Height", + "ui.render_config.delay_after_end": "Delay After End (s)", + "ui.render_config.show_judgement": "Show Judgement Text", + "ui.render_config.video_encoding": "Video Encoding Config", + "ui.render_config.audio_encoding": "Audio Encoding Config", + "ui.render_config.global_settings": "Global Settings", + "ui.render_config.advanced_settings": "Advanced Settings", + "ui.render_config.go_render": "Go Render", + "ui.render_config.codec": "Codec", + "ui.render_config.rate_control": "Rate Control Mode", + "ui.render_config.bitrate": "Bitrate (kbps)", + "ui.render_config.max_bitrate": "Max Bitrate (kbps)", + "ui.render_config.qp": "Quality (QP)", + "ui.render_config.keyframe_interval": "Keyframe Interval (s)", + "ui.render_config.force_software": "Force Software Encoder", + "ui.render_config.render_audio": "Render Audio", + "ui.render_config.sample_rate": "Sample Rate (Hz)", + "ui.render_config.channels": "Audio Channels", + "ui.render_config.audio_bitrate": "Audio Bitrate (kbps)", + "ui.render_config.output_dir": "Output Directory", + "ui.render_config.browse": "Browse...", + "ui.render_config.reset_default": "Reset to Default", + "ui.render_config.file_extension": "File Extension", + "ui.render_config.process_audio": "Process Audio", + "ui.render_config.non_tile": "Non-Tile Mode", + "ui.render_config.random_seed": "Random Seed (Optional)", + "ui.render_config.validation_title": "Invalid Settings", + "ui.render_config.validation_error": "Please check your input values:\n- Width and Height must be integers > 0\n- Render FPS and Video FPS must be > 0\n- Delay After End must be >= 0", + "ui.render_config.invalid_path": "Output directory path is invalid:\n{0}" } diff --git a/Localization/Locale/ko.json b/Localization/Locale/ko.json index ecc7747..204c9d7 100644 --- a/Localization/Locale/ko.json +++ b/Localization/Locale/ko.json @@ -1,85 +1,35 @@ { - "ui.button.presets": "프리셋", - "ui.placeholder.render_fps": "렌더링 FPS", - "ui.placeholder.video_fps": "영상 FPS", - "ui.placeholder.render_width": "렌더링 너비 (px)", - "ui.placeholder.render_height": "렌더링 높이 (px)", - "ui.button.video_config": "비디오 인코딩 설정", - "ui.button.audio_config": "오디오 인코딩 설정", - "ui.placeholder.delay_after_end": "레벨 종료 후 대기 시간 (초)", - "ui.toggle.show_judgement": "판정 텍스트 표시", - "ui.button.go_render": "렌더링 시작", - "ui.button.advanced_settings": "고급 설정...", - "ui.version.expired": " (만료됨)", - "ui.validation.required_fields": "필수 입력란이 비어 있거나 올바르지 않습니다. 모든 설정을 확인해 주세요.", - - "ui.advanced.title": "고급 설정", - "ui.advanced.file_extension": "파일 확장자", - "ui.advanced.process_audio": "오디오 처리", - "ui.advanced.non_tile_mode": "논타일 모드", - "ui.advanced.random_seed": "랜덤 시드 (선택 사항)", - "ui.button.cancel": "취소", - "ui.button.save": "저장", - - "ui.video.title": "비디오 인코딩 설정", - "ui.video.codec": "코덱", - "ui.video.rate_control": "비트레이트 제어 모드", - "ui.video.bitrate": "비트레이트 (kbps)", - "ui.video.max_bitrate": "최대 비트레이트 (kbps)", - "ui.video.qp": "품질 (QP)", - "ui.video.keyframe_interval": "키프레임 간격 (초)", - "ui.video.force_software": "강제 소프트웨어 인코더", - "ui.video.qp_zero_warning": "경고: QP를 0으로 설정하면 무손실 인코딩이 적용되어 파일 크기가 매우 커질 수 있습니다.", - - "ui.audio.title": "오디오 인코딩 설정", - "ui.audio.rendering": "오디오 렌더링", - "ui.audio.sample_rate": "샘플레이트 (Hz)", - "ui.audio.channels": "오디오 채널", - "ui.audio.channels_mono": "1 (모노)", - "ui.audio.channels_stereo": "2 (스테레오)", - "ui.audio.bitrate": "오디오 비트레이트 (kbps)", - - "ui.preset.title": "프리셋 설정", - "ui.preset.new_name": "새 프리셋 이름", - "ui.preset.no_presets": "저장된 프리셋이 없습니다.", - "ui.button.load": "불러오기", - "ui.button.delete": "삭제", - "ui.button.close": "닫기", - "ui.preset.save_failed": "저장 실패", - "ui.preset.enter_name": "프리셋 이름을 입력해 주세요.", - "ui.preset.invalid_inputs": "필수 입력값이 비어 있거나 올바르지 않아 프리셋을 저장할 수 없습니다.", - "ui.preset.save_error": "프리셋 저장 중 오류가 발생했습니다: {0}", - "ui.preset.delete_title": "프리셋 삭제", - "ui.preset.delete_confirm": "정말 '{0}' 프리셋을 삭제하시겠습니까?", - "ui.button.yes": "예", - "ui.button.no": "아니오", - "ui.button.ok": "확인", - - "ui.ffmpeg.title": "FFmpeg 라이브러리 설치 필요", - "ui.ffmpeg.desc_main": "영상을 렌더링하려면 FFmpeg 공유 라이브러리가 필요합니다.", - "ui.ffmpeg.desc_osx": "macOS의 경우 신뢰할 수 있는 빌드가 제공되지 않아 FFmpeg 8.1을 직접 빌드해야 합니다.\n아래 버튼을 눌러 공식 FFmpeg 웹사이트를 방문하세요.", - "ui.ffmpeg.desc_auto": "아래 버튼을 눌러 인터넷에서 자동으로 다운로드하여 설치합니다.\n(다운로드 크기: 약 70MB, UserLibs 폴더에 압축 해제됨)", - "ui.ffmpeg.button_download": "다운로드 및 설치", - "ui.ffmpeg.button_open_web": "다운로드 페이지 열기", - "ui.ffmpeg.button_cancel": "취소", - "ui.ffmpeg.button_opening": "열리는 중...", - "ui.ffmpeg.status_downloading": "다운로드 중... ({0:F1}%)", - "ui.ffmpeg.status_extracting": "FFmpeg 파일 압축 해제 중...", - "ui.ffmpeg.status_done": "완료! 오디오/비디오 엔진을 재시작합니다...", - "ui.ffmpeg.status_failed": "FFmpeg 다운로드 실패: {0}", - - "ui.escape.cancelling": "{0:F1}초 후 취소됩니다..\n렌더링을 취소하려면 Esc를 길게 누르세요", - - "ui.monitor.title": "ADOFAI Renderer 실시간 모니터", - "ui.monitor.queue": "• 대기열: {0} / {1} 프레임", - "ui.monitor.rendered_frames": "• 렌더링된 프레임: {0}", - "ui.monitor.frames_sent": "• 전송된 프레임: {0}", - "ui.monitor.throttling": "• 쓰로틀링 제어: {0}회", - "ui.monitor.readback_failures": "• 리드백 실패: {0}회", - "ui.monitor.skip_retry": "• 렌더 건너뜀-재시도: {0} / {1}", - "ui.monitor.memory": "• 모노 힙 메모리: {0:F2} MB", - - "ui.notification.complete_title": "렌더링 완료!", - "ui.notification.complete_msg": "{0}이(가) 성공적으로 저장되었습니다.", - "ui.notification.video_fallback": "동영상" + "ui.render_config.window_title": "렌더 설정", + "ui.render_config.render_fps": "렌더링 FPS", + "ui.render_config.video_fps": "영상 FPS", + "ui.render_config.render_width": "렌더링 너비", + "ui.render_config.render_height": "렌더링 높이", + "ui.render_config.delay_after_end": "종료 후 대기 시간 (초)", + "ui.render_config.show_judgement": "판정 텍스트 표시", + "ui.render_config.video_encoding": "Video Encoding Config", + "ui.render_config.audio_encoding": "Audio Encoding Config", + "ui.render_config.global_settings": "Global Settings", + "ui.render_config.advanced_settings": "Advanced Settings", + "ui.render_config.go_render": "렌더 시작", + "ui.render_config.codec": "코덱", + "ui.render_config.rate_control": "비트레이트 제어 모드", + "ui.render_config.bitrate": "비트레이트 (kbps)", + "ui.render_config.max_bitrate": "최대 비트레이트 (kbps)", + "ui.render_config.qp": "품질 (QP)", + "ui.render_config.keyframe_interval": "키프레임 간격 (초)", + "ui.render_config.force_software": "강제 소프트웨어 인코더", + "ui.render_config.render_audio": "오디오 렌더링", + "ui.render_config.sample_rate": "샘플레이트 (Hz)", + "ui.render_config.channels": "오디오 채널", + "ui.render_config.audio_bitrate": "오디오 비트레이트 (kbps)", + "ui.render_config.output_dir": "출력 디렉토리", + "ui.render_config.browse": "찾아보기...", + "ui.render_config.reset_default": "기본값으로 초기화", + "ui.render_config.file_extension": "파일 확장자", + "ui.render_config.process_audio": "오디오 처리", + "ui.render_config.non_tile": "논타일 모드", + "ui.render_config.random_seed": "랜덤 시드 (선택 사항)", + "ui.render_config.validation_title": "설정 오류", + "ui.render_config.validation_error": "입력값을 확인해 주세요:\n- 너비와 높이는 0보다 큰 정수여야 합니다.\n- 렌더 FPS와 영상 FPS는 0보다 커야 합니다.\n- 종료 후 대기 시간은 0 이상이어야 합니다.", + "ui.render_config.invalid_path": "출력 디렉토리 경로가 올바르지 않습니다:\n{0}" } diff --git a/Localization/LocalizationManager.cs b/Localization/LocalizationManager.cs index 181f77b..15bb674 100644 --- a/Localization/LocalizationManager.cs +++ b/Localization/LocalizationManager.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; using MelonLoader; using Newtonsoft.Json; using UnityEngine; @@ -33,6 +32,11 @@ internal static class LocalizationManager private static bool _initialized; + static LocalizationManager() + { + Initialize(); + } + /// /// Initializes the localization system and loads embedded language dictionaries. /// @@ -115,7 +119,7 @@ internal static class LocalizationManager localeCode = FallbackLocaleCode; } - var isChanged = (language != CurrentLanguage) || (localeCode != CurrentLocaleCode); + var isChanged = language != CurrentLanguage || localeCode != CurrentLocaleCode; CurrentLanguage = language; CurrentLocaleCode = localeCode; @@ -140,6 +144,7 @@ internal static class LocalizationManager public static string Get(string key) { if (string.IsNullOrEmpty(key)) return string.Empty; + if (!_initialized) Initialize(); // 1. Try currently active locale if (Locales.TryGetValue(CurrentLocaleCode, out var activeDict) && activeDict.TryGetValue(key, out var val)) @@ -165,7 +170,7 @@ internal static class LocalizationManager public static string Get(string key, params object[] args) { var template = Get(key); - if (args == null || args.Length == 0) return template; + if (args.Length == 0) return template; try { @@ -185,7 +190,6 @@ internal static class LocalizationManager return language switch { SystemLanguage.Korean => "ko", - SystemLanguage.English => "en", _ => "en" }; } @@ -218,6 +222,7 @@ internal static class LocalizationManager /// /// Convenient shorthand alias for . /// +// ReSharper disable once InconsistentNaming internal static class I18n { /// diff --git a/RenderMod.cs b/RenderMod.cs index 9be8d8f..593e541 100644 --- a/RenderMod.cs +++ b/RenderMod.cs @@ -2,12 +2,11 @@ using System; using ADOFAIRenderer; using ADOFAIRenderer.Core; using ADOFAIRenderer.Data; -using ADOFAIRenderer.Util; +using ADOFAIRenderer.UI; using FFmpeg.AutoGen; using MelonLoader; using MelonLoader.Utils; using UnityEngine; -using UnityEngine.EventSystems; using Object = UnityEngine.Object; [assembly: MelonInfo(typeof(RenderMod), "ADOFAI Renderer", "0.3.3-BETA", "ADOFAI Editor Forum")] @@ -17,57 +16,27 @@ namespace ADOFAIRenderer; internal class RenderMod : MelonMod { - public static AssetBundle FontBundle = null!; // ReSharper disable once MemberCanBePrivate.Global - public static AssetBundle SceneBundle = null!; - // ReSharper disable once MemberCanBePrivate.Global - public static AssetBundle ShaderBundle = null!; - public static ComputeShader ColorConversionShader = null!; public static bool IsFeatureDisabled = false; public static DateTime ExpirationTime = new(2026, 09, 21, 0, 0, 0, DateTimeKind.Utc); public override void OnInitializeMelon() { GlobalSettings.Load(); + Localization.LocalizationManager.Initialize(); ffmpeg.RootPath = MelonEnvironment.UserLibsDirectory; var renderManagerObj = new GameObject("Render Manager"); var updateHookerObj = new GameObject("Update Hooker"); + var uiManagerObj = new GameObject("Renderer UI Manager"); Object.DontDestroyOnLoad(renderManagerObj); Object.DontDestroyOnLoad(updateHookerObj); + Object.DontDestroyOnLoad(uiManagerObj); renderManagerObj.AddComponent(); updateHookerObj.AddComponent(); - LoadBundles(); - } - - private static void LoadBundles() - { - FontBundle = BundleLoader.GetBundle("fonts"); - SceneBundle = BundleLoader.GetBundle("scenes"); - SceneBundle.GetAllScenePaths(); - try - { - ShaderBundle = BundleLoader.GetBundle("shaders"); - ColorConversionShader = ShaderBundle.LoadAsset("ColorConversion"); - Melon.Logger.Msg("Color conversion Compute Shader loaded successfully."); - } - catch (Exception ex) - { - Melon.Logger.Warning($"Failed to load Shader AssetBundle. GPU color conversion will be disabled and fallback to CPU. Error: {ex.Message}"); - } - } - - public static void FixEventSystem() - { - if (EventSystem.current == null) return; - var currentModule = EventSystem.current.currentInputModule; - - if (currentModule) return; - Melon.Logger.Msg("Ported Unity 6 Input Module."); - - var newModule = EventSystem.current.gameObject.AddComponent(); - newModule.enabled = true; + uiManagerObj.AddComponent(); + ModAssets.Load(); } public override void OnApplicationQuit() diff --git a/UI/CommonWarningDialogUI.cs b/UI/CommonWarningDialogUI.cs index a26bd96..7403b96 100644 --- a/UI/CommonWarningDialogUI.cs +++ b/UI/CommonWarningDialogUI.cs @@ -52,46 +52,6 @@ internal class CommonWarningDialogUI : MonoBehaviour } } - private static TMP_FontAsset GetNanumSquareNeoBdFontAsset() - { - TMP_FontAsset? font = null; - if (RenderMod.FontBundle) - { - try - { - font = RenderMod.FontBundle.LoadAsset("NanumSquareNeoOTF-Bd SDF"); - } - catch - { - // Loading failed - } - } - - // Fallback processing - if (!font) - { - try - { - font = RDString.fontData.fontTMP; - } - catch - { - // ignored - } - } - if (!font) - { - // ReSharper disable once Unity.UnknownResource - font = Resources.Load("Fonts & Materials/LiberationSans SDF"); - } - - if (font) return font; - var fonts = Resources.FindObjectsOfTypeAll(); - if (fonts.Length > 0) font = fonts[0]; - - return font!; - } - public static void ShowDialog(string title, string description, params DialogButton[] buttons) { if (buttons.Length == 0) return; @@ -153,7 +113,7 @@ internal class CommonWarningDialogUI : MonoBehaviour bgRect.offsetMin = Vector2.zero; bgRect.offsetMax = Vector2.zero; - var font = GetNanumSquareNeoBdFontAsset(); + var font = ModAssets.NanumSquareNeoNormal; // 2. Create modal container var modalContainerObj = new GameObject("ModalContainer"); diff --git a/UI/DebugMonitorUI.cs b/UI/DebugMonitorUI.cs index 8710c8b..f2bc2c9 100644 --- a/UI/DebugMonitorUI.cs +++ b/UI/DebugMonitorUI.cs @@ -30,39 +30,6 @@ internal class DebugMonitorUI : MonoBehaviour private RectTransform _fillRect = null!; private TextMeshProUGUI _progressText = null!; - private static TMP_FontAsset GetNanumSquareNeoBdFontAsset() - { - TMP_FontAsset? font = null; - if (RenderMod.FontBundle != null) - { - try - { - font = RenderMod.FontBundle.LoadAsset("NanumSquareNeoOTF-Bd SDF"); - } - catch - { - // Loading failed - } - } - - // Fallback: Use game's own font or built-in TMP SDF font if AssetBundle loading fails - if (font == null) - { - font = RDString.fontData.fontTMP; - } - if (font == null) - { - // ReSharper disable once Unity.UnknownResource - font = Resources.Load("Fonts & Materials/LiberationSans SDF"); - } - - if (font != null) return font; - var fonts = Resources.FindObjectsOfTypeAll(); - if (fonts.Length > 0) font = fonts[0]; - - return font!; - } - private void Start() { // Set UI layer (5) @@ -112,8 +79,7 @@ internal class DebugMonitorUI : MonoBehaviour _text.overflowMode = TextOverflowModes.Overflow; // Load and apply font - var font = GetNanumSquareNeoBdFontAsset(); - _text.font = font; + _text.font = ModAssets.NanumSquareNeoNormal; var textRect = textObj.GetComponent(); textRect.anchorMin = Vector2.zero; @@ -166,7 +132,7 @@ internal class DebugMonitorUI : MonoBehaviour _progressText.richText = true; _progressText.fontSize = BarTextFontSize; _progressText.alignment = TextAlignmentOptions.Center; - _progressText.font = font; + _progressText.font = ModAssets.NanumSquareNeoNormal; _progressText.color = BarTextColor; // Add progress bar text outline for readability diff --git a/UI/FFmpegDownloadUI.cs b/UI/FFmpegDownloadUI.cs index 9ebaae3..737f7f0 100644 --- a/UI/FFmpegDownloadUI.cs +++ b/UI/FFmpegDownloadUI.cs @@ -88,11 +88,11 @@ internal class FFmpegDownloadUI : MonoBehaviour private static TMP_FontAsset GetNanumSquareNeoBdFontAsset() { TMP_FontAsset? font = null; - if (RenderMod.FontBundle) + if (ModAssets.FontBundle) { try { - font = RenderMod.FontBundle.LoadAsset("NanumSquareNeoOTF-Bd SDF"); + font = ModAssets.FontBundle.LoadAsset("NanumSquareNeoOTF-Bd SDF"); } catch { diff --git a/UI/RenderConfigUIManager.cs b/UI/RenderConfigUIManager.cs deleted file mode 100644 index 5ab3694..0000000 --- a/UI/RenderConfigUIManager.cs +++ /dev/null @@ -1,1411 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using ADOFAIRenderer.API; -using ADOFAIRenderer.Core; -using ADOFAIRenderer.Data; -using ADOFAIRenderer.Data.Input; -using ADOFAIRenderer.Util; -using ADOFAIRenderer.Util.FFmpeg; -using MelonLoader; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEngine.UIElements.Experimental; - -namespace ADOFAIRenderer.UI; - -internal class RenderConfigUIManager : MonoBehaviour -{ - [SerializeField] - private UIDocument uiDocument = null!; - - private VisualElement _root = null!; - private IntegerInputValidator _intValidator = null!; - private DoubleInputValidator _doubleValidator = null!; - - private Button _goRenderButton = null!; - private Button _videoEncodingConfigButton = null!; - private VisualElement _videoEncodingConfigContainer = null!; - - private Button _audioEncodingConfigButton = null!; - private VisualElement _audioEncodingConfigContainer = null!; - - private Button _globalSettingsButton = null!; - private VisualElement? _globalConfigContainer; - private Button _advancedSettingsButton = null!; - private VisualElement? _advancedConfigContainer; - private Label _versionLabel = null!; - - private void Awake() - { - _root = uiDocument.rootVisualElement; - RenderManager.Instance.Configuration = new RenderConfig(); - - _intValidator = new IntegerInputValidator(_root); - _doubleValidator = new DoubleInputValidator(_root); - } - - private void Start() - { - // Init Validators - _intValidator - .AddLimits("RenderWidth", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 7680)) - .AddLimits("RenderHeight", new PositiveOnlyIntegerLimit(), new RangeIntegerLimit(1, 4320)); - - _doubleValidator - .AddLimits("RenderFPS", new PositiveOnlyDoubleLimit(), new RangeDoubleLimit(0, 9600)) - .AddLimits("VideoFPS", new PositiveOnlyDoubleLimit(), new RangeDoubleLimit(0, 4800)) - .AddLimits("DelayAfterEnd", new PositiveOnlyDoubleLimit(), new RangeDoubleLimit(0, 86400)); - - _intValidator.SetupValidation(); - _doubleValidator.SetupValidation(); - - // Attach Button Event Listener - _goRenderButton = _root.Q