227 lines
7.4 KiB
C#
227 lines
7.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.Universal;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace Beautify.Universal {
|
|
|
|
public delegate float OnBeforeFocusEvent(float currentFocusDistance);
|
|
|
|
|
|
[ExecuteAlways]
|
|
public class BeautifySettings : MonoBehaviour {
|
|
|
|
[Header("Scene Settings")]
|
|
public Transform sun;
|
|
public Transform depthOfFieldTarget;
|
|
|
|
public OnBeforeFocusEvent OnBeforeFocus;
|
|
|
|
public static float depthOfFieldCurrentFocalPointDistance;
|
|
|
|
public static int bloomExcludeMask;
|
|
|
|
public static int anamorphicFlaresExcludeMask;
|
|
|
|
public static int sharpenExclusionMask;
|
|
|
|
public static bool dofTransparentSupport;
|
|
|
|
public static int dofTransparentLayerMask;
|
|
|
|
public static bool dofTransparentDoubleSided;
|
|
|
|
public static bool dofAlphaTestSupport;
|
|
|
|
public static int dofAlphaTestLayerMask;
|
|
|
|
public static bool dofAlphaTestDoubleSided;
|
|
|
|
public static bool outlineDepthPrepass;
|
|
public static bool outlineUseObjectId;
|
|
public static int outlineLayerMask;
|
|
public static float outlineLayerCutOff;
|
|
|
|
public static bool outlineDepthPrepassUseOptimizedShader;
|
|
|
|
internal static bool _refreshAlphaClipRenderers;
|
|
|
|
static BeautifySettings _instance;
|
|
static Volume _beautifyVolume;
|
|
static Beautify _beautify;
|
|
|
|
/// <summary>
|
|
/// Forces a reset of the internal cached settings of Beautify. Call this method if Beautify settings are not resetted when switching scenes.
|
|
/// </summary>
|
|
public static void UnloadBeautify() {
|
|
_instance = null;
|
|
_beautifyVolume = null;
|
|
_beautify = null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a reference to the Beautify Settings component attached to the Post Processing Layer or camera
|
|
/// </summary>
|
|
/// <value>The instance.</value>
|
|
public static BeautifySettings instance {
|
|
get {
|
|
if (_instance == null) {
|
|
#if UNITY_2023_1_OR_NEWER
|
|
_instance = FindAnyObjectByType<BeautifySettings>();
|
|
#else
|
|
_instance = FindObjectOfType<BeautifySettings>();
|
|
#endif
|
|
if (_instance == null) {
|
|
// Check if there's a single volume component, then add BeautifySettings singleton to that gameobject
|
|
_beautifyVolume = FindBeautifyVolume();
|
|
if (_beautifyVolume == null) {
|
|
return null;
|
|
}
|
|
GameObject go = _beautifyVolume.gameObject;
|
|
_instance = go.GetComponent<BeautifySettings>();
|
|
if (_instance == null) {
|
|
_instance = go.AddComponent<BeautifySettings>();
|
|
}
|
|
}
|
|
}
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
|
|
static Volume FindBeautifyVolume() {
|
|
#if UNITY_2023_1_OR_NEWER
|
|
Volume[] vols = FindObjectsByType<Volume>(FindObjectsSortMode.None);
|
|
#else
|
|
Volume[] vols = FindObjectsOfType<Volume>();
|
|
#endif
|
|
foreach (Volume volume in vols) {
|
|
if (volume.sharedProfile != null && volume.sharedProfile.Has<Beautify>()) {
|
|
_beautifyVolume = volume;
|
|
return volume;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a reference to the settings of Beautify in the Post Processing Profile
|
|
/// </summary>
|
|
/// <value>The shared settings.</value>
|
|
public static Beautify sharedSettings {
|
|
get {
|
|
if (_beautify != null) return _beautify;
|
|
if (_beautifyVolume == null) FindBeautifyVolume();
|
|
if (_beautifyVolume == null) return null;
|
|
|
|
bool foundEffectSettings = _beautifyVolume.sharedProfile.TryGet(out _beautify);
|
|
if (!foundEffectSettings) {
|
|
Debug.Log("Cant load Beautify settings");
|
|
return null;
|
|
}
|
|
return _beautify;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the profile of the volume in the scene where Beautify has been found
|
|
/// </summary>
|
|
public static VolumeProfile currentProfile {
|
|
get {
|
|
if (_beautifyVolume == null) {
|
|
FindBeautifyVolume();
|
|
}
|
|
if (_beautifyVolume == null) return null;
|
|
return _beautifyVolume.sharedProfile;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a copy of the settings of Beautify in the Post Processing Profile
|
|
/// </summary>
|
|
/// <value>The settings.</value>
|
|
public static Beautify settings {
|
|
get {
|
|
if (_beautify != null) return _beautify;
|
|
if (_beautifyVolume == null) FindBeautifyVolume();
|
|
if (_beautifyVolume == null) return null;
|
|
|
|
bool foundEffectSettings = _beautifyVolume.profile.TryGet(out _beautify);
|
|
if (!foundEffectSettings) {
|
|
Debug.Log("Cant load Beautify settings");
|
|
return null;
|
|
}
|
|
return _beautify;
|
|
}
|
|
}
|
|
|
|
|
|
public static void Blink(float duration, float maxValue = 1) {
|
|
if (duration <= 0)
|
|
return;
|
|
BeautifySettings i = instance;
|
|
if (i == null) return;
|
|
i.StartCoroutine(i.DoBlink(duration, maxValue));
|
|
}
|
|
|
|
IEnumerator DoBlink(float duration, float maxValue) {
|
|
|
|
Beautify beautify = settings;
|
|
if (beautify == null) yield break;
|
|
float start = Time.time;
|
|
WaitForEndOfFrame w = new WaitForEndOfFrame();
|
|
beautify.vignettingBlink.overrideState = true;
|
|
float t;
|
|
// Close
|
|
do {
|
|
t = (Time.time - start) / duration;
|
|
if (t > 1f)
|
|
t = 1f;
|
|
float easeOut = t * (2f - t);
|
|
beautify.vignettingBlink.value = easeOut * maxValue;
|
|
yield return w;
|
|
} while (t < 1f);
|
|
|
|
// Open
|
|
start = Time.time;
|
|
do {
|
|
t = (Time.time - start) / duration;
|
|
if (t > 1f)
|
|
t = 1f;
|
|
float easeIn = t * t;
|
|
beautify.vignettingBlink.value = (1f - easeIn) * maxValue;
|
|
yield return w;
|
|
} while (t < 1f);
|
|
beautify.vignettingBlink.overrideState = false;
|
|
}
|
|
|
|
void OnEnable() {
|
|
#if UNITY_EDITOR
|
|
if (!Application.isPlaying) {
|
|
BeautifyRendererFeature.StripBeautifyFeatures();
|
|
}
|
|
#endif
|
|
SceneManager.sceneLoaded += SceneManager_sceneLoaded;
|
|
}
|
|
|
|
private void OnDisable() {
|
|
SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
|
|
}
|
|
|
|
private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1) {
|
|
UnloadBeautify();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Updates the list of alpha clip renderers
|
|
/// </summary>
|
|
public static void UpdateAlphaClipRenderers() {
|
|
_refreshAlphaClipRenderers = true;
|
|
}
|
|
|
|
}
|
|
}
|