using System.Diagnostics.CodeAnalysis; using ADOFAIRenderer.Util; using MelonLoader; using O5Kit.Core; using TMPro; namespace ADOFAIRenderer.UI; using UnityEngine; [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] internal static class ModAssets { public static void Load() { FontBundle = BundleLoader.GetBundle("fonts"); NanumSquareNeoNormal = FontBundle.LoadAsset("NanumSquareNeoOTF-Bd SDF"); NanumSquareNeoBold = FontBundle.LoadAsset("NanumSquareNeoOTF-Eb SDF"); Melon.Logger.Msg("Fonts loaded successfully."); ShaderBundle = BundleLoader.GetBundle("shaders"); ColorConversionShader = ShaderBundle.LoadAsset("ColorConversion"); Melon.Logger.Msg("Shader loaded successfully."); } public static AssetBundle FontBundle = null!; public static AssetBundle ShaderBundle = null!; public static TMP_FontAsset NanumSquareNeoNormal = null!; public static TMP_FontAsset NanumSquareNeoBold = null!; public static ComputeShader ColorConversionShader = null!; } internal sealed class RendererFontProvider : IFontProvider { private static readonly DefaultFontProvider DefaultFontProvider = new(); private bool _disposed; public TMP_FontAsset Regular => ModAssets.NanumSquareNeoNormal; public TMP_FontAsset Medium => ModAssets.NanumSquareNeoBold; public TMP_FontAsset Monospace => DefaultFontProvider.Monospace; public void Dispose() { if (_disposed) return; _disposed = true; } } internal class RendererUIManager : MonoBehaviour { public static RendererUIManager Instance = null!; public static O5Context Context => Instance._context; public O5WindowManager WindowManager => _windowManager; private O5Context _context = null!; private O5WindowManager _windowManager = null!; private void Awake() { Instance = this; _context = new O5Context( config: new O5Config { UIScale = 1.0f, MiddleClickToDefault = true, SliderSensitivity = 1.0f }, theme: O5Theme.Dark with { PanelBG = new Color(0.067f, 0.067f, 0.067f, 1f), TopBar = new Color(0f, 0f, 0f, 0.6f), MenuBG = new Color(0f, 0f, 0f, 0.6f), MenuHover = new Color(1.000f, 0.294f, 0.079f, .6f), ObjectBG = new Color(0f, 0f, 0f, 1f), ObjectButton = new Color(0f, 0f, 0f, 1f), ObjectActive = new Color(1.000f, 0.294f, 0.079f, 1f), ObjectActiveBright = new Color(1.000f, 0.294f, 0.079f, 1f), ControlOutlineIdle = new Color(1f, 1f, 1f, 0.4f), ButtonHover = new Color(0.133f, 0.133f, 0.133f, 1.0f), ControlOutlineHover = new Color(1f, 1f, 1f, 0.4f), CardHeader = new Color(0.157f, 0f, 0f, 1f), CardPanel = new Color(0, 0, 0, 0f), SoftRed = new Color(1.000f, 0.576f, 0.590f, 1f), MathOk = new Color(0.408f, 0.827f, 0.569f, 1f), MathWarn = new Color(0.964f, 0.647f, 0.315f, 1f), MathErr = new Color(1.000f, 0.576f, 0.590f, 1f), CornerRadius = 12, OutlineWidth = 2, ControlHeight = 40, FontSizeBody = 18, FontSizeH1 = 48, Outline = new Color(1f, 1f, 1f, 0.2f), TextDimAlpha = 1f }, fonts: new RendererFontProvider() ); _windowManager = O5WindowManager.Create(_context, transform, "RendererMod_Canvas"); // The O5Kit canvas is created with sortingOrder 32767. It is lowered so that the dialogs of // CommonWarningDialogUI (32766) are drawn above the windows of this manager. var windowCanvas = transform.Find("RendererMod_Canvas")?.GetComponent(); if (windowCanvas != null) windowCanvas.sortingOrder = WindowCanvasSortingOrder; } private const int WindowCanvasSortingOrder = 32000; private void Update() { O5Object.TickAll(); Context.Tooltip.Tick(); O5Kit.Input.O5ShortcutManager.HandleUpdate(); } private void OnDestroy() { _windowManager.Dispose(); _context.Dispose(); } }