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(); 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(); } } }