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