| using System; | 
|   | 
| namespace UnityEngine.PostProcessing | 
| { | 
|     // Small wrapper on top of AnimationCurve to handle zero-key curves and keyframe looping | 
|   | 
|     [Serializable] | 
|     public sealed class ColorGradingCurve | 
|     { | 
|         public AnimationCurve curve; | 
|   | 
|         [SerializeField] | 
|         bool m_Loop; | 
|   | 
|         [SerializeField] | 
|         float m_ZeroValue; | 
|   | 
|         [SerializeField] | 
|         float m_Range; | 
|   | 
|         AnimationCurve m_InternalLoopingCurve; | 
|   | 
|         public ColorGradingCurve(AnimationCurve curve, float zeroValue, bool loop, Vector2 bounds) | 
|         { | 
|             this.curve = curve; | 
|             m_ZeroValue = zeroValue; | 
|             m_Loop = loop; | 
|             m_Range = bounds.magnitude; | 
|         } | 
|   | 
|         public void Cache() | 
|         { | 
|             if (!m_Loop) | 
|                 return; | 
|   | 
|             var length = curve.length; | 
|   | 
|             if (length < 2) | 
|                 return; | 
|   | 
|             if (m_InternalLoopingCurve == null) | 
|                 m_InternalLoopingCurve = new AnimationCurve(); | 
|   | 
|             var prev = curve[length - 1]; | 
|             prev.time -= m_Range; | 
|             var next = curve[0]; | 
|             next.time += m_Range; | 
|             m_InternalLoopingCurve.keys = curve.keys; | 
|             m_InternalLoopingCurve.AddKey(prev); | 
|             m_InternalLoopingCurve.AddKey(next); | 
|         } | 
|   | 
|         public float Evaluate(float t) | 
|         { | 
|             if (curve.length == 0) | 
|                 return m_ZeroValue; | 
|   | 
|             if (!m_Loop || curve.length == 1) | 
|                 return curve.Evaluate(t); | 
|   | 
|             return m_InternalLoopingCurve.Evaluate(t); | 
|         } | 
|     } | 
| } |