using UnityEngine; namespace DeepSky.Haze; [ExecuteInEditMode] [AddComponentMenu("DeepSky Haze/Zone", 52)] public class DS_HazeZone : MonoBehaviour { [SerializeField] private DS_HazeContext m_Context = new DS_HazeContext(); [SerializeField] [Range(0f, 250f)] private int m_Priority; [SerializeField] [Range(0.001f, 1f)] private float m_BlendRange = 0.1f; private Bounds m_AABB; private float m_BlendRangeInverse; public DS_HazeContext Context => m_Context; public int Priority { get { return m_Priority; } set { m_Priority = ((value > 0) ? value : 0); } } public float BlendRange { get { return m_BlendRange; } set { m_BlendRange = Mathf.Clamp01(value); } } private void Setup() { m_AABB = new Bounds(Vector3.zero, base.transform.localScale); m_BlendRangeInverse = 1f / Mathf.Max(Mathf.Min(m_AABB.extents.x, m_AABB.extents.y, m_AABB.extents.z) * m_BlendRange, Mathf.Epsilon); } private void Start() { Setup(); } private void OnValidate() { Setup(); } public bool Contains(Vector3 position) { if (base.transform.hasChanged) { Setup(); } Vector3 point = base.transform.InverseTransformPoint(position); point.Scale(base.transform.localScale); return m_AABB.Contains(point); } public float GetBlendWeight(Vector3 position) { Vector3 vector = base.transform.InverseTransformPoint(position); vector.Scale(base.transform.localScale); float num = Mathf.Abs(m_AABB.extents.x - Mathf.Abs(vector.x)); float num2 = Mathf.Abs(m_AABB.extents.y - Mathf.Abs(vector.y)); float num3 = Mathf.Abs(m_AABB.extents.z - Mathf.Abs(vector.z)); float num4 = Mathf.Min(num, num2, num3); return Mathf.Clamp01(num4 * m_BlendRangeInverse); } public static bool operator >(DS_HazeZone c1, DS_HazeZone c2) { if (c1.m_Priority == c2.m_Priority) { return (Vector3.Dot(c1.m_AABB.extents, c1.m_AABB.extents) > Vector3.Dot(c2.m_AABB.extents, c2.m_AABB.extents)) ? true : false; } return (c1.m_Priority > c2.m_Priority) ? true : false; } public static bool operator <(DS_HazeZone c1, DS_HazeZone c2) { if (c1.m_Priority == c2.m_Priority) { return (Vector3.Dot(c1.m_AABB.extents, c1.m_AABB.extents) < Vector3.Dot(c2.m_AABB.extents, c2.m_AABB.extents)) ? true : false; } return (c1.m_Priority < c2.m_Priority) ? true : false; } }