using UnityEngine;
using UnityEngine.Rendering;
namespace GeNa.Core
{
public enum ReflectionProbeRenderResolution
{
Resolution16,
Resolution32,
Resolution64,
Resolution128,
Resolution256,
Resolution512,
Resolution1024,
Resolution2048,
}
[ExecuteAlways]
public class RiverReflectionProbeManager : MonoBehaviour
{
#region Varaibles
#region Public Varaibles
public LayerMask LayerMask
{
get => m_layerMask;
set
{
if (m_layerMask != value)
{
m_layerMask = value;
m_layerMaskValue = m_layerMask.value;
ApplyReflectionProbe();
}
}
}
public ReflectionProbeMode ProbeMode
{
get => m_probeMode;
set
{
if (m_probeMode != value)
{
m_probeMode = value;
ApplyReflectionProbe();
}
}
}
public ReflectionProbeRefreshMode ProbeRefreshMode
{
get => m_probeRefreshMode;
set
{
if (m_probeRefreshMode != value)
{
m_probeRefreshMode = value;
ApplyReflectionProbe();
}
}
}
public ReflectionProbeTimeSlicingMode ProbeTimeSlicingMode
{
get => m_probeTimeSlicingMode;
set
{
if (m_probeTimeSlicingMode != value)
{
m_probeTimeSlicingMode = value;
ApplyReflectionProbe();
}
}
}
public ReflectionProbeRenderResolution ProbeRenderResolution
{
get => m_probeRenderResolution;
set
{
if (m_probeRenderResolution != value)
{
m_probeRenderResolution = value;
ApplyReflectionProbe();
}
}
}
public float RenderDistance
{
get => m_renderDistance;
set
{
if (m_renderDistance != value)
{
m_renderDistance = value;
ApplyReflectionProbe();
}
}
}
public ReflectionProbe m_reflectionProbe;
#endregion
#region Private Varaibles
[SerializeField] private LayerMask m_layerMask = -1;
[SerializeField] private ReflectionProbeMode m_probeMode = ReflectionProbeMode.Realtime;
[SerializeField] private ReflectionProbeRefreshMode m_probeRefreshMode = ReflectionProbeRefreshMode.OnAwake;
[SerializeField] private ReflectionProbeTimeSlicingMode m_probeTimeSlicingMode = ReflectionProbeTimeSlicingMode.IndividualFaces;
[SerializeField] private ReflectionProbeRenderResolution m_probeRenderResolution = ReflectionProbeRenderResolution.Resolution64;
[SerializeField] private float m_renderDistance = 2000f;
[SerializeField] private int m_layerMaskValue = -1;
#endregion
#endregion
#region Unity Functions
///
/// Execute on enable
///
private void OnEnable()
{
ApplyReflectionProbe();
}
#endregion
#region Private Functions
///
/// Applies the changes to the reflection probe
/// Also executes this function OnEnable
///
private void ApplyReflectionProbe()
{
if (m_reflectionProbe == null)
{
m_reflectionProbe = GetComponent();
if (m_reflectionProbe == null)
{
m_reflectionProbe = gameObject.AddComponent();
}
}
m_reflectionProbe.mode = ProbeMode;
m_reflectionProbe.refreshMode = ProbeRefreshMode;
m_reflectionProbe.timeSlicingMode = ProbeTimeSlicingMode;
m_reflectionProbe.cullingMask = m_layerMaskValue;
m_reflectionProbe.farClipPlane = RenderDistance;
m_reflectionProbe.resolution = SetResolution();
if (IsInSceneAndActive())
{
m_reflectionProbe.RenderProbe();
}
}
///
/// Checks to see if the object is active and in an active scene
///
///
private bool IsInSceneAndActive()
{
if (gameObject.activeInHierarchy)
{
if (gameObject.scene.isLoaded)
{
return true;
}
}
return false;
}
///
/// Sets the render resolution of the probe
///
///
private int SetResolution()
{
switch (ProbeRenderResolution)
{
case ReflectionProbeRenderResolution.Resolution16:
return 16;
case ReflectionProbeRenderResolution.Resolution32:
return 32;
case ReflectionProbeRenderResolution.Resolution64:
return 64;
case ReflectionProbeRenderResolution.Resolution128:
return 128;
case ReflectionProbeRenderResolution.Resolution256:
return 256;
case ReflectionProbeRenderResolution.Resolution512:
return 512;
case ReflectionProbeRenderResolution.Resolution1024:
return 1024;
case ReflectionProbeRenderResolution.Resolution2048:
return 2048;
default:
return 32;
}
}
#endregion
}
}