A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using System.Collections.ObjectModel;
4using System.Diagnostics;
5using System.Linq;
6using System.Reflection;
7using System.Runtime.CompilerServices;
8
9namespace UnityEngine.Rendering
10{
11 // We need this base class to be able to store a list of VolumeParameter in collections as we
12 // can't store VolumeParameter<T> with variable T types in the same collection. As a result some
13 // of the following is a bit hacky...
14
15 /// <summary>
16 /// The base class for all parameters types stored in a <see cref="VolumeComponent"/>.
17 /// </summary>
18 /// <seealso cref="VolumeParameter{T}"/>
19 public abstract class VolumeParameter : ICloneable
20 {
21 /// <summary>
22 /// A beautified string for debugger output. This is set on a <c>DebuggerDisplay</c> on every
23 /// parameter types.
24 /// </summary>
25 public const string k_DebuggerDisplay = "{m_Value} ({m_OverrideState})";
26
27 /// <summary>
28 /// The current override state for this parameter. The Volume system considers overriden parameters
29 /// for blending, and ignores non-overriden ones.
30 /// </summary>
31 /// <seealso cref="overrideState"/>
32 [SerializeField]
33 protected bool m_OverrideState;
34
35 /// <summary>
36 /// The current override state for this parameter. The Volume system considers overriden parameters
37 /// for blending, and ignores non-overriden ones. It is also used in the VolumeStack to determine whether
38 /// a given parameter has been overridden and thus needs to be reset to its default state in the next update.
39 /// </summary>
40 /// <remarks>
41 /// You can override this property to define custom behaviors when the override state
42 /// changes.
43 /// </remarks>
44 /// <seealso cref="m_OverrideState"/>
45 public virtual bool overrideState
46 {
47 get => m_OverrideState;
48 set => m_OverrideState = value;
49 }
50
51 internal abstract void Interp(VolumeParameter from, VolumeParameter to, float t);
52
53 /// <summary>
54 /// Casts and gets the typed value of this parameter.
55 /// </summary>
56 /// <typeparam name="T">The type of the value stored in this parameter</typeparam>
57 /// <returns>A value of type <typeparamref name="T"/>.</returns>
58 /// <remarks>
59 /// This method is unsafe and does not do any type checking.
60 /// </remarks>
61 public T GetValue<T>()
62 {
63 return ((VolumeParameter<T>)this).value;
64 }
65
66 /// <summary>
67 /// Sets the value of this parameter to the value in <paramref name="parameter"/>.
68 /// </summary>
69 /// <param name="parameter">The <see cref="VolumeParameter"/> to copy the value from.</param>
70 public abstract void SetValue(VolumeParameter parameter);
71
72 /// <summary>
73 /// Unity calls this method when the parent <see cref="VolumeComponent"/> loads.
74 /// </summary>
75 /// <remarks>
76 /// Use this if you need to access fields and properties that you can not access in
77 /// the constructor of a <c>ScriptableObject</c>. (<see cref="VolumeParameter"/> are
78 /// generally declared and initialized in a <see cref="VolumeComponent"/>, which is a
79 /// <c>ScriptableObject</c>). Unity calls this right after it constructs the parent
80 /// <see cref="VolumeComponent"/>, thus allowing access to previously
81 /// inaccessible fields and properties.
82 /// </remarks>
83 protected internal virtual void OnEnable()
84 {
85 }
86
87 /// <summary>
88 /// Unity calls this method when the parent <see cref="VolumeComponent"/> goes out of scope.
89 /// </summary>
90 protected internal virtual void OnDisable()
91 {
92 }
93
94 /// <summary>
95 /// Checks if a given type is an <see cref="ObjectParameter{T}"/>.
96 /// </summary>
97 /// <param name="type">The type to check.</param>
98 /// <returns><c>true</c> if <paramref name="type"/> is an <see cref="ObjectParameter{T}"/>,
99 /// <c>false</c> otherwise.</returns>
100 public static bool IsObjectParameter(Type type)
101 {
102 if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObjectParameter<>))
103 return true;
104
105 return type.BaseType != null
106 && IsObjectParameter(type.BaseType);
107 }
108
109 /// <summary>
110 /// Override this method to free all allocated resources
111 /// </summary>
112 public virtual void Release() { }
113
114 /// <summary>
115 /// Clones the current instance of the <see cref="VolumeParameter"/>
116 /// </summary>
117 /// <returns>A new created instance with the same values as the current instance of <see cref="VolumeParameter"/></returns>
118
119 public abstract object Clone();
120 }
121
122 /// <summary>
123 /// A generic implementation of <see cref="VolumeParameter"/>. Custom parameters should derive
124 /// from this class and implement their own behavior.
125 /// </summary>
126 /// <typeparam name="T">The type of value to hold in this parameter.</typeparam>
127 /// <remarks>
128 /// <typeparamref name="T"/> should a serializable type.
129 /// Due to limitations with the serialization system in Unity, you should not use this class
130 /// directly to declare parameters in a <see cref="VolumeComponent"/>. Instead, use one of the
131 /// pre-flatten types (like <see cref="FloatParameter"/>, or make your own by extending this
132 /// class.
133 /// </remarks>
134 /// <example>
135 /// <para>This sample code shows how to make a custom parameter holding a <c>float</c>:</para>
136 /// <code>
137 /// using UnityEngine.Rendering;
138 ///
139 /// [Serializable]
140 /// public sealed class MyFloatParameter : VolumeParameter<float>
141 /// {
142 /// public MyFloatParameter(float value, bool overrideState = false)
143 /// : base(value, overrideState) { }
144 ///
145 /// public sealed override void Interp(float from, float to, float t)
146 /// {
147 /// m_Value = from + (to - from) * t;
148 /// }
149 /// }
150 /// </code>
151 /// </example>
152 /// <seealso cref="VolumeParameter"/>
153 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
154 public class VolumeParameter<T> : VolumeParameter, IEquatable<VolumeParameter<T>>
155 {
156 /// <summary>
157 /// The value stored and serialized by this parameter.
158 /// </summary>
159 [SerializeField]
160 protected T m_Value;
161
162 /// <summary>
163 /// The value that this parameter stores.
164 /// </summary>
165 /// <remarks>
166 /// You can override this property to define custom behaviors when the value is changed.
167 /// </remarks>
168 public virtual T value
169 {
170 get => m_Value;
171 set => m_Value = value;
172 }
173
174 /// <summary>
175 /// Creates a new <see cref="VolumeParameter{T}"/> instance.
176 /// </summary>
177 public VolumeParameter()
178 : this(default, false)
179 {
180 }
181
182 /// <summary>
183 /// Creates a new <see cref="VolumeParameter{T}"/> instance.
184 /// </summary>
185 /// <param name="value">The initial value to store in the parameter.</param>
186 /// <param name="overrideState">The initial override state for the parameter.</param>
187 protected VolumeParameter(T value, bool overrideState = false)
188 {
189 m_Value = value;
190 this.overrideState = overrideState;
191 }
192
193 internal override void Interp(VolumeParameter from, VolumeParameter to, float t)
194 {
195 // Note: this is relatively unsafe (assumes that from and to are both holding type T)
196 Interp((from as VolumeParameter<T>).value, (to as VolumeParameter<T>).value, t);
197 }
198
199 /// <summary>
200 /// Interpolates two values using a factor <paramref name="t"/>.
201 /// </summary>
202 /// <remarks>
203 /// By default, this method does a "snap" interpolation, meaning it returns the value
204 /// <paramref name="to"/> if <paramref name="t"/> is higher than 0, and <paramref name="from"/>
205 /// otherwise.
206 /// </remarks>
207 /// <param name="from">The start value.</param>
208 /// <param name="to">The end value.</param>
209 /// <param name="t">The interpolation factor in range [0,1].</param>
210 public virtual void Interp(T from, T to, float t)
211 {
212 // Default interpolation is naive
213 m_Value = t > 0f ? to : from;
214 }
215
216 /// <summary>
217 /// Sets the value for this parameter and sets its override state to <c>true</c>.
218 /// </summary>
219 /// <param name="x">The value to assign to this parameter.</param>
220 public void Override(T x)
221 {
222 overrideState = true;
223 m_Value = x;
224 }
225
226 /// <summary>
227 /// Sets the value of this parameter to the value in <paramref name="parameter"/>.
228 /// </summary>
229 /// <param name="parameter">The <see cref="VolumeParameter"/> to copy the value from.</param>
230 [MethodImpl(MethodImplOptions.AggressiveInlining)]
231 public override void SetValue(VolumeParameter parameter)
232 {
233 m_Value = ((VolumeParameter<T>)parameter).m_Value;
234 }
235
236 /// <summary>
237 /// Returns a hash code for the current object.
238 /// </summary>
239 /// <returns>A hash code for the current object.</returns>
240 public override int GetHashCode()
241 {
242 unchecked
243 {
244 int hash = 17;
245 hash = hash * 23 + overrideState.GetHashCode();
246
247 if (!EqualityComparer<T>.Default.Equals(value, default)) // Catches null for references with boxing of value types
248 hash = hash * 23 + value.GetHashCode();
249
250 return hash;
251 }
252 }
253
254 /// <summary>
255 /// Returns a string that represents the current object.
256 /// </summary>
257 /// <returns>A string that represents the current object.</returns>
258 public override string ToString() => $"{value} ({overrideState})";
259
260 /// <summary>
261 /// Compares the value in a parameter with another value of the same type.
262 /// </summary>
263 /// <param name="lhs">The first value in a <see cref="VolumeParameter"/>.</param>
264 /// <param name="rhs">The second value.</param>
265 /// <returns><c>true</c> if both values are equal, <c>false</c> otherwise.</returns>
266 public static bool operator ==(VolumeParameter<T> lhs, T rhs) => lhs != null && !ReferenceEquals(lhs.value, null) && lhs.value.Equals(rhs);
267
268 /// <summary>
269 /// Compares the value store in a parameter with another value of the same type.
270 /// </summary>
271 /// <param name="lhs">The first value in a <see cref="VolumeParameter"/>.</param>
272 /// <param name="rhs">The second value.</param>
273 /// <returns><c>false</c> if both values are equal, <c>true</c> otherwise</returns>
274 public static bool operator !=(VolumeParameter<T> lhs, T rhs) => !(lhs == rhs);
275
276 /// <summary>
277 /// Checks if this parameter is equal to another.
278 /// </summary>
279 /// <param name="other">The other parameter to check against.</param>
280 /// <returns><c>true</c> if both parameters are equal, <c>false</c> otherwise</returns>
281 public bool Equals(VolumeParameter<T> other)
282 {
283 if (ReferenceEquals(null, other))
284 return false;
285
286 if (ReferenceEquals(this, other))
287 return true;
288
289 return EqualityComparer<T>.Default.Equals(m_Value, other.m_Value);
290 }
291
292 /// <summary>
293 /// Determines whether two object instances are equal.
294 /// </summary>
295 /// <param name="obj">The object to compare with the current object.</param>
296 /// <returns><c>true</c> if the specified object is equal to the current object, <c>false</c> otherwise.</returns>
297 public override bool Equals(object obj)
298 {
299 if (ReferenceEquals(null, obj))
300 return false;
301
302 if (ReferenceEquals(this, obj))
303 return true;
304
305 if (obj.GetType() != GetType())
306 return false;
307
308 return Equals((VolumeParameter<T>)obj);
309 }
310
311 /// <inheritdoc/>
312 public override object Clone()
313 {
314 return new VolumeParameter<T>(GetValue<T>(), overrideState);
315 }
316
317 /// <summary>
318 /// Explicitly downcast a <see cref="VolumeParameter{T}"/> to a value of type
319 /// <typeparamref name="T"/>.
320 /// </summary>
321 /// <param name="prop">The parameter to downcast.</param>
322 /// <returns>A value of type <typeparamref name="T"/>.</returns>
323 public static explicit operator T(VolumeParameter<T> prop) => prop.m_Value;
324 }
325
326 /// <summary>
327 /// Generic Enum volume parameter.
328 /// </summary>
329 /// <typeparam name="T">The type of value to hold in this parameter.</typeparam>
330 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
331 public sealed class EnumParameter<T> : VolumeParameter<T>
332 {
333 /// <summary>
334 /// Creates a new <see cref="EnumParameter"/> instance.
335 /// </summary>
336 /// <param name="value">The initial value to store in the parameter.</param>
337 /// <param name="overrideState">The initial override state for the parameter.</param>
338 public EnumParameter(T value, bool overrideState = false)
339 : base(value, overrideState) { }
340 }
341
342 /// <summary>
343 /// A <see cref="VolumeParameter"/> that holds a <c>bool</c> value.
344 /// </summary>
345 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
346 public class BoolParameter : VolumeParameter<bool>
347 {
348 /// <summary>
349 /// Creates a new <see cref="BoolParameter"/> instance.
350 /// </summary>
351 /// <param name="value">The initial value to store in the parameter</param>
352 /// <param name="overrideState">The initial override state for the parameter</param>
353 public BoolParameter(bool value, bool overrideState = false)
354 : base(value, overrideState)
355 {
356 }
357
358 /// <summary>
359 /// Creates a new <see cref="BoolParameter"/> instance.
360 /// </summary>
361 /// <param name="value">The initial value to store in the parameter</param>
362 /// <param name="displayType">The display type to use for the parameter</param>
363 /// <param name="overrideState">The initial override state for the parameter</param>
364 public BoolParameter(bool value, DisplayType displayType, bool overrideState = false)
365 : base(value, overrideState)
366 {
367 this.displayType = displayType;
368 }
369
370 /// <summary>
371 /// Boolean widget type.
372 /// </summary>
373 public enum DisplayType
374 {
375 /// <summary> Display boolean parameter as checkbox. </summary>
376 Checkbox,
377 /// <summary> Display boolean parameter as enum popup with Disabled/Enabled options. </summary>
378 EnumPopup
379 }
380
381 /// <summary>
382 /// Type of widget used to display the <see cref="BoolParameter"/> in the UI.
383 /// </summary>
384 [NonSerialized]
385 public DisplayType displayType = DisplayType.Checkbox;
386 }
387
388 /// <summary>
389 /// A <see cref="VolumeParameter"/> that holds a <c>LayerMask</c> value.
390 /// </summary>
391 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
392 public class LayerMaskParameter : VolumeParameter<LayerMask>
393 {
394 /// <summary>
395 /// Creates a new <see cref="LayerMaskParameter"/> instance.
396 /// </summary>
397 /// <param name="value">The initial value to store in the parameter.</param>
398 /// <param name="overrideState">The initial override state for the parameter.</param>
399 public LayerMaskParameter(LayerMask value, bool overrideState = false)
400 : base(value, overrideState) { }
401 }
402
403 /// <summary>
404 /// A <see cref="VolumeParameter"/> that holds a <c>LayerMask</c> value.
405 /// </summary>
406 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
407 public class RenderingLayerMaskParameter : VolumeParameter<RenderingLayerMask>
408 {
409 /// <summary>
410 /// Creates a new <see cref="LayerMaskParameter"/> instance.
411 /// </summary>
412 /// <param name="value">The initial value to store in the parameter.</param>
413 /// <param name="overrideState">The initial override state for the parameter.</param>
414 public RenderingLayerMaskParameter(RenderingLayerMask value, bool overrideState = false)
415 : base(value, overrideState) { }
416 }
417
418 /// <summary>
419 /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value.
420 /// </summary>
421 /// <seealso cref="MinIntParameter"/>
422 /// <seealso cref="MaxIntParameter"/>
423 /// <seealso cref="ClampedIntParameter"/>
424 /// <seealso cref="NoInterpIntParameter"/>
425 /// <seealso cref="NoInterpMinIntParameter"/>
426 /// <seealso cref="NoInterpMaxIntParameter"/>
427 /// <seealso cref="NoInterpClampedIntParameter"/>
428 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
429 public class IntParameter : VolumeParameter<int>
430 {
431 /// <summary>
432 /// Creates a new <see cref="IntParameter"/> instance.
433 /// </summary>
434 /// <param name="value">The initial value to store in the parameter.</param>
435 /// <param name="overrideState">The initial override state for the parameter.</param>
436 public IntParameter(int value, bool overrideState = false)
437 : base(value, overrideState) { }
438
439 /// <summary>
440 /// Interpolates between two <c>int</c> values.
441 /// </summary>
442 /// <param name="from">The start value</param>
443 /// <param name="to">The end value</param>
444 /// <param name="t">The interpolation factor in range [0,1]</param>
445 public sealed override void Interp(int from, int to, float t)
446 {
447 // Int snapping interpolation. Don't use this for enums as they don't necessarily have
448 // contiguous values. Use the default interpolator instead (same as bool).
449 m_Value = (int)(from + (to - from) * t);
450 }
451 }
452
453 /// <summary>
454 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value.
455 /// </summary>
456 /// <seealso cref="IntParameter"/>
457 /// <seealso cref="MinIntParameter"/>
458 /// <seealso cref="MaxIntParameter"/>
459 /// <seealso cref="ClampedIntParameter"/>
460 /// <seealso cref="NoInterpMinIntParameter"/>
461 /// <seealso cref="NoInterpMaxIntParameter"/>
462 /// <seealso cref="NoInterpClampedIntParameter"/>
463 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
464 public class NoInterpIntParameter : VolumeParameter<int>
465 {
466 /// <summary>
467 /// Creates a new <see cref="NoInterpIntParameter"/> instance.
468 /// </summary>
469 /// <param name="value">The initial value to store in the parameter.</param>
470 /// <param name="overrideState">The initial override state for the parameter.</param>
471 public NoInterpIntParameter(int value, bool overrideState = false)
472 : base(value, overrideState) { }
473 }
474
475 /// <summary>
476 /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped to a
477 /// minimum value.
478 /// </summary>
479 /// <seealso cref="IntParameter"/>
480 /// <seealso cref="MaxIntParameter"/>
481 /// <seealso cref="ClampedIntParameter"/>
482 /// <seealso cref="NoInterpIntParameter"/>
483 /// <seealso cref="NoInterpMinIntParameter"/>
484 /// <seealso cref="NoInterpMaxIntParameter"/>
485 /// <seealso cref="NoInterpClampedIntParameter"/>
486 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
487 public class MinIntParameter : IntParameter
488 {
489 /// <summary>
490 /// The minimum value to clamp this parameter to.
491 /// </summary>
492 [NonSerialized]
493 public int min;
494
495 /// <summary>
496 /// The value that this parameter stores.
497 /// </summary>
498 /// <remarks>
499 /// You can override this property to define custom behaviors when the value is changed.
500 /// </remarks>
501 public override int value
502 {
503 get => m_Value;
504 set => m_Value = Mathf.Max(value, min);
505 }
506
507 /// <summary>
508 /// Creates a new <see cref="MinIntParameter"/> instance.
509 /// </summary>
510 /// <param name="value">The initial value to store in the parameter.</param>
511 /// <param name="min">The minimum value to clamp the parameter to.</param>
512 /// <param name="overrideState">The initial override state for the parameter.</param>
513 public MinIntParameter(int value, int min, bool overrideState = false)
514 : base(value, overrideState)
515 {
516 this.min = min;
517 }
518 }
519
520 /// <summary>
521 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value that
522 /// clamped to a minimum value.
523 /// </summary>
524 /// <seealso cref="IntParameter"/>
525 /// <seealso cref="MinIntParameter"/>
526 /// <seealso cref="MaxIntParameter"/>
527 /// <seealso cref="ClampedIntParameter"/>
528 /// <seealso cref="NoInterpIntParameter"/>
529 /// <seealso cref="NoInterpMaxIntParameter"/>
530 /// <seealso cref="NoInterpClampedIntParameter"/>
531 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
532 public class NoInterpMinIntParameter : VolumeParameter<int>
533 {
534 /// <summary>
535 /// The minimum value to clamp this parameter to.
536 /// </summary>
537 [NonSerialized]
538 public int min;
539
540 /// <summary>
541 /// The value that this parameter stores.
542 /// </summary>
543 /// <remarks>
544 /// You can override this property to define custom behaviors when the value is changed.
545 /// </remarks>
546 public override int value
547 {
548 get => m_Value;
549 set => m_Value = Mathf.Max(value, min);
550 }
551
552 /// <summary>
553 /// Creates a new <see cref="NoInterpMinIntParameter"/> instance.
554 /// </summary>
555 /// <param name="value">The initial value to store in the parameter.</param>
556 /// <param name="min">The minimum value to clamp the parameter to.</param>
557 /// <param name="overrideState">The initial override state for the parameter.</param>
558 public NoInterpMinIntParameter(int value, int min, bool overrideState = false)
559 : base(value, overrideState)
560 {
561 this.min = min;
562 }
563 }
564
565 /// <summary>
566 /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped to a
567 /// maximum value.
568 /// </summary>
569 /// <seealso cref="IntParameter"/>
570 /// <seealso cref="MinIntParameter"/>
571 /// <seealso cref="ClampedIntParameter"/>
572 /// <seealso cref="NoInterpIntParameter"/>
573 /// <seealso cref="NoInterpMinIntParameter"/>
574 /// <seealso cref="NoInterpMaxIntParameter"/>
575 /// <seealso cref="NoInterpClampedIntParameter"/>
576 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
577 public class MaxIntParameter : IntParameter
578 {
579 /// <summary>
580 /// The maximum value to clamp this parameter to.
581 /// </summary>
582 [NonSerialized]
583 public int max;
584
585 /// <summary>
586 /// The value that this parameter stores.
587 /// </summary>
588 /// <remarks>
589 /// You can override this property to define custom behaviors when the value is changed.
590 /// </remarks>
591 public override int value
592 {
593 get => m_Value;
594 set => m_Value = Mathf.Min(value, max);
595 }
596
597 /// <summary>
598 /// Creates a new <see cref="MaxIntParameter"/> instance.
599 /// </summary>
600 /// <param name="value">The initial value to store in the parameter.</param>
601 /// <param name="max">The maximum value to clamp the parameter to.</param>
602 /// <param name="overrideState">The initial override state for the parameter.</param>
603 public MaxIntParameter(int value, int max, bool overrideState = false)
604 : base(value, overrideState)
605 {
606 this.max = max;
607 }
608 }
609
610 /// <summary>
611 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value that
612 /// clamped to a maximum value.
613 /// </summary>
614 /// <seealso cref="IntParameter"/>
615 /// <seealso cref="MinIntParameter"/>
616 /// <seealso cref="MaxIntParameter"/>
617 /// <seealso cref="ClampedIntParameter"/>
618 /// <seealso cref="NoInterpIntParameter"/>
619 /// <seealso cref="NoInterpMinIntParameter"/>
620 /// <seealso cref="NoInterpClampedIntParameter"/>
621 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
622 public class NoInterpMaxIntParameter : VolumeParameter<int>
623 {
624 /// <summary>
625 /// The maximum value to clamp this parameter to.
626 /// </summary>
627 [NonSerialized]
628 public int max;
629
630 /// <summary>
631 /// The value that this parameter stores.
632 /// </summary>
633 /// <remarks>
634 /// You can override this property to define custom behaviors when the value is changed.
635 /// </remarks>
636 public override int value
637 {
638 get => m_Value;
639 set => m_Value = Mathf.Min(value, max);
640 }
641
642 /// <summary>
643 /// Creates a new <see cref="NoInterpMaxIntParameter"/> instance.
644 /// </summary>
645 /// <param name="value">The initial value to store in the parameter.</param>
646 /// <param name="max">The maximum value to clamp the parameter to.</param>
647 /// <param name="overrideState">The initial override state for the parameter.</param>
648 public NoInterpMaxIntParameter(int value, int max, bool overrideState = false)
649 : base(value, overrideState)
650 {
651 this.max = max;
652 }
653 }
654
655 /// <summary>
656 /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped between a
657 /// minimum and a maximum value.
658 /// </summary>
659 /// <seealso cref="IntParameter"/>
660 /// <seealso cref="MinIntParameter"/>
661 /// <seealso cref="MaxIntParameter"/>
662 /// <seealso cref="NoInterpIntParameter"/>
663 /// <seealso cref="NoInterpMinIntParameter"/>
664 /// <seealso cref="NoInterpMaxIntParameter"/>
665 /// <seealso cref="NoInterpClampedIntParameter"/>
666 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
667 public class ClampedIntParameter : IntParameter
668 {
669 /// <summary>
670 /// The minimum value to clamp this parameter to.
671 /// </summary>
672 [NonSerialized]
673 public int min;
674
675 /// <summary>
676 /// The maximum value to clamp this parameter to.
677 /// </summary>
678 [NonSerialized]
679 public int max;
680
681 /// <summary>
682 /// The value that this parameter stores.
683 /// </summary>
684 /// <remarks>
685 /// You can override this property to define custom behaviors when the value is changed.
686 /// </remarks>
687 public override int value
688 {
689 get => m_Value;
690 set => m_Value = Mathf.Clamp(value, min, max);
691 }
692
693 /// <summary>
694 /// Creates a new <see cref="ClampedIntParameter"/> instance.
695 /// </summary>
696 /// <param name="value">The initial value to store in the parameter.</param>
697 /// <param name="min">The minimum value to clamp the parameter to</param>
698 /// <param name="max">The maximum value to clamp the parameter to.</param>
699 /// <param name="overrideState">The initial override state for the parameter.</param>
700 public ClampedIntParameter(int value, int min, int max, bool overrideState = false)
701 : base(value, overrideState)
702 {
703 this.min = min;
704 this.max = max;
705 }
706 }
707
708 /// <summary>
709 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value
710 /// clamped between a minimum and a maximum value.
711 /// </summary>
712 /// <seealso cref="IntParameter"/>
713 /// <seealso cref="MinIntParameter"/>
714 /// <seealso cref="MaxIntParameter"/>
715 /// <seealso cref="ClampedIntParameter"/>
716 /// <seealso cref="NoInterpIntParameter"/>
717 /// <seealso cref="NoInterpMinIntParameter"/>
718 /// <seealso cref="NoInterpMaxIntParameter"/>
719 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
720 public class NoInterpClampedIntParameter : VolumeParameter<int>
721 {
722 /// <summary>
723 /// The minimum value to clamp this parameter to.
724 /// </summary>
725 [NonSerialized]
726 public int min;
727
728 /// <summary>
729 /// The maximum value to clamp this parameter to.
730 /// </summary>
731 [NonSerialized]
732 public int max;
733
734 /// <summary>
735 /// The value that this parameter stores.
736 /// </summary>
737 /// <remarks>
738 /// You can override this property to define custom behaviors when the value is changed.
739 /// </remarks>
740 public override int value
741 {
742 get => m_Value;
743 set => m_Value = Mathf.Clamp(value, min, max);
744 }
745
746 /// <summary>
747 /// Creates a new <see cref="NoInterpClampedIntParameter"/> instance.
748 /// </summary>
749 /// <param name="value">The initial value to store in the parameter.</param>
750 /// <param name="min">The minimum value to clamp the parameter to</param>
751 /// <param name="max">The maximum value to clamp the parameter to.</param>
752 /// <param name="overrideState">The initial override state for the parameter.</param>
753 public NoInterpClampedIntParameter(int value, int min, int max, bool overrideState = false)
754 : base(value, overrideState)
755 {
756 this.min = min;
757 this.max = max;
758 }
759 }
760
761 /// <summary>
762 /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value.
763 /// </summary>
764 /// <seealso cref="MinFloatParameter"/>
765 /// <seealso cref="MaxFloatParameter"/>
766 /// <seealso cref="ClampedFloatParameter"/>
767 /// <seealso cref="FloatRangeParameter"/>
768 /// <seealso cref="NoInterpFloatParameter"/>
769 /// <seealso cref="NoInterpMinFloatParameter"/>
770 /// <seealso cref="NoInterpMaxFloatParameter"/>
771 /// <seealso cref="NoInterpClampedFloatParameter"/>
772 /// <seealso cref="NoInterpFloatRangeParameter"/>
773 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
774 public class FloatParameter : VolumeParameter<float>
775 {
776 /// <summary>
777 /// Creates a new <see cref="FloatParameter"/> instance.
778 /// </summary>
779 /// <param name="value">The initial value to store in the parameter</param>
780 /// <param name="overrideState">The initial override state for the parameter</param>
781 public FloatParameter(float value, bool overrideState = false)
782 : base(value, overrideState) { }
783
784 /// <summary>
785 /// Interpolates between two <c>float</c> values.
786 /// </summary>
787 /// <param name="from">The start value</param>
788 /// <param name="to">The end value</param>
789 /// <param name="t">The interpolation factor in range [0,1]</param>
790 public sealed override void Interp(float from, float to, float t)
791 {
792 m_Value = from + (to - from) * t;
793 }
794 }
795
796 /// <summary>
797 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value.
798 /// </summary>
799 /// <seealso cref="FloatParameter"/>
800 /// <seealso cref="MinFloatParameter"/>
801 /// <seealso cref="MaxFloatParameter"/>
802 /// <seealso cref="ClampedFloatParameter"/>
803 /// <seealso cref="FloatRangeParameter"/>
804 /// <seealso cref="NoInterpMinFloatParameter"/>
805 /// <seealso cref="NoInterpMaxFloatParameter"/>
806 /// <seealso cref="NoInterpClampedFloatParameter"/>
807 /// <seealso cref="NoInterpFloatRangeParameter"/>
808 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
809 public class NoInterpFloatParameter : VolumeParameter<float>
810 {
811 /// <summary>
812 /// Creates a new <see cref="NoInterpFloatParameter"/> instance.
813 /// </summary>
814 /// <param name="value">The initial value to store in the parameter</param>
815 /// <param name="overrideState">The initial override state for the parameter.</param>
816 public NoInterpFloatParameter(float value, bool overrideState = false)
817 : base(value, overrideState) { }
818 }
819
820 /// <summary>
821 /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped to a minimum value.
822 /// </summary>
823 /// <seealso cref="FloatParameter"/>
824 /// <seealso cref="MaxFloatParameter"/>
825 /// <seealso cref="ClampedFloatParameter"/>
826 /// <seealso cref="FloatRangeParameter"/>
827 /// <seealso cref="NoInterpFloatParameter"/>
828 /// <seealso cref="NoInterpMinFloatParameter"/>
829 /// <seealso cref="NoInterpMaxFloatParameter"/>
830 /// <seealso cref="NoInterpClampedFloatParameter"/>
831 /// <seealso cref="NoInterpFloatRangeParameter"/>
832 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
833 public class MinFloatParameter : FloatParameter
834 {
835 /// <summary>
836 /// The minimum value to clamp this parameter to.
837 /// </summary>
838 [NonSerialized]
839 public float min;
840
841 /// <summary>
842 /// The value that this parameter stores.
843 /// </summary>
844 /// <remarks>
845 /// You can override this property to define custom behaviors when the value is changed.
846 /// </remarks>
847 public override float value
848 {
849 get => m_Value;
850 set => m_Value = Mathf.Max(value, min);
851 }
852
853 /// <summary>
854 /// Creates a new <see cref="MinFloatParameter"/> instance.
855 /// </summary>
856 /// <param name="value">The initial value to store in the parameter.</param>
857 /// <param name="min">The minimum value to clamp the parameter to.</param>
858 /// <param name="overrideState">The initial override state for the parameter.</param>
859 public MinFloatParameter(float value, float min, bool overrideState = false)
860 : base(value, overrideState)
861 {
862 this.min = min;
863 }
864 }
865
866 /// <summary>
867 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped to
868 /// a minimum value.
869 /// </summary>
870 /// <seealso cref="FloatParameter"/>
871 /// <seealso cref="MinFloatParameter"/>
872 /// <seealso cref="MaxFloatParameter"/>
873 /// <seealso cref="ClampedFloatParameter"/>
874 /// <seealso cref="FloatRangeParameter"/>
875 /// <seealso cref="NoInterpFloatParameter"/>
876 /// <seealso cref="NoInterpMaxFloatParameter"/>
877 /// <seealso cref="NoInterpClampedFloatParameter"/>
878 /// <seealso cref="NoInterpFloatRangeParameter"/>
879 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
880 public class NoInterpMinFloatParameter : VolumeParameter<float>
881 {
882 /// <summary>
883 /// The minimum value to clamp this parameter to.
884 /// </summary>
885 [NonSerialized]
886 public float min;
887
888 /// <summary>
889 /// The value that this parameter stores.
890 /// </summary>
891 /// <remarks>
892 /// You can override this property to define custom behaviors when the value is changed.
893 /// </remarks>
894 public override float value
895 {
896 get => m_Value;
897 set => m_Value = Mathf.Max(value, min);
898 }
899
900 /// <summary>
901 /// Creates a new <see cref="NoInterpMinFloatParameter"/> instance.
902 /// </summary>
903 /// <param name="value">The initial value to storedin the parameter.</param>
904 /// <param name="min">The minimum value to clamp the parameter to.</param>
905 /// <param name="overrideState">The initial override state for the parameter.</param>
906 public NoInterpMinFloatParameter(float value, float min, bool overrideState = false)
907 : base(value, overrideState)
908 {
909 this.min = min;
910 }
911 }
912
913 /// <summary>
914 /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped to a max value.
915 /// </summary>
916 /// <seealso cref="FloatParameter"/>
917 /// <seealso cref="MinFloatParameter"/>
918 /// <seealso cref="ClampedFloatParameter"/>
919 /// <seealso cref="FloatRangeParameter"/>
920 /// <seealso cref="NoInterpFloatParameter"/>
921 /// <seealso cref="NoInterpMinFloatParameter"/>
922 /// <seealso cref="NoInterpMaxFloatParameter"/>
923 /// <seealso cref="NoInterpClampedFloatParameter"/>
924 /// <seealso cref="NoInterpFloatRangeParameter"/>
925 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
926 public class MaxFloatParameter : FloatParameter
927 {
928 /// <summary>
929 /// The maximum value to clamp this parameter to.
930 /// </summary>
931 [NonSerialized]
932 public float max;
933
934 /// <summary>
935 /// The value that this parameter stores.
936 /// </summary>
937 /// <remarks>
938 /// You can override this property to define custom behaviors when the value is changed.
939 /// </remarks>
940 public override float value
941 {
942 get => m_Value;
943 set => m_Value = Mathf.Min(value, max);
944 }
945
946 /// <summary>
947 /// Creates a new <see cref="MaxFloatParameter"/> instance.
948 /// </summary>
949 /// <param name="value">The initial value to store in the parameter.</param>
950 /// <param name="max">The maximum value to clamp the parameter to.</param>
951 /// <param name="overrideState">The initial override state for the parameter.</param>
952 public MaxFloatParameter(float value, float max, bool overrideState = false)
953 : base(value, overrideState)
954 {
955 this.max = max;
956 }
957 }
958
959 /// <summary>
960 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped to
961 /// a maximum value.
962 /// </summary>
963 /// <seealso cref="FloatParameter"/>
964 /// <seealso cref="MinFloatParameter"/>
965 /// <seealso cref="MaxFloatParameter"/>
966 /// <seealso cref="ClampedFloatParameter"/>
967 /// <seealso cref="FloatRangeParameter"/>
968 /// <seealso cref="NoInterpFloatParameter"/>
969 /// <seealso cref="NoInterpMinFloatParameter"/>
970 /// <seealso cref="NoInterpClampedFloatParameter"/>
971 /// <seealso cref="NoInterpFloatRangeParameter"/>
972 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
973 public class NoInterpMaxFloatParameter : VolumeParameter<float>
974 {
975 /// <summary>
976 /// The maximum value to clamp this parameter to.
977 /// </summary>
978 [NonSerialized]
979 public float max;
980
981 /// <summary>
982 /// The value that this parameter stores.
983 /// </summary>
984 /// <remarks>
985 /// You can override this property to define custom behaviors when the value is changed.
986 /// </remarks>
987 public override float value
988 {
989 get => m_Value;
990 set => m_Value = Mathf.Min(value, max);
991 }
992
993 /// <summary>
994 /// Creates a new <see cref="NoInterpMaxFloatParameter"/> instance.
995 /// </summary>
996 /// <param name="value">The initial value to store in the parameter.</param>
997 /// <param name="max">The maximum value to clamp the parameter to.</param>
998 /// <param name="overrideState">The initial override state for the parameter.</param>
999 public NoInterpMaxFloatParameter(float value, float max, bool overrideState = false)
1000 : base(value, overrideState)
1001 {
1002 this.max = max;
1003 }
1004 }
1005
1006 /// <summary>
1007 /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped between a minimum and a
1008 /// maximum value.
1009 /// </summary>
1010 /// <seealso cref="FloatParameter"/>
1011 /// <seealso cref="MinFloatParameter"/>
1012 /// <seealso cref="MaxFloatParameter"/>
1013 /// <seealso cref="FloatRangeParameter"/>
1014 /// <seealso cref="NoInterpFloatParameter"/>
1015 /// <seealso cref="NoInterpMinFloatParameter"/>
1016 /// <seealso cref="NoInterpMaxFloatParameter"/>
1017 /// <seealso cref="NoInterpClampedFloatParameter"/>
1018 /// <seealso cref="NoInterpFloatRangeParameter"/>
1019 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1020 public class ClampedFloatParameter : FloatParameter
1021 {
1022 /// <summary>
1023 /// The minimum value to clamp this parameter to.
1024 /// </summary>
1025 [NonSerialized]
1026 public float min;
1027
1028 /// <summary>
1029 /// The maximum value to clamp this parameter to.
1030 /// </summary>
1031 [NonSerialized]
1032 public float max;
1033
1034 /// <summary>
1035 /// The value that this parameter stores.
1036 /// </summary>
1037 /// <remarks>
1038 /// You can override this property to define custom behaviors when the value is changed.
1039 /// </remarks>
1040 public override float value
1041 {
1042 get => m_Value;
1043 set => m_Value = Mathf.Clamp(value, min, max);
1044 }
1045
1046 /// <summary>
1047 /// Creates a new <see cref="ClampedFloatParameter"/> instance.
1048 /// </summary>
1049 /// <param name="value">The initial value to store in the parameter.</param>
1050 /// <param name="min">The minimum value to clamp the parameter to</param>
1051 /// <param name="max">The maximum value to clamp the parameter to.</param>
1052 /// <param name="overrideState">The initial override state for the parameter.</param>
1053 public ClampedFloatParameter(float value, float min, float max, bool overrideState = false)
1054 : base(value, overrideState)
1055 {
1056 this.min = min;
1057 this.max = max;
1058 }
1059 }
1060
1061 /// <summary>
1062 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped between
1063 /// a minimum and a maximum value.
1064 /// </summary>
1065 /// <seealso cref="FloatParameter"/>
1066 /// <seealso cref="MinFloatParameter"/>
1067 /// <seealso cref="MaxFloatParameter"/>
1068 /// <seealso cref="ClampedFloatParameter"/>
1069 /// <seealso cref="FloatRangeParameter"/>
1070 /// <seealso cref="NoInterpFloatParameter"/>
1071 /// <seealso cref="NoInterpMinFloatParameter"/>
1072 /// <seealso cref="NoInterpMaxFloatParameter"/>
1073 /// <seealso cref="NoInterpFloatRangeParameter"/>
1074 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1075 public class NoInterpClampedFloatParameter : VolumeParameter<float>
1076 {
1077 /// <summary>
1078 /// The minimum value to clamp this parameter to.
1079 /// </summary>
1080 [NonSerialized]
1081 public float min;
1082
1083 /// <summary>
1084 /// The maximum value to clamp this parameter to.
1085 /// </summary>
1086 [NonSerialized]
1087 public float max;
1088
1089 /// <summary>
1090 /// The value that this parameter stores.
1091 /// </summary>
1092 /// <remarks>
1093 /// You can override this property to define custom behaviors when the value is changed.
1094 /// </remarks>
1095 public override float value
1096 {
1097 get => m_Value;
1098 set => m_Value = Mathf.Clamp(value, min, max);
1099 }
1100
1101 /// <summary>
1102 /// Creates a new <see cref="NoInterpClampedFloatParameter"/> instance.
1103 /// </summary>
1104 /// <param name="value">The initial value to store in the parameter.</param>
1105 /// <param name="min">The minimum value to clamp the parameter to</param>
1106 /// <param name="max">The maximum value to clamp the parameter to.</param>
1107 /// <param name="overrideState">The initial override state for the parameter.</param>
1108 public NoInterpClampedFloatParameter(float value, float min, float max, bool overrideState = false)
1109 : base(value, overrideState)
1110 {
1111 this.min = min;
1112 this.max = max;
1113 }
1114 }
1115
1116 /// <summary>
1117 /// A <see cref="VolumeParameter"/> that holds a <c>Vector2</c> value holding a range of two
1118 /// <c>float</c> values clamped between a minimum and a maximum value.
1119 /// </summary>
1120 /// <seealso cref="FloatParameter"/>
1121 /// <seealso cref="MinFloatParameter"/>
1122 /// <seealso cref="MaxFloatParameter"/>
1123 /// <seealso cref="ClampedFloatParameter"/>
1124 /// <seealso cref="NoInterpFloatParameter"/>
1125 /// <seealso cref="NoInterpMinFloatParameter"/>
1126 /// <seealso cref="NoInterpMaxFloatParameter"/>
1127 /// <seealso cref="NoInterpClampedFloatParameter"/>
1128 /// <seealso cref="NoInterpFloatRangeParameter"/>
1129 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1130 public class FloatRangeParameter : VolumeParameter<Vector2>
1131 {
1132 /// <summary>
1133 /// The minimum value to clamp this parameter to.
1134 /// </summary>
1135 [NonSerialized]
1136 public float min;
1137
1138 /// <summary>
1139 /// The maximum value to clamp this parameter to.
1140 /// </summary>
1141 [NonSerialized]
1142 public float max;
1143
1144 /// <summary>
1145 /// The value that this parameter stores.
1146 /// </summary>
1147 /// <remarks>
1148 /// You can override this property to define custom behaviors when the value is changed.
1149 /// </remarks>
1150 public override Vector2 value
1151 {
1152 get => m_Value;
1153 set
1154 {
1155 m_Value.x = Mathf.Max(value.x, min);
1156 m_Value.y = Mathf.Min(value.y, max);
1157 }
1158 }
1159
1160 /// <summary>
1161 /// Creates a new <see cref="FloatRangeParameter"/> instance.
1162 /// </summary>
1163 /// <param name="value">The initial value to store in the parameter.</param>
1164 /// <param name="min">The minimum value to clamp the parameter to</param>
1165 /// <param name="max">The maximum value to clamp the parameter to.</param>
1166 /// <param name="overrideState">The initial override state for the parameter.</param>
1167 public FloatRangeParameter(Vector2 value, float min, float max, bool overrideState = false)
1168 : base(value, overrideState)
1169 {
1170 this.min = min;
1171 this.max = max;
1172 }
1173
1174 /// <summary>
1175 /// Interpolates between two <c>Vector2</c> values.
1176 /// </summary>
1177 /// <param name="from">The start value</param>
1178 /// <param name="to">The end value</param>
1179 /// <param name="t">The interpolation factor in range [0,1]</param>
1180 public override void Interp(Vector2 from, Vector2 to, float t)
1181 {
1182 m_Value.x = from.x + (to.x - from.x) * t;
1183 m_Value.y = from.y + (to.y - from.y) * t;
1184 }
1185 }
1186
1187 /// <summary>
1188 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector2</c> value holding
1189 /// a range of two <c>float</c> values clamped between a minimum and a maximum value.
1190 /// </summary>
1191 /// <seealso cref="FloatParameter"/>
1192 /// <seealso cref="MinFloatParameter"/>
1193 /// <seealso cref="MaxFloatParameter"/>
1194 /// <seealso cref="ClampedFloatParameter"/>
1195 /// <seealso cref="FloatRangeParameter"/>
1196 /// <seealso cref="NoInterpFloatParameter"/>
1197 /// <seealso cref="NoInterpMinFloatParameter"/>
1198 /// <seealso cref="NoInterpMaxFloatParameter"/>
1199 /// <seealso cref="NoInterpClampedFloatParameter"/>
1200 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1201 public class NoInterpFloatRangeParameter : VolumeParameter<Vector2>
1202 {
1203 /// <summary>
1204 /// The minimum value to clamp this parameter to.
1205 /// </summary>
1206 [NonSerialized]
1207 public float min;
1208
1209 /// <summary>
1210 /// The maximum value to clamp this parameter to.
1211 /// </summary>
1212 [NonSerialized]
1213 public float max;
1214
1215 /// <summary>
1216 /// The value that this parameter stores.
1217 /// </summary>
1218 /// <remarks>
1219 /// You can override this property to define custom behaviors when the value is changed.
1220 /// </remarks>
1221 public override Vector2 value
1222 {
1223 get => m_Value;
1224 set
1225 {
1226 m_Value.x = Mathf.Max(value.x, min);
1227 m_Value.y = Mathf.Min(value.y, max);
1228 }
1229 }
1230
1231 /// <summary>
1232 /// Creates a new <see cref="NoInterpFloatRangeParameter"/> instance.
1233 /// </summary>
1234 /// <param name="value">The initial value to store in the parameter.</param>
1235 /// <param name="min">The minimum value to clamp the parameter to</param>
1236 /// <param name="max">The maximum value to clamp the parameter to.</param>
1237 /// <param name="overrideState">The initial override state for the parameter.</param>
1238 public NoInterpFloatRangeParameter(Vector2 value, float min, float max, bool overrideState = false)
1239 : base(value, overrideState)
1240 {
1241 this.min = min;
1242 this.max = max;
1243 }
1244 }
1245
1246 /// <summary>
1247 /// A <see cref="VolumeParameter"/> that holds a <c>Color</c> value.
1248 /// </summary>
1249 /// <seealso cref="NoInterpColorParameter"/>
1250 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1251 public class ColorParameter : VolumeParameter<Color>
1252 {
1253 /// <summary>
1254 /// Is this color HDR?
1255 /// </summary>
1256 [NonSerialized]
1257 public bool hdr = false;
1258
1259 /// <summary>
1260 /// Should the alpha channel be editable in the editor?
1261 /// </summary>
1262 [NonSerialized]
1263 public bool showAlpha = true;
1264
1265 /// <summary>
1266 /// Should the eye dropper be visible in the editor?
1267 /// </summary>
1268 [NonSerialized]
1269 public bool showEyeDropper = true;
1270
1271 /// <summary>
1272 /// Creates a new <see cref="ColorParameter"/> instance.
1273 /// </summary>
1274 /// <param name="value">The initial value to store in the parameter.</param>
1275 /// <param name="overrideState">The initial override state for the parameter.</param>
1276 public ColorParameter(Color value, bool overrideState = false)
1277 : base(value, overrideState) { }
1278
1279 /// <summary>
1280 /// Creates a new <see cref="ColorParameter"/> instance.
1281 /// </summary>
1282 /// <param name="value">The initial value to store in the parameter.</param>
1283 /// <param name="hdr">Specifies whether the color is HDR or not.</param>
1284 /// <param name="showAlpha">Specifies whether you can edit the alpha channel in the Inspector or not.</param>
1285 /// <param name="showEyeDropper">Specifies whether the eye dropper is visible in the editor or not.</param>
1286 /// <param name="overrideState">The initial override state for the parameter.</param>
1287 public ColorParameter(Color value, bool hdr, bool showAlpha, bool showEyeDropper, bool overrideState = false)
1288 : base(value, overrideState)
1289 {
1290 this.hdr = hdr;
1291 this.showAlpha = showAlpha;
1292 this.showEyeDropper = showEyeDropper;
1293 this.overrideState = overrideState;
1294 }
1295
1296 /// <summary>
1297 /// Interpolates between two <c>Color</c> values.
1298 /// </summary>
1299 /// <remarks>
1300 /// For performance reasons, this function interpolates the RGBA channels directly.
1301 /// </remarks>
1302 /// <param name="from">The start value.</param>
1303 /// <param name="to">The end value.</param>
1304 /// <param name="t">The interpolation factor in range [0,1].</param>
1305 public override void Interp(Color from, Color to, float t)
1306 {
1307 // Lerping color values is a sensitive subject... We looked into lerping colors using
1308 // HSV and LCH but they have some downsides that make them not work correctly in all
1309 // situations, so we stick with RGB lerping for now, at least its behavior is
1310 // predictable despite looking desaturated when `t ~= 0.5` and it's faster anyway.
1311 m_Value.r = from.r + (to.r - from.r) * t;
1312 m_Value.g = from.g + (to.g - from.g) * t;
1313 m_Value.b = from.b + (to.b - from.b) * t;
1314 m_Value.a = from.a + (to.a - from.a) * t;
1315 }
1316 }
1317
1318 /// <summary>
1319 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Color</c> value.
1320 /// </summary>
1321 /// <seealso cref="ColorParameter"/>
1322 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1323 public class NoInterpColorParameter : VolumeParameter<Color>
1324 {
1325 /// <summary>
1326 /// Specifies whether the color is HDR or not.
1327 /// </summary>
1328 public bool hdr = false;
1329
1330 /// <summary>
1331 /// Specifies whether you can edit the alpha channel in the Inspector or not.
1332 /// </summary>
1333 [NonSerialized]
1334 public bool showAlpha = true;
1335
1336 /// <summary>
1337 /// Specifies whether the eye dropper is visible in the editor or not.
1338 /// </summary>
1339 [NonSerialized]
1340 public bool showEyeDropper = true;
1341
1342 /// <summary>
1343 /// Creates a new <see cref="NoInterpColorParameter"/> instance.
1344 /// </summary>
1345 /// <param name="value">The initial value to store in the parameter.</param>
1346 /// <param name="overrideState">The initial override state for the parameter.</param>
1347 public NoInterpColorParameter(Color value, bool overrideState = false)
1348 : base(value, overrideState) { }
1349
1350 /// <summary>
1351 /// Creates a new <see cref="NoInterpColorParameter"/> instance.
1352 /// </summary>
1353 /// <param name="value">The initial value to store in the parameter.</param>
1354 /// <param name="hdr">Specifies whether the color is HDR or not.</param>
1355 /// <param name="showAlpha">Specifies whether you can edit the alpha channel in the Inspector or not.</param>
1356 /// <param name="showEyeDropper">Specifies whether the eye dropper is visible in the editor or not.</param>
1357 /// <param name="overrideState">The initial override state for the parameter.</param>
1358 public NoInterpColorParameter(Color value, bool hdr, bool showAlpha, bool showEyeDropper, bool overrideState = false)
1359 : base(value, overrideState)
1360 {
1361 this.hdr = hdr;
1362 this.showAlpha = showAlpha;
1363 this.showEyeDropper = showEyeDropper;
1364 this.overrideState = overrideState;
1365 }
1366 }
1367
1368 /// <summary>
1369 /// A <see cref="VolumeParameter"/> that holds a <c>Vector2</c> value.
1370 /// </summary>
1371 /// <seealso cref="NoInterpVector2Parameter"/>
1372 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1373 public class Vector2Parameter : VolumeParameter<Vector2>
1374 {
1375 /// <summary>
1376 /// Creates a new <see cref="Vector2Parameter"/> instance.
1377 /// </summary>
1378 /// <param name="value">The initial value to store in the parameter.</param>
1379 /// <param name="overrideState">The initial override state for the parameter.</param>
1380 public Vector2Parameter(Vector2 value, bool overrideState = false)
1381 : base(value, overrideState) { }
1382
1383 /// <summary>
1384 /// Interpolates between two <c>Vector2</c> values.
1385 /// </summary>
1386 /// <param name="from">The start value.</param>
1387 /// <param name="to">The end value.</param>
1388 /// <param name="t">The interpolation factor in range [0,1].</param>
1389 public override void Interp(Vector2 from, Vector2 to, float t)
1390 {
1391 m_Value.x = from.x + (to.x - from.x) * t;
1392 m_Value.y = from.y + (to.y - from.y) * t;
1393 }
1394 }
1395
1396 /// <summary>
1397 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector2</c> value.
1398 /// </summary>
1399 /// <seealso cref="Vector2Parameter"/>
1400 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1401 public class NoInterpVector2Parameter : VolumeParameter<Vector2>
1402 {
1403 /// <summary>
1404 /// Creates a new <see cref="NoInterpVector2Parameter"/> instance.
1405 /// </summary>
1406 /// <param name="value">The initial value to store in the parameter.</param>
1407 /// <param name="overrideState">The initial override state for the parameter.</param>
1408 public NoInterpVector2Parameter(Vector2 value, bool overrideState = false)
1409 : base(value, overrideState) { }
1410 }
1411
1412 /// <summary>
1413 /// A <see cref="VolumeParameter"/> that holds a <c>Vector3</c> value.
1414 /// </summary>
1415 /// <seealso cref="NoInterpVector3Parameter"/>
1416 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1417 public class Vector3Parameter : VolumeParameter<Vector3>
1418 {
1419 /// <summary>
1420 /// Creates a new <see cref="Vector3Parameter"/> instance.
1421 /// </summary>
1422 /// <param name="value">The initial value to store in the parameter.</param>
1423 /// <param name="overrideState">The initial override state for the parameter.</param>
1424 public Vector3Parameter(Vector3 value, bool overrideState = false)
1425 : base(value, overrideState) { }
1426
1427 /// <summary>
1428 /// Interpolates between two <c>Vector3</c> values.
1429 /// </summary>
1430 /// <param name="from">The start value.</param>
1431 /// <param name="to">The end value.</param>
1432 /// <param name="t">The interpolation factor in range [0,1].</param>
1433 public override void Interp(Vector3 from, Vector3 to, float t)
1434 {
1435 m_Value.x = from.x + (to.x - from.x) * t;
1436 m_Value.y = from.y + (to.y - from.y) * t;
1437 m_Value.z = from.z + (to.z - from.z) * t;
1438 }
1439 }
1440
1441 /// <summary>
1442 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector3</c> value.
1443 /// </summary>
1444 /// <seealso cref="Vector3Parameter"/>
1445 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1446 public class NoInterpVector3Parameter : VolumeParameter<Vector3>
1447 {
1448 /// <summary>
1449 /// Creates a new <see cref="Vector3Parameter"/> instance.
1450 /// </summary>
1451 /// <param name="value">The initial value to store in the parameter.</param>
1452 /// <param name="overrideState">The initial override state for the parameter.</param>
1453 public NoInterpVector3Parameter(Vector3 value, bool overrideState = false)
1454 : base(value, overrideState) { }
1455 }
1456
1457 /// <summary>
1458 /// A <see cref="VolumeParameter"/> that holds a <c>Vector4</c> value.
1459 /// </summary>
1460 /// <seealso cref="NoInterpVector4Parameter"/>
1461 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1462 public class Vector4Parameter : VolumeParameter<Vector4>
1463 {
1464 /// <summary>
1465 /// Creates a new <see cref="Vector4Parameter"/> instance.
1466 /// </summary>
1467 /// <param name="value">The initial value to store in the parameter.</param>
1468 /// <param name="overrideState">The initial override state for the parameter.</param>
1469 public Vector4Parameter(Vector4 value, bool overrideState = false)
1470 : base(value, overrideState) { }
1471
1472 /// <summary>
1473 /// Interpolates between two <c>Vector4</c> values.
1474 /// </summary>
1475 /// <param name="from">The start value.</param>
1476 /// <param name="to">The end value.</param>
1477 /// <param name="t">The interpolation factor in range [0,1].</param>
1478 public override void Interp(Vector4 from, Vector4 to, float t)
1479 {
1480 m_Value.x = from.x + (to.x - from.x) * t;
1481 m_Value.y = from.y + (to.y - from.y) * t;
1482 m_Value.z = from.z + (to.z - from.z) * t;
1483 m_Value.w = from.w + (to.w - from.w) * t;
1484 }
1485 }
1486
1487 /// <summary>
1488 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector4</c> value.
1489 /// </summary>
1490 /// <seealso cref="Vector4Parameter"/>
1491 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1492 public class NoInterpVector4Parameter : VolumeParameter<Vector4>
1493 {
1494 /// <summary>
1495 /// Creates a new <see cref="Vector4Parameter"/> instance.
1496 /// </summary>
1497 /// <param name="value">The initial value to store in the parameter.</param>
1498 /// <param name="overrideState">The initial override state for the parameter.</param>
1499 public NoInterpVector4Parameter(Vector4 value, bool overrideState = false)
1500 : base(value, overrideState) { }
1501 }
1502
1503 /// <summary>
1504 /// A <see cref="VolumeParameter"/> that holds a <c>Texture</c> value.
1505 /// </summary>
1506 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1507 public class TextureParameter : VolumeParameter<Texture>
1508 {
1509 /// <summary>
1510 /// The accepted dimension of textures.
1511 /// </summary>
1512 public TextureDimension dimension;
1513
1514 /// <summary>
1515 /// Creates a new <see cref="TextureParameter"/> instance.
1516 /// </summary>
1517 /// <param name="value">The initial value to store in the parameter.</param>
1518 /// <param name="overrideState">The initial override state for the parameter.</param>
1519 public TextureParameter(Texture value, bool overrideState = false)
1520 : this(value, TextureDimension.Any, overrideState) { }
1521
1522 /// <summary>
1523 /// Creates a new <see cref="TextureParameter"/> instance.
1524 /// </summary>
1525 /// <param name="value">The initial value to store in the parameter.</param>
1526 /// <param name="dimension">The accepted dimension of textures.</param>
1527 /// <param name="overrideState">The initial override state for the parameter.</param>
1528 public TextureParameter(Texture value, TextureDimension dimension, bool overrideState = false)
1529 : base(value, overrideState)
1530 {
1531 this.dimension = dimension;
1532 }
1533
1534 // TODO: Texture interpolation
1535
1536 /// <summary>
1537 /// Returns a hash code for the current object.
1538 /// </summary>
1539 /// <returns>A hash code for the current object.</returns>
1540 public override int GetHashCode()
1541 {
1542 int hash = base.GetHashCode();
1543
1544 unchecked
1545 {
1546 if (value != null)
1547 hash = 23 * CoreUtils.GetTextureHash(value);
1548 }
1549
1550 return hash;
1551 }
1552 }
1553
1554 /// <summary>
1555 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Texture</c> value.
1556 /// </summary>
1557 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1558 public class NoInterpTextureParameter : VolumeParameter<Texture>
1559 {
1560 /// <summary>
1561 /// Creates a new <see cref="NoInterpTextureParameter"/> instance.
1562 /// </summary>
1563 /// <param name="value">The initial value to store in the parameter.</param>
1564 /// <param name="overrideState">The initial override state for the parameter.</param>
1565 public NoInterpTextureParameter(Texture value, bool overrideState = false)
1566 : base(value, overrideState) { }
1567
1568 /// <summary>
1569 /// Returns a hash code for the current object.
1570 /// </summary>
1571 /// <returns>A hash code for the current object.</returns>
1572 public override int GetHashCode()
1573 {
1574 int hash = base.GetHashCode();
1575
1576 unchecked
1577 {
1578 if (value != null)
1579 hash = 23 * CoreUtils.GetTextureHash(value);
1580 }
1581
1582 return hash;
1583 }
1584 }
1585
1586 /// <summary>
1587 /// A <see cref="VolumeParameter"/> that holds a 2D <c>Texture</c> value.
1588 /// </summary>
1589 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1590 public class Texture2DParameter : VolumeParameter<Texture>
1591 {
1592 /// <summary>
1593 /// Creates a new <see cref="Texture2DParameter"/> instance.
1594 /// </summary>
1595 /// <param name="value">The initial value to store in the parameter.</param>
1596 /// <param name="overrideState">The initial override state for the parameter.</param>
1597 public Texture2DParameter(Texture value, bool overrideState = false)
1598 : base(value, overrideState) { }
1599
1600 /// <summary>
1601 /// Returns a hash code for the current object.
1602 /// </summary>
1603 /// <returns>A hash code for the current object.</returns>
1604 public override int GetHashCode()
1605 {
1606 int hash = base.GetHashCode();
1607
1608 unchecked
1609 {
1610 if (value != null)
1611 hash = 23 * CoreUtils.GetTextureHash(value);
1612 }
1613
1614 return hash;
1615 }
1616 }
1617
1618 /// <summary>
1619 /// A <see cref="VolumeParameter"/> that holds a 3D <c>Texture</c> value.
1620 /// </summary>
1621 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1622 public class Texture3DParameter : VolumeParameter<Texture>
1623 {
1624 /// <summary>
1625 /// Creates a new <see cref="Texture3DParameter"/> instance.
1626 /// </summary>
1627 /// <param name="value">The initial value to store in the parameter.</param>
1628 /// <param name="overrideState">The initial override state for the parameter.</param>
1629 public Texture3DParameter(Texture value, bool overrideState = false)
1630 : base(value, overrideState) { }
1631
1632 /// <summary>
1633 /// Returns a hash code for the current object.
1634 /// </summary>
1635 /// <returns>A hash code for the current object.</returns>
1636 public override int GetHashCode()
1637 {
1638 int hash = base.GetHashCode();
1639
1640 unchecked
1641 {
1642 if (value != null)
1643 hash = 23 * CoreUtils.GetTextureHash(value);
1644 }
1645
1646 return hash;
1647 }
1648 }
1649
1650 /// <summary>
1651 /// A <see cref="VolumeParameter"/> that holds a <c>RenderTexture</c> value.
1652 /// </summary>
1653 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1654 public class RenderTextureParameter : VolumeParameter<RenderTexture>
1655 {
1656 /// <summary>
1657 /// Creates a new <see cref="RenderTextureParameter"/> instance.
1658 /// </summary>
1659 /// <param name="value">The initial value to store in the parameter.</param>
1660 /// <param name="overrideState">The initial override state for the parameter.</param>
1661 public RenderTextureParameter(RenderTexture value, bool overrideState = false)
1662 : base(value, overrideState) { }
1663
1664 // TODO: RenderTexture interpolation
1665
1666 /// <summary>
1667 /// Returns a hash code for the current object.
1668 /// </summary>
1669 /// <returns>A hash code for the current object.</returns>
1670 public override int GetHashCode()
1671 {
1672 int hash = base.GetHashCode();
1673
1674 unchecked
1675 {
1676 if (value != null)
1677 hash = 23 * CoreUtils.GetTextureHash(value);
1678 }
1679
1680 return hash;
1681 }
1682 }
1683
1684 /// <summary>
1685 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>RenderTexture</c> value.
1686 /// </summary>
1687 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1688 public class NoInterpRenderTextureParameter : VolumeParameter<RenderTexture>
1689 {
1690 /// <summary>
1691 /// Creates a new <see cref="NoInterpRenderTextureParameter"/> instance.
1692 /// </summary>
1693 /// <param name="value">The initial value to store in the parameter.</param>
1694 /// <param name="overrideState">The initial override state for the parameter.</param>
1695 public NoInterpRenderTextureParameter(RenderTexture value, bool overrideState = false)
1696 : base(value, overrideState) { }
1697
1698 /// <summary>
1699 /// Returns a hash code for the current object.
1700 /// </summary>
1701 /// <returns>A hash code for the current object.</returns>
1702 public override int GetHashCode()
1703 {
1704 int hash = base.GetHashCode();
1705
1706 unchecked
1707 {
1708 if (value != null)
1709 hash = 23 * CoreUtils.GetTextureHash(value);
1710 }
1711
1712 return hash;
1713 }
1714 }
1715
1716 /// <summary>
1717 /// A <see cref="VolumeParameter"/> that holds a <c>Cubemap</c> value.
1718 /// </summary>
1719 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1720 public class CubemapParameter : VolumeParameter<Texture>
1721 {
1722 /// <summary>
1723 /// Creates a new <see cref="CubemapParameter"/> instance.
1724 /// </summary>
1725 /// <param name="value">The initial value to store in the parameter.</param>
1726 /// <param name="overrideState">The initial override state for the parameter.</param>
1727 public CubemapParameter(Texture value, bool overrideState = false)
1728 : base(value, overrideState) { }
1729 // TODO: Cubemap interpolation
1730
1731 /// <summary>
1732 /// Returns a hash code for the current object.
1733 /// </summary>
1734 /// <returns>A hash code for the current object.</returns>
1735 public override int GetHashCode()
1736 {
1737 int hash = base.GetHashCode();
1738
1739 unchecked
1740 {
1741 if (value != null)
1742 hash = 23 * CoreUtils.GetTextureHash(value);
1743 }
1744
1745 return hash;
1746 }
1747 }
1748
1749 /// <summary>
1750 /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Cubemap</c> value.
1751 /// </summary>
1752 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1753 public class NoInterpCubemapParameter : VolumeParameter<Cubemap>
1754 {
1755 /// <summary>
1756 /// Creates a new <see cref="NoInterpCubemapParameter"/> instance.
1757 /// </summary>
1758 /// <param name="value">The initial value to store in the parameter.</param>
1759 /// <param name="overrideState">The initial override state for the parameter.</param>
1760 public NoInterpCubemapParameter(Cubemap value, bool overrideState = false)
1761 : base(value, overrideState) { }
1762
1763 /// <summary>
1764 /// Returns a hash code for the current object.
1765 /// </summary>
1766 /// <returns>A hash code for the current object.</returns>
1767 public override int GetHashCode()
1768 {
1769 int hash = base.GetHashCode();
1770
1771 unchecked
1772 {
1773 if (value != null)
1774 hash = 23 * CoreUtils.GetTextureHash(value);
1775 }
1776
1777 return hash;
1778 }
1779 }
1780
1781 /// <summary>
1782 /// A <see cref="VolumeParameter"/> that holds a serializable class or struct.
1783 /// </summary>
1784 /// <typeparam name="T">The type of serializable object or struct to hold in this parameter.
1785 /// </typeparam>
1786 // TODO: ObjectParameter<T> doesn't seem to be working as expect, debug me
1787 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1788 public class ObjectParameter<T> : VolumeParameter<T>
1789 {
1790 internal ReadOnlyCollection<VolumeParameter> parameters { get; private set; }
1791
1792 /// <summary>
1793 /// The current override state for this parameter. Note that this is always forced enabled
1794 /// on <see cref="ObjectParameter{T}"/>.
1795 /// </summary>
1796 public sealed override bool overrideState
1797 {
1798 get => true;
1799 set => m_OverrideState = true;
1800 }
1801
1802 /// <summary>
1803 /// The value stored by this parameter.
1804 /// </summary>
1805 public sealed override T value
1806 {
1807 get => m_Value;
1808 set
1809 {
1810 m_Value = value;
1811
1812 if (m_Value == null)
1813 {
1814 parameters = null;
1815 return;
1816 }
1817
1818 // Automatically grab all fields of type VolumeParameter contained in this instance
1819 parameters = m_Value.GetType()
1820 .GetFields(BindingFlags.Public | BindingFlags.Instance)
1821 .Where(t => t.FieldType.IsSubclassOf(typeof(VolumeParameter)))
1822 .OrderBy(t => t.MetadataToken) // Guaranteed order
1823 .Select(t => (VolumeParameter)t.GetValue(m_Value))
1824 .ToList()
1825 .AsReadOnly();
1826 }
1827 }
1828
1829 /// <summary>
1830 /// Creates a new <see cref="ObjectParameter{T}"/> instance.
1831 /// </summary>
1832 /// <param name="value">The initial value to store in the parameter.</param>
1833 public ObjectParameter(T value)
1834 {
1835 m_OverrideState = true;
1836 this.value = value;
1837 }
1838
1839 internal override void Interp(VolumeParameter from, VolumeParameter to, float t)
1840 {
1841 if (m_Value == null)
1842 return;
1843
1844 var paramOrigin = parameters;
1845 var paramFrom = ((ObjectParameter<T>)from).parameters;
1846 var paramTo = ((ObjectParameter<T>)to).parameters;
1847
1848 for (int i = 0; i < paramFrom.Count; i++)
1849 {
1850 // Keep track of the override state for debugging purpose
1851 paramOrigin[i].overrideState = paramTo[i].overrideState;
1852
1853 if (paramTo[i].overrideState)
1854 paramOrigin[i].Interp(paramFrom[i], paramTo[i], t);
1855 }
1856 }
1857 }
1858
1859 /// <summary>
1860 /// A <see cref="VolumeParameter"/> that holds an <c>AnimationCurve</c> value.
1861 /// </summary>
1862 [Serializable]
1863 public class AnimationCurveParameter : VolumeParameter<AnimationCurve>
1864 {
1865 /// <summary>
1866 /// Creates a new <see cref="AnimationCurveParameter"/> instance.
1867 /// </summary>
1868 /// <param name="value">The initial value to be stored in the parameter</param>
1869 /// <param name="overrideState">The initial override state for the parameter</param>
1870 public AnimationCurveParameter(AnimationCurve value, bool overrideState = false)
1871 : base(value, overrideState) { }
1872
1873 /// <summary>
1874 /// Interpolates between two AnimationCurve values. Note that it will overwrite the values in lhsCurve,
1875 /// whereas rhsCurve data will be unchanged. Thus, it is legal to call it as:
1876 /// stateParam.Interp(stateParam, toParam, interpFactor);
1877 /// However, It should NOT be called when the lhsCurve parameter needs to be preserved. But the current
1878 /// framework modifies it anyway in VolumeComponent.Override for all types of VolumeParameters
1879 /// </summary>
1880 /// <param name="lhsCurve">The start value.</param>
1881 /// <param name="rhsCurve">The end value.</param>
1882 /// <param name="t">The interpolation factor in range [0,1].</param>
1883 public override void Interp(AnimationCurve lhsCurve, AnimationCurve rhsCurve, float t)
1884 {
1885 m_Value = lhsCurve;
1886 KeyframeUtility.InterpAnimationCurve(ref m_Value, rhsCurve, t);
1887 }
1888
1889 /// <inheritdoc/>
1890 public override void SetValue(VolumeParameter parameter)
1891 {
1892 m_Value.CopyFrom(((AnimationCurveParameter)parameter).m_Value);
1893 }
1894
1895 /// <inheritdoc/>
1896 public override object Clone()
1897 {
1898 return new AnimationCurveParameter(new AnimationCurve(GetValue<AnimationCurve>().keys), overrideState);
1899 }
1900
1901 /// <summary>
1902 /// Returns a hash code for the animationCurve.
1903 /// </summary>
1904 /// <returns>A hash code for the animationCurve.</returns>
1905 public override int GetHashCode()
1906 {
1907 unchecked
1908 {
1909 var hash = overrideState.GetHashCode();
1910
1911 return hash * 23 + value.GetHashCode();
1912 }
1913 }
1914 }
1915
1916 /// <summary>
1917 /// A <see cref="VolumeParameter"/> that holds a <see cref="Material"/> value.
1918 /// </summary>
1919 [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
1920 public class MaterialParameter : VolumeParameter<Material>
1921 {
1922 /// <summary>
1923 /// Creates a new <see cref="MaterialParameter"/> instance.
1924 /// </summary>
1925 /// <param name="value">The initial value to store in the parameter</param>
1926 /// <param name="overrideState">The initial override state for the parameter</param>
1927 public MaterialParameter(Material value, bool overrideState = false)
1928 : base(value, overrideState) { }
1929 }
1930}