A game about forced loneliness, made by TACStudios
at master 1930 lines 76 kB view raw
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&lt;float&gt; 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}