SHA256
Add High-Resolution Bloom Correction Option
This commit is contained in:
5 files changed
+90
No files matched your search
@@ -0,0 +1,59 @@
|
||||
using ADOFAIRenderer.Core;
|
||||
using HarmonyLib;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ADOFAIRenderer.Patch.Game;
|
||||
|
||||
/// <summary>
|
||||
/// Makes the game's bloom compute its blur size as if the frame were 720 pixels high
|
||||
/// ("High-Resolution Bloom Correction" option).
|
||||
/// <para>
|
||||
/// Patched member: <c>VideoBloom.OnRenderImage(RenderTexture source, RenderTexture destination)</c>. The game scales the
|
||||
/// frame down to a bloom buffer 198 pixels high (<c>scale = 198 / source.height</c>) and sets the blur radius in bloom
|
||||
/// buffer pixels to <c>KernelSize * MediumKernelScale * scale</c> (and <c>KernelSize * LargeKernelScale * scale</c>).
|
||||
/// <c>BloomBlit</c> turns the radius into the number of 5-tap blur passes and the blend amount of the last pass.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// While the render is active (<see cref="RenderManager.IsActive"/>) and <c>AdvancedConfig.HighResBloomCorrection</c> is
|
||||
/// enabled, the prefix multiplies <c>KernelSize</c> by <c>source.height / 720</c> for the duration of the call, so the
|
||||
/// radius equals <c>KernelSize * MediumKernelScale * 198 / 720</c> and the blur passes on the bloom buffer are the same
|
||||
/// as in a 720p frame. The finalizer restores the original <c>KernelSize</c>. The bloom buffer size and the downscale
|
||||
/// from the source frame keep the game's behavior.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(VideoBloom))]
|
||||
public class VideoBloomPatch
|
||||
{
|
||||
/// <summary>Frame height in pixels the blur size is computed for.</summary>
|
||||
private const float ReferenceHeight = 720f;
|
||||
|
||||
/// <summary>Prefix of <c>VideoBloom.OnRenderImage</c>.</summary>
|
||||
/// <param name="__instance">The bloom component on the game camera.</param>
|
||||
/// <param name="source">The camera frame; its height selects the multiplier.</param>
|
||||
/// <param name="__state">Original <c>KernelSize</c>, or null when it was not changed.</param>
|
||||
[HarmonyPrefix]
|
||||
[HarmonyPatch("OnRenderImage")]
|
||||
// ReSharper disable InconsistentNaming
|
||||
public static void ScaleKernelSize(VideoBloom __instance, RenderTexture source, out float? __state)
|
||||
// ReSharper restore InconsistentNaming
|
||||
{
|
||||
__state = null;
|
||||
if (!source || !RenderManager.IsActive || !RenderManager.Instance.Configuration.AdvancedConfig.HighResBloomCorrection)
|
||||
return;
|
||||
|
||||
__state = __instance.KernelSize;
|
||||
__instance.KernelSize *= source.height / ReferenceHeight;
|
||||
}
|
||||
|
||||
/// <summary>Finalizer of <c>VideoBloom.OnRenderImage</c>: restores <c>KernelSize</c> when the prefix changed it.</summary>
|
||||
/// <param name="__instance">The bloom component on the game camera.</param>
|
||||
/// <param name="__state">Original <c>KernelSize</c> stored by the prefix, or null.</param>
|
||||
[HarmonyFinalizer]
|
||||
[HarmonyPatch("OnRenderImage")]
|
||||
// ReSharper disable InconsistentNaming
|
||||
public static void RestoreKernelSize(VideoBloom __instance, float? __state)
|
||||
// ReSharper restore InconsistentNaming
|
||||
{
|
||||
if (__state.HasValue) __instance.KernelSize = __state.Value;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user