ThomagicRenderer/CameraRenderSettings.cs

162 lines
5.2 KiB
C#

using System;
using UnityEngine;
namespace Assets.ThoMagic.Renderer
{
[DisallowMultipleComponent]
[ExecuteAlways]
public class ThoMagicRendererCameraSettings : MonoBehaviour, IInstanceRenderSettings
{
[SerializeField]
private bool _supported;
[SerializeField]
private bool _overrideSupported;
[SerializeField]
private bool _render;
[SerializeField]
private bool _overrideRendering;
[Min(0.0f)]
[SerializeField]
private float _renderDistance;
[SerializeField]
private bool _overrideRenderDistance;
[SerializeField]
private bool _renderShadows;
[SerializeField]
private bool _overrideRenderShadows;
[Min(0.0f)]
[SerializeField]
private float _shadowDistance;
[SerializeField]
private bool _overrideShadowDistance;
[Range(0.01f, 1f)]
[SerializeField]
private float _densityInDistance;
[SerializeField]
private bool _overrideDensityInDistance;
[SerializeField]
private Vector2 _densityInDistanceFalloff;
[SerializeField]
private bool _overrideDensityInDistanceFalloff;
private ReflectionProbe _reflectionProbe;
public InstanceRenderSettings Settings => new InstanceRenderSettings()
{
Supported = !_overrideSupported || _supported,
Render = !_overrideRendering || _render,
RenderDistance = _overrideRenderDistance ? _renderDistance : -1f,
ShadowDistance = _overrideShadowDistance ? _shadowDistance : -1f,
Shadows = !_overrideRenderShadows || _renderShadows,
DensityInDistance = _overrideDensityInDistance ? _densityInDistance : 1f,
DensityInDistanceFalloff = _overrideDensityInDistanceFalloff ? _densityInDistanceFalloff : Vector2.zero
};
public bool? Supported
{
get => !_overrideSupported ? new bool?() : new bool?(_supported);
set
{
_overrideSupported = value.HasValue;
if (!value.HasValue)
return;
_supported = value.Value;
}
}
public bool? Render
{
get => !_overrideRendering ? new bool?() : new bool?(_render);
set
{
_overrideRendering = value.HasValue;
if (!value.HasValue)
return;
_render = value.Value;
}
}
public float? RenderDistance
{
get => !_overrideRenderDistance ? new float?() : new float?(_renderDistance);
set
{
_overrideRenderDistance = value.HasValue;
if (!value.HasValue)
return;
_renderDistance = value.Value;
}
}
public bool? RenderShadows
{
get => !_overrideRenderShadows ? new bool?() : new bool?(_renderShadows);
set
{
_overrideRenderShadows = value.HasValue;
if (!value.HasValue)
return;
_renderShadows = value.Value;
}
}
public float? ShadowDistance
{
get => !_overrideShadowDistance ? new float?() : new float?(_shadowDistance);
set
{
_overrideShadowDistance = value.HasValue;
if (!value.HasValue)
return;
_shadowDistance = value.Value;
}
}
public float? DensityInDistance
{
get => !_overrideDensityInDistance ? new float?() : new float?(_densityInDistance);
set
{
_overrideDensityInDistance = value.HasValue;
if (!value.HasValue)
return;
_densityInDistance = value.Value;
}
}
public Vector2? DensityInDistanceFalloff
{
get => !_overrideDensityInDistanceFalloff ? new Vector2?() : new Vector2?(_densityInDistanceFalloff);
set
{
_overrideDensityInDistanceFalloff = value.HasValue;
if (!value.HasValue)
return;
_densityInDistanceFalloff = value.Value;
}
}
private void OnEnable()
{
_reflectionProbe = GetComponent<ReflectionProbe>();
if (_reflectionProbe == null)
return;
CameraRenderer.ReflectionProbeSettings = this;
}
private void OnDisable()
{
if (_reflectionProbe == null || CameraRenderer.ReflectionProbeSettings as ThoMagicRendererCameraSettings == this)
return;
CameraRenderer.ReflectionProbeSettings = null;
}
private void OnValidate()
{
if (_reflectionProbe == null || !Application.isEditor)
return;
_reflectionProbe.RenderProbe();
}
}
}