diff --git a/Core/RenderManager.cs b/Core/RenderManager.cs index 0b0a94a..9b7271c 100644 --- a/Core/RenderManager.cs +++ b/Core/RenderManager.cs @@ -32,12 +32,13 @@ namespace ADOFAIRenderer.Core public long frameCount; public bool skipPressToStart; public string levelPath = ""; - public bool isRenderCancelled; + public bool isRenderCancelled { get; private set; } public RenderConfig Configuration = null!; // Render Sessions State (OOP Instance Fields) - public bool isRendering; - public bool isCapturing; + public bool overrideLoading { get; private set; } + public bool isRendering { get; private set; } + public bool isCapturing { get; private set; } public double timeBase; public double unscaledTimeBase; public double dspTimeBase; @@ -90,10 +91,46 @@ namespace ADOFAIRenderer.Core CleanUpActiveRender(); } + /// + /// Sets overrideLoading to true when starting to load the render scene. + /// + public void StartLoadingOverride() + { + overrideLoading = true; + } + + /// + /// Sets isRendering to true when starting the rendering setup. + /// + public void StartRendering() + { + isRendering = true; + } + + /// + /// Sets isCapturing to true and resets the cancellation flag when starting the actual frame capture. + /// + public void StartCapturing() + { + isCapturing = true; + isRenderCancelled = false; + } + + /// + /// Resets all rendering-related states. + /// + public void ResetRenderState(bool success) + { + isRendering = false; + isCapturing = false; + overrideLoading = false; + isRenderCancelled = !success; + } + public void CleanUpActiveRender() { - isRendering = isCapturing = false; - isRenderCancelled = true; + ResetRenderState(success: false); + AudioSpectrumGenerator.Clear(); if (_activeVideoFFmpeg != null) @@ -160,7 +197,7 @@ namespace ADOFAIRenderer.Core dspTimeBase = AudioSettings.dspTime; frameCountBase = Time.frameCount; - isRendering = true; + StartRendering(); countdown = 3; wonFrame = -1; @@ -178,7 +215,7 @@ namespace ADOFAIRenderer.Core if (!isRendering) return; if (!scrController.instance || scrController.instance.state == States.Fail || scrController.instance.state == States.Fail2) { - isRendering = isCapturing = false; + ResetRenderState(success: false); StopFFmpeg(false); EndRender(); } @@ -192,7 +229,7 @@ namespace ADOFAIRenderer.Core var extraFrames = (long)Math.Ceiling(Configuration.DelayAfterLevelEnd * Configuration.RenderFPS); if (frameCount - wonFrame < extraFrames) return; - isRendering = isCapturing = false; + ResetRenderState(success: true); StopFFmpeg(true); } } @@ -307,14 +344,13 @@ namespace ADOFAIRenderer.Core return; } - if (Instance != null) - Instance.levelPath = ADOBase.levelPath; - + if (Instance) Instance.levelPath = ADOBase.levelPath; scnEditor.instance.CheckUnsavedChanges(() => { var quitDelegate = (Func)Delegate.CreateDelegate(typeof(Func), scnEditor.instance, targetMethod); - + + if (Instance) Instance.StartLoadingOverride(); Application.wantsToQuit -= quitDelegate; ADOBase.loader.LoadSceneWithTransition(WipeDirection.StartsFromRight, "Assets/Scenes/RenderSettingsScene.unity"); }); @@ -356,7 +392,7 @@ namespace ADOFAIRenderer.Core _frameReader = new FrameReader(); StartFFmpegThread(); - isCapturing = true; + StartCapturing(); scrController.instance.paused = scrController.instance.audioPaused = false; scrController.instance.levelWasSkipped = true; @@ -539,8 +575,7 @@ namespace ADOFAIRenderer.Core public void CancelRender() { - isRendering = isCapturing = false; - isRenderCancelled = true; + ResetRenderState(success: false); StopFFmpeg(false); EndRender(); diff --git a/Patch/Engine/RenderEnvironmentPatches.cs b/Patch/Engine/RenderEnvironmentPatches.cs index df36c62..8db75dd 100644 --- a/Patch/Engine/RenderEnvironmentPatches.cs +++ b/Patch/Engine/RenderEnvironmentPatches.cs @@ -159,10 +159,8 @@ namespace ADOFAIRenderer.Patch.Engine [SuppressMessage("ReSharper", "InconsistentNaming")] public static void Prefix(ref bool stream) { - if (RenderManager.Instance && RenderManager.Instance.Configuration.ProcessAudio) - { + if (RenderManager.Instance && RenderManager.Instance.overrideLoading && RenderManager.Instance.Configuration.ProcessAudio) stream = false; - } } } } diff --git a/Util/GPUUtil.cs b/Util/GPUUtil.cs index be0752c..b6a9293 100644 --- a/Util/GPUUtil.cs +++ b/Util/GPUUtil.cs @@ -15,10 +15,14 @@ namespace ADOFAIRenderer.Util public static class GPUUtil { private const string NvidiaPattern = - @"^NVIDIA GeForce [RG]TX [0-9]+(?>(?> Ti)|(?> SUPER)|(?> [0-9]+GB))?(?> Laptop GPU)?/PCIe/SSE2$"; + @"^NVIDIA GeForce [RG]TX [0-9]+(?> SUPER| Ti(?> SUPER)?)?(?> [0-9]+GB)?(?> Laptop GPU)?/PCIe/SSE2$"; private const string IntelPattern = - @"^Intel(?>\(R\))* (?>U*HD Graphics [0-9]+$|Arc\(TM\) [A-C][0-9]+ Graphics)"; + @"^Intel(?>\(R\))? (?>U?HD Graphics [0-9]+$|Arc\(TM\) [A-C][0-9]+ Graphics)$"; + + // ReSharper disable once InconsistentNaming + private const string AMDPattern = + @"^AMD Radeon RX [0-9]+(?> XT)?$"; private static readonly Dictionary> CodecMap = new() { @@ -28,8 +32,8 @@ namespace ADOFAIRenderer.Util [Codec.AV1] = new List<(GPUVendor, string)> { (GPUVendor.NVIDIA, "av1_nvenc"), (GPUVendor.Intel, "av1_qsv"), (GPUVendor.AMD, "av1_amf"), (GPUVendor.Unknown, "libsvtav1"), (GPUVendor.Unknown, "libaom-av1") }, [Codec.VVC] = new List<(GPUVendor, string)> { (GPUVendor.Unknown, "libvvenc") } }; - - public static GPUVendor GetActiveGPUVendor() + + private static GPUVendor GetActiveGPUVendor() { var gpuName = UnityEngine.SystemInfo.graphicsDeviceName; Melon.Logger.Msg($"Active GPU: {gpuName}"); @@ -44,6 +48,11 @@ namespace ADOFAIRenderer.Util return GPUVendor.Intel; } + foreach (Match unused in Regex.Matches(gpuName, AMDPattern)) + { + return GPUVendor.AMD; + } + return GPUVendor.Unknown; }