ThomagicRenderer/Runtime/ThoMagicRendererObjectSetti...

146 lines
5.0 KiB
C#

using System;
using UnityEngine;
namespace Assets.ThoMagic.Renderer
{
[AddComponentMenu("ThoMagic/Renderer Object Settings")]
[DisallowMultipleComponent]
[ExecuteAlways]
public class ThoMagicRendererObjectSettings : MonoBehaviour, IInstanceRenderSettings
{
[SerializeField]
private bool _render = true;
[SerializeField]
private bool _overrideRendering;
[Min(0.0f)]
[SerializeField]
private float _renderDistance = 150;
[SerializeField]
private bool _overrideRenderDistance;
[SerializeField]
private bool _renderShadows = true;
[SerializeField]
private bool _overrideRenderShadows;
[Min(0.0f)]
[SerializeField]
private float _shadowDistance = 80;
[SerializeField]
private bool _overrideShadowDistance;
[Range(0.01f, 1f)]
[SerializeField]
private float _densityInDistance = 0.125f;
[SerializeField]
private bool _overrideDensityInDistance;
[SerializeField]
private Vector2 _densityInDistanceFalloff = new Vector2(0.08f, 0.0075f);
[SerializeField]
private bool _overrideDensityInDistanceFalloff;
private ReflectionProbe _reflectionProbe;
public InstanceRenderSettings Settings => new InstanceRenderSettings()
{
Supported = true,
Render = !this._overrideRendering || this._render,
RenderDistance = this._overrideRenderDistance ? this._renderDistance : -1f,
ShadowDistance = this._overrideShadowDistance ? this._shadowDistance : -1f,
Shadows = !this._overrideRenderShadows || this._renderShadows,
DensityInDistance = this._overrideDensityInDistance ? this._densityInDistance : 1f,
DensityInDistanceFalloff = this._overrideDensityInDistanceFalloff ? this._densityInDistanceFalloff : Vector2.zero
};
public bool? Render
{
get => !this._overrideRendering ? new bool?() : new bool?(this._render);
set
{
this._overrideRendering = value.HasValue;
if (!value.HasValue)
return;
this._render = value.Value;
}
}
public float? RenderDistance
{
get => !this._overrideRenderDistance ? new float?() : new float?(this._renderDistance);
set
{
this._overrideRenderDistance = value.HasValue;
if (!value.HasValue)
return;
this._renderDistance = value.Value;
}
}
public bool? RenderShadows
{
get => !this._overrideRenderShadows ? new bool?() : new bool?(this._renderShadows);
set
{
this._overrideRenderShadows = value.HasValue;
if (!value.HasValue)
return;
this._renderShadows = value.Value;
}
}
public float? ShadowDistance
{
get => !this._overrideShadowDistance ? new float?() : new float?(this._shadowDistance);
set
{
this._overrideShadowDistance = value.HasValue;
if (!value.HasValue)
return;
this._shadowDistance = value.Value;
}
}
public float? DensityInDistance
{
get => !this._overrideDensityInDistance ? new float?() : new float?(this._densityInDistance);
set
{
this._overrideDensityInDistance = value.HasValue;
if (!value.HasValue)
return;
this._densityInDistance = value.Value;
}
}
public Vector2? DensityInDistanceFalloff
{
get => !this._overrideDensityInDistanceFalloff ? new Vector2?() : new Vector2?(this._densityInDistanceFalloff);
set
{
this._overrideDensityInDistanceFalloff = value.HasValue;
if (!value.HasValue)
return;
this._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 ThoMagicRendererObjectSettings != this)
return;
CameraRenderer.ReflectionProbeSettings = null;
}
private void OnValidate()
{
if (_reflectionProbe == null || !Application.isEditor)
return;
this._reflectionProbe.RenderProbe();
}
}
}