VolumeParameter.cs 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Reflection;
  7. namespace UnityEngine.Rendering
  8. {
  9. // We need this base class to be able to store a list of VolumeParameter in collections as we
  10. // can't store VolumeParameter<T> with variable T types in the same collection. As a result some
  11. // of the following is a bit hacky...
  12. /// <summary>
  13. /// The base class for all parameters types stored in a <see cref="VolumeComponent"/>.
  14. /// </summary>
  15. /// <seealso cref="VolumeParameter{T}"/>
  16. public abstract class VolumeParameter
  17. {
  18. /// <summary>
  19. /// A beautified string for debugger output. This is set on a <c>DebuggerDisplay</c> on every
  20. /// parameter types.
  21. /// </summary>
  22. public const string k_DebuggerDisplay = "{m_Value} ({m_OverrideState})";
  23. /// <summary>
  24. /// The current override state for this parameter. The Volume system considers overriden parameters
  25. /// for blending, and ignores non-overriden ones.
  26. /// </summary>
  27. /// <seealso cref="overrideState"/>
  28. [SerializeField]
  29. protected bool m_OverrideState;
  30. /// <summary>
  31. /// The current override state for this parameter. The Volume system considers overriden parameters
  32. /// for blending, and ignores non-overriden ones.
  33. /// </summary>
  34. /// <remarks>
  35. /// You can override this property to define custom behaviors when the override state
  36. /// changes.
  37. /// </remarks>
  38. /// <seealso cref="m_OverrideState"/>
  39. public virtual bool overrideState
  40. {
  41. get => m_OverrideState;
  42. set => m_OverrideState = value;
  43. }
  44. internal abstract void Interp(VolumeParameter from, VolumeParameter to, float t);
  45. /// <summary>
  46. /// Casts and gets the typed value of this parameter.
  47. /// </summary>
  48. /// <typeparam name="T">The type of the value stored in this parameter</typeparam>
  49. /// <returns>A value of type <typeparamref name="T"/>.</returns>
  50. /// <remarks>
  51. /// This method is unsafe and does not do any type checking.
  52. /// </remarks>
  53. public T GetValue<T>()
  54. {
  55. return ((VolumeParameter<T>) this).value;
  56. }
  57. /// <summary>
  58. /// Sets the value of this parameter to the value in <paramref name="parameter"/>.
  59. /// </summary>
  60. /// <param name="parameter">The <see cref="VolumeParameter"/> to copy the value from.</param>
  61. public abstract void SetValue(VolumeParameter parameter);
  62. /// <summary>
  63. /// Unity calls this method when the parent <see cref="VolumeComponent"/> loads.
  64. /// </summary>
  65. /// <remarks>
  66. /// Use this if you need to access fields and properties that you can not access in
  67. /// the constructor of a <c>ScriptableObject</c>. (<see cref="VolumeParameter"/> are
  68. /// generally declared and initialized in a <see cref="VolumeComponent"/>, which is a
  69. /// <c>ScriptableObject</c>). Unity calls this right after it constructs the parent
  70. /// <see cref="VolumeComponent"/>, thus allowing access to previously
  71. /// inaccessible fields and properties.
  72. /// </remarks>
  73. protected internal virtual void OnEnable()
  74. {
  75. }
  76. /// <summary>
  77. /// Unity calls this method when the parent <see cref="VolumeComponent"/> goes out of scope.
  78. /// </summary>
  79. protected internal virtual void OnDisable()
  80. {
  81. }
  82. /// <summary>
  83. /// Checks if a given type is an <see cref="ObjectParameter{T}"/>.
  84. /// </summary>
  85. /// <param name="type">The type to check.</param>
  86. /// <returns><c>true</c> if <paramref name="type"/> is an <see cref="ObjectParameter{T}"/>,
  87. /// <c>false</c> otherwise.</returns>
  88. public static bool IsObjectParameter(Type type)
  89. {
  90. if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ObjectParameter<>))
  91. return true;
  92. return type.BaseType != null
  93. && IsObjectParameter(type.BaseType);
  94. }
  95. }
  96. /// <summary>
  97. /// A generic implementation of <see cref="VolumeParameter"/>. Custom parameters should derive
  98. /// from this class and implement their own behavior.
  99. /// </summary>
  100. /// <typeparam name="T">The type of value to hold in this parameter.</typeparam>
  101. /// <remarks>
  102. /// <typeparamref name="T"/> should a serializable type.
  103. /// Due to limitations with the serialization system in Unity, you should not use this class
  104. /// directly to declare parameters in a <see cref="VolumeComponent"/>. Instead, use one of the
  105. /// pre-flatten types (like <see cref="FloatParameter"/>, or make your own by extending this
  106. /// class.
  107. /// </remarks>
  108. /// <example>
  109. /// This sample code shows how to make a custom parameter holding a <c>float</c>:
  110. /// <code>
  111. /// using UnityEngine.Rendering;
  112. ///
  113. /// [Serializable]
  114. /// public sealed class MyFloatParameter : VolumeParameter&lt;float&gt;
  115. /// {
  116. /// public MyFloatParameter(float value, bool overrideState = false)
  117. /// : base(value, overrideState) { }
  118. ///
  119. /// public sealed override void Interp(float from, float to, float t)
  120. /// {
  121. /// m_Value = from + (to - from) * t;
  122. /// }
  123. /// }
  124. /// </code>
  125. /// </example>
  126. /// <seealso cref="VolumeParameter"/>
  127. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  128. public class VolumeParameter<T> : VolumeParameter, IEquatable<VolumeParameter<T>>
  129. {
  130. /// <summary>
  131. /// The value stored and serialized by this parameter.
  132. /// </summary>
  133. [SerializeField]
  134. protected T m_Value;
  135. /// <summary>
  136. /// The value that this parameter stores.
  137. /// </summary>
  138. /// <remarks>
  139. /// You can override this property to define custom behaviors when the value is changed.
  140. /// </remarks>
  141. public virtual T value
  142. {
  143. get => m_Value;
  144. set => m_Value = value;
  145. }
  146. /// <summary>
  147. /// Creates a new <see cref="VolumeParameter{T}"/> instance.
  148. /// </summary>
  149. public VolumeParameter()
  150. : this(default, false)
  151. {
  152. }
  153. /// <summary>
  154. /// Creates a new <see cref="VolumeParameter{T}"/> instance.
  155. /// </summary>
  156. /// <param name="value">The initial value to store in the parameter.</param>
  157. /// <param name="overrideState">The initial override state for the parameter.</param>
  158. protected VolumeParameter(T value, bool overrideState)
  159. {
  160. m_Value = value;
  161. this.overrideState = overrideState;
  162. }
  163. internal override void Interp(VolumeParameter from, VolumeParameter to, float t)
  164. {
  165. // Note: this is relatively unsafe (assumes that from and to are both holding type T)
  166. Interp(from.GetValue<T>(), to.GetValue<T>(), t);
  167. }
  168. /// <summary>
  169. /// Interpolates two values using a factor <paramref name="t"/>.
  170. /// </summary>
  171. /// <remarks>
  172. /// By default, this method does a "snap" interpolation, meaning it returns the value
  173. /// <paramref name="to"/> if <paramref name="t"/> is higher than 0, and <paramref name="from"/>
  174. /// otherwise.
  175. /// </remarks>
  176. /// <param name="from">The start value.</param>
  177. /// <param name="to">The end value.</param>
  178. /// <param name="t">The interpolation factor in range [0,1].</param>
  179. public virtual void Interp(T from, T to, float t)
  180. {
  181. // Default interpolation is naive
  182. m_Value = t > 0f ? to : from;
  183. }
  184. /// <summary>
  185. /// Sets the value for this parameter and sets its override state to <c>true</c>.
  186. /// </summary>
  187. /// <param name="x">The value to assign to this parameter.</param>
  188. public void Override(T x)
  189. {
  190. overrideState = true;
  191. m_Value = x;
  192. }
  193. /// <summary>
  194. /// Sets the value of this parameter to the value in <paramref name="parameter"/>.
  195. /// </summary>
  196. /// <param name="parameter">The <see cref="VolumeParameter"/> to copy the value from.</param>
  197. public override void SetValue(VolumeParameter parameter)
  198. {
  199. m_Value = parameter.GetValue<T>();
  200. }
  201. /// <summary>
  202. /// Returns a hash code for the current object.
  203. /// </summary>
  204. /// <returns>A hash code for the current object.</returns>
  205. public override int GetHashCode()
  206. {
  207. unchecked
  208. {
  209. int hash = 17;
  210. hash = hash * 23 + overrideState.GetHashCode();
  211. if (!ReferenceEquals(value, null))
  212. hash = hash * 23 + value.GetHashCode();
  213. return hash;
  214. }
  215. }
  216. /// <summary>
  217. /// Returns a string that represents the current object.
  218. /// </summary>
  219. /// <returns>A string that represents the current object.</returns>
  220. public override string ToString() => $"{value} ({overrideState})";
  221. /// <summary>
  222. /// Compares the value in a parameter with another value of the same type.
  223. /// </summary>
  224. /// <param name="lhs">The first value in a <see cref="VolumeParameter"/>.</param>
  225. /// <param name="rhs">The second value.</param>
  226. /// <returns><c>true</c> if both values are equal, <c>false</c> otherwise.</returns>
  227. public static bool operator==(VolumeParameter<T> lhs, T rhs) => lhs != null && !ReferenceEquals(lhs.value, null) && lhs.value.Equals(rhs);
  228. /// <summary>
  229. /// Compares the value store in a parameter with another value of the same type.
  230. /// </summary>
  231. /// <param name="lhs">The first value in a <see cref="VolumeParameter"/>.</param>
  232. /// <param name="rhs">The second value.</param>
  233. /// <returns><c>false</c> if both values are equal, <c>true</c> otherwise</returns>
  234. public static bool operator!=(VolumeParameter<T> lhs, T rhs) => !(lhs == rhs);
  235. /// <summary>
  236. /// Checks if this parameter is equal to another.
  237. /// </summary>
  238. /// <param name="other">The other parameter to check against.</param>
  239. /// <returns><c>true</c> if both parameters are equal, <c>false</c> otherwise</returns>
  240. public bool Equals(VolumeParameter<T> other)
  241. {
  242. if (ReferenceEquals(null, other))
  243. return false;
  244. if (ReferenceEquals(this, other))
  245. return true;
  246. return EqualityComparer<T>.Default.Equals(m_Value, other.m_Value);
  247. }
  248. /// <summary>
  249. /// Determines whether two object instances are equal.
  250. /// </summary>
  251. /// <param name="obj">The object to compare with the current object.</param>
  252. /// <returns><c>true</c> if the specified object is equal to the current object, <c>false</c> otherwise.</returns>
  253. public override bool Equals(object obj)
  254. {
  255. if (ReferenceEquals(null, obj))
  256. return false;
  257. if (ReferenceEquals(this, obj))
  258. return true;
  259. if (obj.GetType() != GetType())
  260. return false;
  261. return Equals((VolumeParameter<T>)obj);
  262. }
  263. /// <summary>
  264. /// Explicitly downcast a <see cref="VolumeParameter{T}"/> to a value of type
  265. /// <typeparamref name="T"/>.
  266. /// </summary>
  267. /// <param name="prop">The parameter to downcast.</param>
  268. /// <returns>A value of type <typeparamref name="T"/>.</returns>
  269. public static explicit operator T(VolumeParameter<T> prop) => prop.m_Value;
  270. }
  271. //
  272. // The serialization system in Unity can't serialize generic types, the workaround is to extend
  273. // and flatten pre-defined generic types.
  274. // For enums it's recommended to make your own types on the spot, like so:
  275. //
  276. // [Serializable]
  277. // public sealed class MyEnumParameter : VolumeParameter<MyEnum> { }
  278. // public enum MyEnum { One, Two }
  279. //
  280. /// <summary>
  281. /// A <see cref="VolumeParameter"/> that holds a <c>bool</c> value.
  282. /// </summary>
  283. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  284. public class BoolParameter : VolumeParameter<bool>
  285. {
  286. /// <summary>
  287. /// Creates a new <see cref="BoolParameter"/> instance.
  288. /// </summary>
  289. /// <param name="value">The initial value to store in the parameter</param>
  290. /// <param name="overrideState">The initial override state for the parameter</param>
  291. public BoolParameter(bool value, bool overrideState = false)
  292. : base(value, overrideState) {}
  293. }
  294. /// <summary>
  295. /// A <see cref="VolumeParameter"/> that holds a <c>LayerMask</c> value.
  296. /// </summary>
  297. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  298. public class LayerMaskParameter : VolumeParameter<LayerMask>
  299. {
  300. /// <summary>
  301. /// Creates a new <see cref="LayerMaskParameter"/> instance.
  302. /// </summary>
  303. /// <param name="value">The initial value to store in the parameter.</param>
  304. /// <param name="overrideState">The initial override state for the parameter.</param>
  305. public LayerMaskParameter(LayerMask value, bool overrideState = false)
  306. : base(value, overrideState) {}
  307. }
  308. /// <summary>
  309. /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value.
  310. /// </summary>
  311. /// <seealso cref="MinIntParameter"/>
  312. /// <seealso cref="MaxIntParameter"/>
  313. /// <seealso cref="ClampedIntParameter"/>
  314. /// <seealso cref="NoInterpIntParameter"/>
  315. /// <seealso cref="NoInterpMinIntParameter"/>
  316. /// <seealso cref="NoInterpMaxIntParameter"/>
  317. /// <seealso cref="NoInterpClampedIntParameter"/>
  318. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  319. public class IntParameter : VolumeParameter<int>
  320. {
  321. /// <summary>
  322. /// Creates a new <see cref="IntParameter"/> instance.
  323. /// </summary>
  324. /// <param name="value">The initial value to store in the parameter.</param>
  325. /// <param name="overrideState">The initial override state for the parameter.</param>
  326. public IntParameter(int value, bool overrideState = false)
  327. : base(value, overrideState) {}
  328. /// <summary>
  329. /// Interpolates between two <c>int</c> values.
  330. /// </summary>
  331. /// <param name="from">The start value</param>
  332. /// <param name="to">The end value</param>
  333. /// <param name="t">The interpolation factor in range [0,1]</param>
  334. public sealed override void Interp(int from, int to, float t)
  335. {
  336. // Int snapping interpolation. Don't use this for enums as they don't necessarily have
  337. // contiguous values. Use the default interpolator instead (same as bool).
  338. m_Value = (int)(from + (to - from) * t);
  339. }
  340. }
  341. /// <summary>
  342. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value.
  343. /// </summary>
  344. /// <seealso cref="IntParameter"/>
  345. /// <seealso cref="MinIntParameter"/>
  346. /// <seealso cref="MaxIntParameter"/>
  347. /// <seealso cref="ClampedIntParameter"/>
  348. /// <seealso cref="NoInterpMinIntParameter"/>
  349. /// <seealso cref="NoInterpMaxIntParameter"/>
  350. /// <seealso cref="NoInterpClampedIntParameter"/>
  351. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  352. public class NoInterpIntParameter : VolumeParameter<int>
  353. {
  354. /// <summary>
  355. /// Creates a new <see cref="NoInterpIntParameter"/> instance.
  356. /// </summary>
  357. /// <param name="value">The initial value to store in the parameter.</param>
  358. /// <param name="overrideState">The initial override state for the parameter.</param>
  359. public NoInterpIntParameter(int value, bool overrideState = false)
  360. : base(value, overrideState) {}
  361. }
  362. /// <summary>
  363. /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped to a
  364. /// minimum value.
  365. /// </summary>
  366. /// <seealso cref="IntParameter"/>
  367. /// <seealso cref="MaxIntParameter"/>
  368. /// <seealso cref="ClampedIntParameter"/>
  369. /// <seealso cref="NoInterpIntParameter"/>
  370. /// <seealso cref="NoInterpMinIntParameter"/>
  371. /// <seealso cref="NoInterpMaxIntParameter"/>
  372. /// <seealso cref="NoInterpClampedIntParameter"/>
  373. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  374. public class MinIntParameter : IntParameter
  375. {
  376. /// <summary>
  377. /// The minimum value to clamp this parameter to.
  378. /// </summary>
  379. public int min;
  380. /// <summary>
  381. /// The value that this parameter stores.
  382. /// </summary>
  383. /// <remarks>
  384. /// You can override this property to define custom behaviors when the value is changed.
  385. /// </remarks>
  386. public override int value
  387. {
  388. get => m_Value;
  389. set => m_Value = Mathf.Max(value, min);
  390. }
  391. /// <summary>
  392. /// Creates a new <see cref="MinIntParameter"/> instance.
  393. /// </summary>
  394. /// <param name="value">The initial value to store in the parameter.</param>
  395. /// <param name="min">The minimum value to clamp the parameter to.</param>
  396. /// <param name="overrideState">The initial override state for the parameter.</param>
  397. public MinIntParameter(int value, int min, bool overrideState = false)
  398. : base(value, overrideState)
  399. {
  400. this.min = min;
  401. }
  402. }
  403. /// <summary>
  404. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value that
  405. /// clamped to a minimum value.
  406. /// </summary>
  407. /// <seealso cref="IntParameter"/>
  408. /// <seealso cref="MinIntParameter"/>
  409. /// <seealso cref="MaxIntParameter"/>
  410. /// <seealso cref="ClampedIntParameter"/>
  411. /// <seealso cref="NoInterpIntParameter"/>
  412. /// <seealso cref="NoInterpMaxIntParameter"/>
  413. /// <seealso cref="NoInterpClampedIntParameter"/>
  414. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  415. public class NoInterpMinIntParameter : VolumeParameter<int>
  416. {
  417. /// <summary>
  418. /// The minimum value to clamp this parameter to.
  419. /// </summary>
  420. public int min;
  421. /// <summary>
  422. /// The value that this parameter stores.
  423. /// </summary>
  424. /// <remarks>
  425. /// You can override this property to define custom behaviors when the value is changed.
  426. /// </remarks>
  427. public override int value
  428. {
  429. get => m_Value;
  430. set => m_Value = Mathf.Max(value, min);
  431. }
  432. /// <summary>
  433. /// Creates a new <see cref="NoInterpMinIntParameter"/> instance.
  434. /// </summary>
  435. /// <param name="value">The initial value to store in the parameter.</param>
  436. /// <param name="min">The minimum value to clamp the parameter to.</param>
  437. /// <param name="overrideState">The initial override state for the parameter.</param>
  438. public NoInterpMinIntParameter(int value, int min, bool overrideState = false)
  439. : base(value, overrideState)
  440. {
  441. this.min = min;
  442. }
  443. }
  444. /// <summary>
  445. /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped to a
  446. /// maximum value.
  447. /// </summary>
  448. /// <seealso cref="IntParameter"/>
  449. /// <seealso cref="MinIntParameter"/>
  450. /// <seealso cref="ClampedIntParameter"/>
  451. /// <seealso cref="NoInterpIntParameter"/>
  452. /// <seealso cref="NoInterpMinIntParameter"/>
  453. /// <seealso cref="NoInterpMaxIntParameter"/>
  454. /// <seealso cref="NoInterpClampedIntParameter"/>
  455. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  456. public class MaxIntParameter : IntParameter
  457. {
  458. /// <summary>
  459. /// The maximum value to clamp this parameter to.
  460. /// </summary>
  461. public int max;
  462. /// <summary>
  463. /// The value that this parameter stores.
  464. /// </summary>
  465. /// <remarks>
  466. /// You can override this property to define custom behaviors when the value is changed.
  467. /// </remarks>
  468. public override int value
  469. {
  470. get => m_Value;
  471. set => m_Value = Mathf.Min(value, max);
  472. }
  473. /// <summary>
  474. /// Creates a new <see cref="MaxIntParameter"/> instance.
  475. /// </summary>
  476. /// <param name="value">The initial value to store in the parameter.</param>
  477. /// <param name="max">The maximum value to clamp the parameter to.</param>
  478. /// <param name="overrideState">The initial override state for the parameter.</param>
  479. public MaxIntParameter(int value, int max, bool overrideState = false)
  480. : base(value, overrideState)
  481. {
  482. this.max = max;
  483. }
  484. }
  485. /// <summary>
  486. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value that
  487. /// clamped to a maximum value.
  488. /// </summary>
  489. /// <seealso cref="IntParameter"/>
  490. /// <seealso cref="MinIntParameter"/>
  491. /// <seealso cref="MaxIntParameter"/>
  492. /// <seealso cref="ClampedIntParameter"/>
  493. /// <seealso cref="NoInterpIntParameter"/>
  494. /// <seealso cref="NoInterpMinIntParameter"/>
  495. /// <seealso cref="NoInterpClampedIntParameter"/>
  496. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  497. public class NoInterpMaxIntParameter : VolumeParameter<int>
  498. {
  499. /// <summary>
  500. /// The maximum value to clamp this parameter to.
  501. /// </summary>
  502. public int max;
  503. /// <summary>
  504. /// The value that this parameter stores.
  505. /// </summary>
  506. /// <remarks>
  507. /// You can override this property to define custom behaviors when the value is changed.
  508. /// </remarks>
  509. public override int value
  510. {
  511. get => m_Value;
  512. set => m_Value = Mathf.Min(value, max);
  513. }
  514. /// <summary>
  515. /// Creates a new <see cref="NoInterpMaxIntParameter"/> instance.
  516. /// </summary>
  517. /// <param name="value">The initial value to store in the parameter.</param>
  518. /// <param name="max">The maximum value to clamp the parameter to.</param>
  519. /// <param name="overrideState">The initial override state for the parameter.</param>
  520. public NoInterpMaxIntParameter(int value, int max, bool overrideState = false)
  521. : base(value, overrideState)
  522. {
  523. this.max = max;
  524. }
  525. }
  526. /// <summary>
  527. /// A <see cref="VolumeParameter"/> that holds an <c>int</c> value clamped between a
  528. /// minimum and a maximum value.
  529. /// </summary>
  530. /// <seealso cref="IntParameter"/>
  531. /// <seealso cref="MinIntParameter"/>
  532. /// <seealso cref="MaxIntParameter"/>
  533. /// <seealso cref="NoInterpIntParameter"/>
  534. /// <seealso cref="NoInterpMinIntParameter"/>
  535. /// <seealso cref="NoInterpMaxIntParameter"/>
  536. /// <seealso cref="NoInterpClampedIntParameter"/>
  537. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  538. public class ClampedIntParameter : IntParameter
  539. {
  540. /// <summary>
  541. /// The minimum value to clamp this parameter to.
  542. /// </summary>
  543. public int min;
  544. /// <summary>
  545. /// The maximum value to clamp this parameter to.
  546. /// </summary>
  547. public int max;
  548. /// <summary>
  549. /// The value that this parameter stores.
  550. /// </summary>
  551. /// <remarks>
  552. /// You can override this property to define custom behaviors when the value is changed.
  553. /// </remarks>
  554. public override int value
  555. {
  556. get => m_Value;
  557. set => m_Value = Mathf.Clamp(value, min, max);
  558. }
  559. /// <summary>
  560. /// Creates a new <see cref="ClampedIntParameter"/> instance.
  561. /// </summary>
  562. /// <param name="value">The initial value to store in the parameter.</param>
  563. /// <param name="min">The minimum value to clamp the parameter to</param>
  564. /// <param name="max">The maximum value to clamp the parameter to.</param>
  565. /// <param name="overrideState">The initial override state for the parameter.</param>
  566. public ClampedIntParameter(int value, int min, int max, bool overrideState = false)
  567. : base(value, overrideState)
  568. {
  569. this.min = min;
  570. this.max = max;
  571. }
  572. }
  573. /// <summary>
  574. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>int</c> value
  575. /// clamped between a minimum and a maximum value.
  576. /// </summary>
  577. /// <seealso cref="IntParameter"/>
  578. /// <seealso cref="MinIntParameter"/>
  579. /// <seealso cref="MaxIntParameter"/>
  580. /// <seealso cref="ClampedIntParameter"/>
  581. /// <seealso cref="NoInterpIntParameter"/>
  582. /// <seealso cref="NoInterpMinIntParameter"/>
  583. /// <seealso cref="NoInterpMaxIntParameter"/>
  584. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  585. public class NoInterpClampedIntParameter : VolumeParameter<int>
  586. {
  587. /// <summary>
  588. /// The minimum value to clamp this parameter to.
  589. /// </summary>
  590. public int min;
  591. /// <summary>
  592. /// The maximum value to clamp this parameter to.
  593. /// </summary>
  594. public int max;
  595. /// <summary>
  596. /// The value that this parameter stores.
  597. /// </summary>
  598. /// <remarks>
  599. /// You can override this property to define custom behaviors when the value is changed.
  600. /// </remarks>
  601. public override int value
  602. {
  603. get => m_Value;
  604. set => m_Value = Mathf.Clamp(value, min, max);
  605. }
  606. /// <summary>
  607. /// Creates a new <see cref="NoInterpClampedIntParameter"/> instance.
  608. /// </summary>
  609. /// <param name="value">The initial value to store in the parameter.</param>
  610. /// <param name="min">The minimum value to clamp the parameter to</param>
  611. /// <param name="max">The maximum value to clamp the parameter to.</param>
  612. /// <param name="overrideState">The initial override state for the parameter.</param>
  613. public NoInterpClampedIntParameter(int value, int min, int max, bool overrideState = false)
  614. : base(value, overrideState)
  615. {
  616. this.min = min;
  617. this.max = max;
  618. }
  619. }
  620. /// <summary>
  621. /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value.
  622. /// </summary>
  623. /// <seealso cref="MinFloatParameter"/>
  624. /// <seealso cref="MaxFloatParameter"/>
  625. /// <seealso cref="ClampedFloatParameter"/>
  626. /// <seealso cref="FloatRangeParameter"/>
  627. /// <seealso cref="NoInterpFloatParameter"/>
  628. /// <seealso cref="NoInterpMinFloatParameter"/>
  629. /// <seealso cref="NoInterpMaxFloatParameter"/>
  630. /// <seealso cref="NoInterpClampedFloatParameter"/>
  631. /// <seealso cref="NoInterpFloatRangeParameter"/>
  632. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  633. public class FloatParameter : VolumeParameter<float>
  634. {
  635. /// <summary>
  636. /// Creates a new <seealso cref="FloatParameter"/> instance.
  637. /// </summary>
  638. /// <param name="value">The initial value to store in the parameter</param>
  639. /// <param name="overrideState">The initial override state for the parameter</param>
  640. public FloatParameter(float value, bool overrideState = false)
  641. : base(value, overrideState) {}
  642. /// <summary>
  643. /// Interpolates between two <c>float</c> values.
  644. /// </summary>
  645. /// <param name="from">The start value</param>
  646. /// <param name="to">The end value</param>
  647. /// <param name="t">The interpolation factor in range [0,1]</param>
  648. public sealed override void Interp(float from, float to, float t)
  649. {
  650. m_Value = from + (to - from) * t;
  651. }
  652. }
  653. /// <summary>
  654. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value.
  655. /// </summary>
  656. /// <seealso cref="FloatParameter"/>
  657. /// <seealso cref="MinFloatParameter"/>
  658. /// <seealso cref="MaxFloatParameter"/>
  659. /// <seealso cref="ClampedFloatParameter"/>
  660. /// <seealso cref="FloatRangeParameter"/>
  661. /// <seealso cref="NoInterpMinFloatParameter"/>
  662. /// <seealso cref="NoInterpMaxFloatParameter"/>
  663. /// <seealso cref="NoInterpClampedFloatParameter"/>
  664. /// <seealso cref="NoInterpFloatRangeParameter"/>
  665. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  666. public class NoInterpFloatParameter : VolumeParameter<float>
  667. {
  668. /// <summary>
  669. /// Creates a new <seealso cref="NoInterpFloatParameter"/> instance.
  670. /// </summary>
  671. /// <param name="value">The initial value to store in the parameter</param>
  672. /// <param name="overrideState">The initial override state for the parameter.</param>
  673. public NoInterpFloatParameter(float value, bool overrideState = false)
  674. : base(value, overrideState) {}
  675. }
  676. /// <summary>
  677. /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped to a minimum value.
  678. /// </summary>
  679. /// <seealso cref="FloatParameter"/>
  680. /// <seealso cref="MaxFloatParameter"/>
  681. /// <seealso cref="ClampedFloatParameter"/>
  682. /// <seealso cref="FloatRangeParameter"/>
  683. /// <seealso cref="NoInterpFloatParameter"/>
  684. /// <seealso cref="NoInterpMinFloatParameter"/>
  685. /// <seealso cref="NoInterpMaxFloatParameter"/>
  686. /// <seealso cref="NoInterpClampedFloatParameter"/>
  687. /// <seealso cref="NoInterpFloatRangeParameter"/>
  688. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  689. public class MinFloatParameter : FloatParameter
  690. {
  691. /// <summary>
  692. /// The minimum value to clamp this parameter to.
  693. /// </summary>
  694. public float min;
  695. /// <summary>
  696. /// The value that this parameter stores.
  697. /// </summary>
  698. /// <remarks>
  699. /// You can override this property to define custom behaviors when the value is changed.
  700. /// </remarks>
  701. public override float value
  702. {
  703. get => m_Value;
  704. set => m_Value = Mathf.Max(value, min);
  705. }
  706. /// <summary>
  707. /// Creates a new <seealso cref="MinFloatParameter"/> instance.
  708. /// </summary>
  709. /// <param name="value">The initial value to store in the parameter.</param>
  710. /// <param name="min">The minimum value to clamp the parameter to.</param>
  711. /// <param name="overrideState">The initial override state for the parameter.</param>
  712. public MinFloatParameter(float value, float min, bool overrideState = false)
  713. : base(value, overrideState)
  714. {
  715. this.min = min;
  716. }
  717. }
  718. /// <summary>
  719. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped to
  720. /// a minimum value.
  721. /// </summary>
  722. /// <seealso cref="FloatParameter"/>
  723. /// <seealso cref="MinFloatParameter"/>
  724. /// <seealso cref="MaxFloatParameter"/>
  725. /// <seealso cref="ClampedFloatParameter"/>
  726. /// <seealso cref="FloatRangeParameter"/>
  727. /// <seealso cref="NoInterpFloatParameter"/>
  728. /// <seealso cref="NoInterpMaxFloatParameter"/>
  729. /// <seealso cref="NoInterpClampedFloatParameter"/>
  730. /// <seealso cref="NoInterpFloatRangeParameter"/>
  731. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  732. public class NoInterpMinFloatParameter : VolumeParameter<float>
  733. {
  734. /// <summary>
  735. /// The minimum value to clamp this parameter to.
  736. /// </summary>
  737. public float min;
  738. /// <summary>
  739. /// The value that this parameter stores.
  740. /// </summary>
  741. /// <remarks>
  742. /// You can override this property to define custom behaviors when the value is changed.
  743. /// </remarks>
  744. public override float value
  745. {
  746. get => m_Value;
  747. set => m_Value = Mathf.Max(value, min);
  748. }
  749. /// <summary>
  750. /// Creates a new <seealso cref="NoInterpMinFloatParameter"/> instance.
  751. /// </summary>
  752. /// <param name="value">The initial value to storedin the parameter.</param>
  753. /// <param name="min">The minimum value to clamp the parameter to.</param>
  754. /// <param name="overrideState">The initial override state for the parameter.</param>
  755. public NoInterpMinFloatParameter(float value, float min, bool overrideState = false)
  756. : base(value, overrideState)
  757. {
  758. this.min = min;
  759. }
  760. }
  761. /// <summary>
  762. /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped to a max value.
  763. /// </summary>
  764. /// <seealso cref="FloatParameter"/>
  765. /// <seealso cref="MinFloatParameter"/>
  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 MaxFloatParameter : FloatParameter
  775. {
  776. /// <summary>
  777. /// The maximum value to clamp this parameter to.
  778. /// </summary>
  779. public float max;
  780. /// <summary>
  781. /// The value that this parameter stores.
  782. /// </summary>
  783. /// <remarks>
  784. /// You can override this property to define custom behaviors when the value is changed.
  785. /// </remarks>
  786. public override float value
  787. {
  788. get => m_Value;
  789. set => m_Value = Mathf.Min(value, max);
  790. }
  791. /// <summary>
  792. /// Creates a new <seealso cref="MaxFloatParameter"/> instance.
  793. /// </summary>
  794. /// <param name="value">The initial value to store in the parameter.</param>
  795. /// <param name="max">The maximum value to clamp the parameter to.</param>
  796. /// <param name="overrideState">The initial override state for the parameter.</param>
  797. public MaxFloatParameter(float value, float max, bool overrideState = false)
  798. : base(value, overrideState)
  799. {
  800. this.max = max;
  801. }
  802. }
  803. /// <summary>
  804. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped to
  805. /// a maximum value.
  806. /// </summary>
  807. /// <seealso cref="FloatParameter"/>
  808. /// <seealso cref="MinFloatParameter"/>
  809. /// <seealso cref="MaxFloatParameter"/>
  810. /// <seealso cref="ClampedFloatParameter"/>
  811. /// <seealso cref="FloatRangeParameter"/>
  812. /// <seealso cref="NoInterpFloatParameter"/>
  813. /// <seealso cref="NoInterpMinFloatParameter"/>
  814. /// <seealso cref="NoInterpClampedFloatParameter"/>
  815. /// <seealso cref="NoInterpFloatRangeParameter"/>
  816. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  817. public class NoInterpMaxFloatParameter : VolumeParameter<float>
  818. {
  819. /// <summary>
  820. /// The maximum value to clamp this parameter to.
  821. /// </summary>
  822. public float max;
  823. /// <summary>
  824. /// The value that this parameter stores.
  825. /// </summary>
  826. /// <remarks>
  827. /// You can override this property to define custom behaviors when the value is changed.
  828. /// </remarks>
  829. public override float value
  830. {
  831. get => m_Value;
  832. set => m_Value = Mathf.Min(value, max);
  833. }
  834. /// <summary>
  835. /// Creates a new <seealso cref="NoInterpMaxFloatParameter"/> instance.
  836. /// </summary>
  837. /// <param name="value">The initial value to store in the parameter.</param>
  838. /// <param name="max">The maximum value to clamp the parameter to.</param>
  839. /// <param name="overrideState">The initial override state for the parameter.</param>
  840. public NoInterpMaxFloatParameter(float value, float max, bool overrideState = false)
  841. : base(value, overrideState)
  842. {
  843. this.max = max;
  844. }
  845. }
  846. /// <summary>
  847. /// A <see cref="VolumeParameter"/> that holds a <c>float</c> value clamped between a minimum and a
  848. /// maximum value.
  849. /// </summary>
  850. /// <seealso cref="FloatParameter"/>
  851. /// <seealso cref="MinFloatParameter"/>
  852. /// <seealso cref="MaxFloatParameter"/>
  853. /// <seealso cref="FloatRangeParameter"/>
  854. /// <seealso cref="NoInterpFloatParameter"/>
  855. /// <seealso cref="NoInterpMinFloatParameter"/>
  856. /// <seealso cref="NoInterpMaxFloatParameter"/>
  857. /// <seealso cref="NoInterpClampedFloatParameter"/>
  858. /// <seealso cref="NoInterpFloatRangeParameter"/>
  859. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  860. public class ClampedFloatParameter : FloatParameter
  861. {
  862. /// <summary>
  863. /// The minimum value to clamp this parameter to.
  864. /// </summary>
  865. public float min;
  866. /// <summary>
  867. /// The maximum value to clamp this parameter to.
  868. /// </summary>
  869. public float max;
  870. /// <summary>
  871. /// The value that this parameter stores.
  872. /// </summary>
  873. /// <remarks>
  874. /// You can override this property to define custom behaviors when the value is changed.
  875. /// </remarks>
  876. public override float value
  877. {
  878. get => m_Value;
  879. set => m_Value = Mathf.Clamp(value, min, max);
  880. }
  881. /// <summary>
  882. /// Creates a new <seealso cref="ClampedFloatParameter"/> instance.
  883. /// </summary>
  884. /// <param name="value">The initial value to store in the parameter.</param>
  885. /// <param name="min">The minimum value to clamp the parameter to</param>
  886. /// <param name="max">The maximum value to clamp the parameter to.</param>
  887. /// <param name="overrideState">The initial override state for the parameter.</param>
  888. public ClampedFloatParameter(float value, float min, float max, bool overrideState = false)
  889. : base(value, overrideState)
  890. {
  891. this.min = min;
  892. this.max = max;
  893. }
  894. }
  895. /// <summary>
  896. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>float</c> value clamped between
  897. /// a minimum and a maximum value.
  898. /// </summary>
  899. /// <seealso cref="FloatParameter"/>
  900. /// <seealso cref="MinFloatParameter"/>
  901. /// <seealso cref="MaxFloatParameter"/>
  902. /// <seealso cref="ClampedFloatParameter"/>
  903. /// <seealso cref="FloatRangeParameter"/>
  904. /// <seealso cref="NoInterpFloatParameter"/>
  905. /// <seealso cref="NoInterpMinFloatParameter"/>
  906. /// <seealso cref="NoInterpMaxFloatParameter"/>
  907. /// <seealso cref="NoInterpFloatRangeParameter"/>
  908. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  909. public class NoInterpClampedFloatParameter : VolumeParameter<float>
  910. {
  911. /// <summary>
  912. /// The minimum value to clamp this parameter to.
  913. /// </summary>
  914. public float min;
  915. /// <summary>
  916. /// The maximum value to clamp this parameter to.
  917. /// </summary>
  918. public float max;
  919. /// <summary>
  920. /// The value that this parameter stores.
  921. /// </summary>
  922. /// <remarks>
  923. /// You can override this property to define custom behaviors when the value is changed.
  924. /// </remarks>
  925. public override float value
  926. {
  927. get => m_Value;
  928. set => m_Value = Mathf.Clamp(value, min, max);
  929. }
  930. /// <summary>
  931. /// Creates a new <seealso cref="NoInterpClampedFloatParameter"/> instance.
  932. /// </summary>
  933. /// <param name="value">The initial value to store in the parameter.</param>
  934. /// <param name="min">The minimum value to clamp the parameter to</param>
  935. /// <param name="max">The maximum value to clamp the parameter to.</param>
  936. /// <param name="overrideState">The initial override state for the parameter.</param>
  937. public NoInterpClampedFloatParameter(float value, float min, float max, bool overrideState = false)
  938. : base(value, overrideState)
  939. {
  940. this.min = min;
  941. this.max = max;
  942. }
  943. }
  944. /// <summary>
  945. /// A <see cref="VolumeParameter"/> that holds a <c>Vector2</c> value holding a range of two
  946. /// <c>float</c> values clamped between a minimum and a maximum value.
  947. /// </summary>
  948. /// <seealso cref="FloatParameter"/>
  949. /// <seealso cref="MinFloatParameter"/>
  950. /// <seealso cref="MaxFloatParameter"/>
  951. /// <seealso cref="ClampedFloatParameter"/>
  952. /// <seealso cref="NoInterpFloatParameter"/>
  953. /// <seealso cref="NoInterpMinFloatParameter"/>
  954. /// <seealso cref="NoInterpMaxFloatParameter"/>
  955. /// <seealso cref="NoInterpClampedFloatParameter"/>
  956. /// <seealso cref="NoInterpFloatRangeParameter"/>
  957. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  958. public class FloatRangeParameter : VolumeParameter<Vector2>
  959. {
  960. /// <summary>
  961. /// The minimum value to clamp this parameter to.
  962. /// </summary>
  963. public float min;
  964. /// <summary>
  965. /// The maximum value to clamp this parameter to.
  966. /// </summary>
  967. public float max;
  968. /// <summary>
  969. /// The value that this parameter stores.
  970. /// </summary>
  971. /// <remarks>
  972. /// You can override this property to define custom behaviors when the value is changed.
  973. /// </remarks>
  974. public override Vector2 value
  975. {
  976. get => m_Value;
  977. set
  978. {
  979. m_Value.x = Mathf.Max(value.x, min);
  980. m_Value.y = Mathf.Min(value.y, max);
  981. }
  982. }
  983. /// <summary>
  984. /// Creates a new <seealso cref="FloatRangeParameter"/> instance.
  985. /// </summary>
  986. /// <param name="value">The initial value to store in the parameter.</param>
  987. /// <param name="min">The minimum value to clamp the parameter to</param>
  988. /// <param name="max">The maximum value to clamp the parameter to.</param>
  989. /// <param name="overrideState">The initial override state for the parameter.</param>
  990. public FloatRangeParameter(Vector2 value, float min, float max, bool overrideState = false)
  991. : base(value, overrideState)
  992. {
  993. this.min = min;
  994. this.max = max;
  995. }
  996. /// <summary>
  997. /// Interpolates between two <c>Vector2</c> values.
  998. /// </summary>
  999. /// <param name="from">The start value</param>
  1000. /// <param name="to">The end value</param>
  1001. /// <param name="t">The interpolation factor in range [0,1]</param>
  1002. public override void Interp(Vector2 from, Vector2 to, float t)
  1003. {
  1004. m_Value.x = from.x + (to.x - from.x) * t;
  1005. m_Value.y = from.y + (to.y - from.y) * t;
  1006. }
  1007. }
  1008. /// <summary>
  1009. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector2</c> value holding
  1010. /// a range of two <c>float</c> values clamped between a minimum and a maximum value.
  1011. /// </summary>
  1012. /// <seealso cref="FloatParameter"/>
  1013. /// <seealso cref="MinFloatParameter"/>
  1014. /// <seealso cref="MaxFloatParameter"/>
  1015. /// <seealso cref="ClampedFloatParameter"/>
  1016. /// <seealso cref="FloatRangeParameter"/>
  1017. /// <seealso cref="NoInterpFloatParameter"/>
  1018. /// <seealso cref="NoInterpMinFloatParameter"/>
  1019. /// <seealso cref="NoInterpMaxFloatParameter"/>
  1020. /// <seealso cref="NoInterpClampedFloatParameter"/>
  1021. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1022. public class NoInterpFloatRangeParameter : VolumeParameter<Vector2>
  1023. {
  1024. /// <summary>
  1025. /// The minimum value to clamp this parameter to.
  1026. /// </summary>
  1027. public float min;
  1028. /// <summary>
  1029. /// The maximum value to clamp this parameter to.
  1030. /// </summary>
  1031. public float max;
  1032. /// <summary>
  1033. /// The value that this parameter stores.
  1034. /// </summary>
  1035. /// <remarks>
  1036. /// You can override this property to define custom behaviors when the value is changed.
  1037. /// </remarks>
  1038. public override Vector2 value
  1039. {
  1040. get => m_Value;
  1041. set
  1042. {
  1043. m_Value.x = Mathf.Max(value.x, min);
  1044. m_Value.y = Mathf.Min(value.y, max);
  1045. }
  1046. }
  1047. /// <summary>
  1048. /// Creates a new <seealso cref="NoInterpFloatRangeParameter"/> instance.
  1049. /// </summary>
  1050. /// <param name="value">The initial value to store in the parameter.</param>
  1051. /// <param name="min">The minimum value to clamp the parameter to</param>
  1052. /// <param name="max">The maximum value to clamp the parameter to.</param>
  1053. /// <param name="overrideState">The initial override state for the parameter.</param>
  1054. public NoInterpFloatRangeParameter(Vector2 value, float min, float max, bool overrideState = false)
  1055. : base(value, overrideState)
  1056. {
  1057. this.min = min;
  1058. this.max = max;
  1059. }
  1060. }
  1061. /// <summary>
  1062. /// A <see cref="VolumeParameter"/> that holds a <c>Color</c> value.
  1063. /// </summary>
  1064. /// <seealso cref="NoInterpColorParameter"/>
  1065. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1066. public class ColorParameter : VolumeParameter<Color>
  1067. {
  1068. /// <summary>
  1069. /// Is this color HDR?
  1070. /// </summary>
  1071. public bool hdr = false;
  1072. /// <summary>
  1073. /// Should the alpha channel be editable in the editor?
  1074. /// </summary>
  1075. public bool showAlpha = true;
  1076. /// <summary>
  1077. /// Should the eye dropper be visible in the editor?
  1078. /// </summary>
  1079. public bool showEyeDropper = true;
  1080. /// <summary>
  1081. /// Creates a new <seealso cref="ColorParameter"/> instance.
  1082. /// </summary>
  1083. /// <param name="value">The initial value to store in the parameter.</param>
  1084. /// <param name="overrideState">The initial override state for the parameter.</param>
  1085. public ColorParameter(Color value, bool overrideState = false)
  1086. : base(value, overrideState) {}
  1087. /// <summary>
  1088. /// Creates a new <seealso cref="ColorParameter"/> instance.
  1089. /// </summary>
  1090. /// <param name="value">The initial value to store in the parameter.</param>
  1091. /// <param name="hdr">Specifies whether the color is HDR or not.</param>
  1092. /// <param name="showAlpha">Specifies whether you can edit the alpha channel in the Inspector or not.</param>
  1093. /// <param name="showEyeDropper">Specifies whether the eye dropper is visible in the editor or not.</param>
  1094. /// <param name="overrideState">The initial override state for the parameter.</param>
  1095. public ColorParameter(Color value, bool hdr, bool showAlpha, bool showEyeDropper, bool overrideState = false)
  1096. : base(value, overrideState)
  1097. {
  1098. this.hdr = hdr;
  1099. this.showAlpha = showAlpha;
  1100. this.showEyeDropper = showEyeDropper;
  1101. this.overrideState = overrideState;
  1102. }
  1103. /// <summary>
  1104. /// Interpolates between two <c>Color</c> values.
  1105. /// </summary>
  1106. /// <remarks>
  1107. /// For performance reasons, this function interpolates the RGBA channels directly.
  1108. /// </remarks>
  1109. /// <param name="from">The start value.</param>
  1110. /// <param name="to">The end value.</param>
  1111. /// <param name="t">The interpolation factor in range [0,1].</param>
  1112. public override void Interp(Color from, Color to, float t)
  1113. {
  1114. // Lerping color values is a sensitive subject... We looked into lerping colors using
  1115. // HSV and LCH but they have some downsides that make them not work correctly in all
  1116. // situations, so we stick with RGB lerping for now, at least its behavior is
  1117. // predictable despite looking desaturated when `t ~= 0.5` and it's faster anyway.
  1118. m_Value.r = from.r + (to.r - from.r) * t;
  1119. m_Value.g = from.g + (to.g - from.g) * t;
  1120. m_Value.b = from.b + (to.b - from.b) * t;
  1121. m_Value.a = from.a + (to.a - from.a) * t;
  1122. }
  1123. }
  1124. /// <summary>
  1125. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Color</c> value.
  1126. /// </summary>
  1127. /// <seealso cref="ColorParameter"/>
  1128. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1129. public class NoInterpColorParameter : VolumeParameter<Color>
  1130. {
  1131. /// <summary>
  1132. /// Specifies whether the color is HDR or not.
  1133. /// </summary>
  1134. public bool hdr = false;
  1135. /// <summary>
  1136. /// Specifies whether you can edit the alpha channel in the Inspector or not.
  1137. /// </summary>
  1138. public bool showAlpha = true;
  1139. /// <summary>
  1140. /// Specifies whether the eye dropper is visible in the editor or not.
  1141. /// </summary>
  1142. public bool showEyeDropper = true;
  1143. /// <summary>
  1144. /// Creates a new <seealso cref="NoInterpColorParameter"/> instance.
  1145. /// </summary>
  1146. /// <param name="value">The initial value to store in the parameter.</param>
  1147. /// <param name="overrideState">The initial override state for the parameter.</param>
  1148. public NoInterpColorParameter(Color value, bool overrideState = false)
  1149. : base(value, overrideState) {}
  1150. /// <summary>
  1151. /// Creates a new <seealso cref="NoInterpColorParameter"/> instance.
  1152. /// </summary>
  1153. /// <param name="value">The initial value to store in the parameter.</param>
  1154. /// <param name="hdr">Specifies whether the color is HDR or not.</param>
  1155. /// <param name="showAlpha">Specifies whether you can edit the alpha channel in the Inspector or not.</param>
  1156. /// <param name="showEyeDropper">Specifies whether the eye dropper is visible in the editor or not.</param>
  1157. /// <param name="overrideState">The initial override state for the parameter.</param>
  1158. public NoInterpColorParameter(Color value, bool hdr, bool showAlpha, bool showEyeDropper, bool overrideState = false)
  1159. : base(value, overrideState)
  1160. {
  1161. this.hdr = hdr;
  1162. this.showAlpha = showAlpha;
  1163. this.showEyeDropper = showEyeDropper;
  1164. this.overrideState = overrideState;
  1165. }
  1166. }
  1167. /// <summary>
  1168. /// A <see cref="VolumeParameter"/> that holds a <c>Vector2</c> value.
  1169. /// </summary>
  1170. /// <seealso cref="NoInterpVector2Parameter"/>
  1171. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1172. public class Vector2Parameter : VolumeParameter<Vector2>
  1173. {
  1174. /// <summary>
  1175. /// Creates a new <seealso cref="Vector2Parameter"/> instance.
  1176. /// </summary>
  1177. /// <param name="value">The initial value to store in the parameter.</param>
  1178. /// <param name="overrideState">The initial override state for the parameter.</param>
  1179. public Vector2Parameter(Vector2 value, bool overrideState = false)
  1180. : base(value, overrideState) { }
  1181. /// <summary>
  1182. /// Interpolates between two <c>Vector2</c> values.
  1183. /// </summary>
  1184. /// <param name="from">The start value.</param>
  1185. /// <param name="to">The end value.</param>
  1186. /// <param name="t">The interpolation factor in range [0,1].</param>
  1187. public override void Interp(Vector2 from, Vector2 to, float t)
  1188. {
  1189. m_Value.x = from.x + (to.x - from.x) * t;
  1190. m_Value.y = from.y + (to.y - from.y) * t;
  1191. }
  1192. }
  1193. /// <summary>
  1194. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector2</c> value.
  1195. /// </summary>
  1196. /// <seealso cref="Vector2Parameter"/>
  1197. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1198. public class NoInterpVector2Parameter : VolumeParameter<Vector2>
  1199. {
  1200. /// <summary>
  1201. /// Creates a new <seealso cref="NoInterpVector2Parameter"/> instance.
  1202. /// </summary>
  1203. /// <param name="value">The initial value to store in the parameter.</param>
  1204. /// <param name="overrideState">The initial override state for the parameter.</param>
  1205. public NoInterpVector2Parameter(Vector2 value, bool overrideState = false)
  1206. : base(value, overrideState) {}
  1207. }
  1208. /// <summary>
  1209. /// A <see cref="VolumeParameter"/> that holds a <c>Vector3</c> value.
  1210. /// </summary>
  1211. /// <seealso cref="NoInterpVector3Parameter"/>
  1212. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1213. public class Vector3Parameter : VolumeParameter<Vector3>
  1214. {
  1215. /// <summary>
  1216. /// Creates a new <seealso cref="Vector3Parameter"/> instance.
  1217. /// </summary>
  1218. /// <param name="value">The initial value to store in the parameter.</param>
  1219. /// <param name="overrideState">The initial override state for the parameter.</param>
  1220. public Vector3Parameter(Vector3 value, bool overrideState = false)
  1221. : base(value, overrideState) { }
  1222. /// <summary>
  1223. /// Interpolates between two <c>Vector3</c> values.
  1224. /// </summary>
  1225. /// <param name="from">The start value.</param>
  1226. /// <param name="to">The end value.</param>
  1227. /// <param name="t">The interpolation factor in range [0,1].</param>
  1228. public override void Interp(Vector3 from, Vector3 to, float t)
  1229. {
  1230. m_Value.x = from.x + (to.x - from.x) * t;
  1231. m_Value.y = from.y + (to.y - from.y) * t;
  1232. m_Value.z = from.z + (to.z - from.z) * t;
  1233. }
  1234. }
  1235. /// <summary>
  1236. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector3</c> value.
  1237. /// </summary>
  1238. /// <seealso cref="Vector3Parameter"/>
  1239. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1240. public class NoInterpVector3Parameter : VolumeParameter<Vector3>
  1241. {
  1242. /// <summary>
  1243. /// Creates a new <seealso cref="Vector3Parameter"/> instance.
  1244. /// </summary>
  1245. /// <param name="value">The initial value to store in the parameter.</param>
  1246. /// <param name="overrideState">The initial override state for the parameter.</param>
  1247. public NoInterpVector3Parameter(Vector3 value, bool overrideState = false)
  1248. : base(value, overrideState) {}
  1249. }
  1250. /// <summary>
  1251. /// A <see cref="VolumeParameter"/> that holds a <c>Vector4</c> value.
  1252. /// </summary>
  1253. /// <seealso cref="NoInterpVector4Parameter"/>
  1254. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1255. public class Vector4Parameter : VolumeParameter<Vector4>
  1256. {
  1257. /// <summary>
  1258. /// Creates a new <seealso cref="Vector4Parameter"/> instance.
  1259. /// </summary>
  1260. /// <param name="value">The initial value to store in the parameter.</param>
  1261. /// <param name="overrideState">The initial override state for the parameter.</param>
  1262. public Vector4Parameter(Vector4 value, bool overrideState = false)
  1263. : base(value, overrideState) { }
  1264. /// <summary>
  1265. /// Interpolates between two <c>Vector4</c> values.
  1266. /// </summary>
  1267. /// <param name="from">The start value.</param>
  1268. /// <param name="to">The end value.</param>
  1269. /// <param name="t">The interpolation factor in range [0,1].</param>
  1270. public override void Interp(Vector4 from, Vector4 to, float t)
  1271. {
  1272. m_Value.x = from.x + (to.x - from.x) * t;
  1273. m_Value.y = from.y + (to.y - from.y) * t;
  1274. m_Value.z = from.z + (to.z - from.z) * t;
  1275. m_Value.w = from.w + (to.w - from.w) * t;
  1276. }
  1277. }
  1278. /// <summary>
  1279. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Vector4</c> value.
  1280. /// </summary>
  1281. /// <seealso cref="Vector4Parameter"/>
  1282. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1283. public class NoInterpVector4Parameter : VolumeParameter<Vector4>
  1284. {
  1285. /// <summary>
  1286. /// Creates a new <seealso cref="Vector4Parameter"/> instance.
  1287. /// </summary>
  1288. /// <param name="value">The initial value to store in the parameter.</param>
  1289. /// <param name="overrideState">The initial override state for the parameter.</param>
  1290. public NoInterpVector4Parameter(Vector4 value, bool overrideState = false)
  1291. : base(value, overrideState) {}
  1292. }
  1293. /// <summary>
  1294. /// A <see cref="VolumeParameter"/> that holds a <c>Texture</c> value.
  1295. /// </summary>
  1296. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1297. public class TextureParameter : VolumeParameter<Texture>
  1298. {
  1299. /// <summary>
  1300. /// Creates a new <seealso cref="TextureParameter"/> instance.
  1301. /// </summary>
  1302. /// <param name="value">The initial value to store in the parameter.</param>
  1303. /// <param name="overrideState">The initial override state for the parameter.</param>
  1304. public TextureParameter(Texture value, bool overrideState = false)
  1305. : base(value, overrideState) {}
  1306. // TODO: Texture interpolation
  1307. }
  1308. /// <summary>
  1309. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Texture</c> value.
  1310. /// </summary>
  1311. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1312. public class NoInterpTextureParameter : VolumeParameter<Texture>
  1313. {
  1314. /// <summary>
  1315. /// Creates a new <seealso cref="NoInterpTextureParameter"/> instance.
  1316. /// </summary>
  1317. /// <param name="value">The initial value to store in the parameter.</param>
  1318. /// <param name="overrideState">The initial override state for the parameter.</param>
  1319. public NoInterpTextureParameter(Texture value, bool overrideState = false)
  1320. : base(value, overrideState) {}
  1321. }
  1322. /// <summary>
  1323. /// A <see cref="VolumeParameter"/> that holds a <c>RenderTexture</c> value.
  1324. /// </summary>
  1325. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1326. public class RenderTextureParameter : VolumeParameter<RenderTexture>
  1327. {
  1328. /// <summary>
  1329. /// Creates a new <seealso cref="RenderTextureParameter"/> instance.
  1330. /// </summary>
  1331. /// <param name="value">The initial value to store in the parameter.</param>
  1332. /// <param name="overrideState">The initial override state for the parameter.</param>
  1333. public RenderTextureParameter(RenderTexture value, bool overrideState = false)
  1334. : base(value, overrideState) {}
  1335. // TODO: RenderTexture interpolation
  1336. }
  1337. /// <summary>
  1338. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>RenderTexture</c> value.
  1339. /// </summary>
  1340. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1341. public class NoInterpRenderTextureParameter : VolumeParameter<RenderTexture>
  1342. {
  1343. /// <summary>
  1344. /// Creates a new <seealso cref="NoInterpRenderTextureParameter"/> instance.
  1345. /// </summary>
  1346. /// <param name="value">The initial value to store in the parameter.</param>
  1347. /// <param name="overrideState">The initial override state for the parameter.</param>
  1348. public NoInterpRenderTextureParameter(RenderTexture value, bool overrideState = false)
  1349. : base(value, overrideState) {}
  1350. }
  1351. /// <summary>
  1352. /// A <see cref="VolumeParameter"/> that holds a <c>Cubemap</c> value.
  1353. /// </summary>
  1354. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1355. public class CubemapParameter : VolumeParameter<Cubemap>
  1356. {
  1357. /// <summary>
  1358. /// Creates a new <seealso cref="CubemapParameter"/> instance.
  1359. /// </summary>
  1360. /// <param name="value">The initial value to store in the parameter.</param>
  1361. /// <param name="overrideState">The initial override state for the parameter.</param>
  1362. public CubemapParameter(Cubemap value, bool overrideState = false)
  1363. : base(value, overrideState) {}
  1364. // TODO: Cubemap interpolation
  1365. }
  1366. /// <summary>
  1367. /// A <see cref="VolumeParameter"/> that holds a non-interpolating <c>Cubemap</c> value.
  1368. /// </summary>
  1369. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1370. public class NoInterpCubemapParameter : VolumeParameter<Cubemap>
  1371. {
  1372. /// <summary>
  1373. /// Creates a new <seealso cref="NoInterpCubemapParameter"/> instance.
  1374. /// </summary>
  1375. /// <param name="value">The initial value to store in the parameter.</param>
  1376. /// <param name="overrideState">The initial override state for the parameter.</param>
  1377. public NoInterpCubemapParameter(Cubemap value, bool overrideState = false)
  1378. : base(value, overrideState) {}
  1379. }
  1380. /// <summary>
  1381. /// A <see cref="VolumeParameter"/> that holds a serializable class or struct.
  1382. /// </summary>
  1383. /// <typeparam name="T">The type of serializable object or struct to hold in this parameter.
  1384. /// </typeparam>
  1385. // TODO: ObjectParameter<T> doesn't seem to be working as expect, debug me
  1386. [Serializable, DebuggerDisplay(k_DebuggerDisplay)]
  1387. public class ObjectParameter<T> : VolumeParameter<T>
  1388. {
  1389. internal ReadOnlyCollection<VolumeParameter> parameters { get; private set; }
  1390. /// <summary>
  1391. /// The current override state for this parameter. Note that this is always forced enabled
  1392. /// on <see cref="ObjectParameter{T}"/>.
  1393. /// </summary>
  1394. public sealed override bool overrideState
  1395. {
  1396. get => true;
  1397. set => m_OverrideState = true;
  1398. }
  1399. /// <summary>
  1400. /// The value stored by this parameter.
  1401. /// </summary>
  1402. public sealed override T value
  1403. {
  1404. get => m_Value;
  1405. set
  1406. {
  1407. m_Value = value;
  1408. if (m_Value == null)
  1409. {
  1410. parameters = null;
  1411. return;
  1412. }
  1413. // Automatically grab all fields of type VolumeParameter contained in this instance
  1414. parameters = m_Value.GetType()
  1415. .GetFields(BindingFlags.Public | BindingFlags.Instance)
  1416. .Where(t => t.FieldType.IsSubclassOf(typeof(VolumeParameter)))
  1417. .OrderBy(t => t.MetadataToken) // Guaranteed order
  1418. .Select(t => (VolumeParameter)t.GetValue(m_Value))
  1419. .ToList()
  1420. .AsReadOnly();
  1421. }
  1422. }
  1423. /// <summary>
  1424. /// Creates a new <seealso cref="ObjectParameter{T}"/> instance.
  1425. /// </summary>
  1426. /// <param name="value">The initial value to store in the parameter.</param>
  1427. public ObjectParameter(T value)
  1428. {
  1429. m_OverrideState = true;
  1430. this.value = value;
  1431. }
  1432. internal override void Interp(VolumeParameter from, VolumeParameter to, float t)
  1433. {
  1434. if (m_Value == null)
  1435. return;
  1436. var paramOrigin = parameters;
  1437. var paramFrom = ((ObjectParameter<T>)from).parameters;
  1438. var paramTo = ((ObjectParameter<T>)to).parameters;
  1439. for (int i = 0; i < paramFrom.Count; i++)
  1440. {
  1441. // Keep track of the override state for debugging purpose
  1442. paramOrigin[i].overrideState = paramTo[i].overrideState;
  1443. if (paramTo[i].overrideState)
  1444. paramOrigin[i].Interp(paramFrom[i], paramTo[i], t);
  1445. }
  1446. }
  1447. }
  1448. /// <summary>
  1449. /// A <see cref="VolumeParameter"/> that holds an <c>AnimationCurve</c> value.
  1450. /// </summary>
  1451. [Serializable]
  1452. public class AnimationCurveParameter : VolumeParameter<AnimationCurve>
  1453. {
  1454. /// <summary>
  1455. /// Creates a new <seealso cref="AnimationCurveParameter"/> instance.
  1456. /// </summary>
  1457. /// <param name="value">The initial value to be stored in the parameter</param>
  1458. /// <param name="overrideState">The initial override state for the parameter</param>
  1459. public AnimationCurveParameter(AnimationCurve value, bool overrideState = false)
  1460. : base(value, overrideState) {}
  1461. // TODO: Curve interpolation
  1462. }
  1463. }