PropertySheetFactory.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Collections.Generic;
  3. namespace UnityEngine.Rendering.PostProcessing
  4. {
  5. /// <summary>
  6. /// A <see cref="PropertySheet"/> factory for easy creation and destruction of <see cref="Material"/>
  7. /// and <see cref="MaterialPropertyBlock"/>.
  8. /// </summary>
  9. /// <seealso cref="PropertySheet"/>
  10. public sealed class PropertySheetFactory
  11. {
  12. readonly Dictionary<Shader, PropertySheet> m_Sheets;
  13. /// <summary>
  14. /// Creates a new factory.
  15. /// </summary>
  16. public PropertySheetFactory()
  17. {
  18. m_Sheets = new Dictionary<Shader, PropertySheet>();
  19. }
  20. /// <summary>
  21. /// Gets a <see cref="PropertySheet"/> for a given shader identifier. Sheets are recycled
  22. /// so you can safely call this method on every frame.
  23. /// </summary>
  24. /// <param name="shaderName">The name of the shader to retrieve a sheet for</param>
  25. /// <returns>A sheet for the given shader</returns>
  26. /// <remarks>
  27. /// This method will not work when loading post-processing from an asset bundle. For this
  28. /// reason it is recommended to use <see cref="Get(Shader)"/> instead.
  29. /// </remarks>
  30. /// <exception cref="ArgumentException">Thrown if the shader is invalid</exception>
  31. [Obsolete("Use PropertySheet.Get(Shader) with a direct reference to the Shader instead.")]
  32. public PropertySheet Get(string shaderName)
  33. {
  34. var shader = Shader.Find(shaderName);
  35. if (shader == null)
  36. throw new ArgumentException(string.Format("Invalid shader ({0})", shaderName));
  37. return Get(shader);
  38. }
  39. /// <summary>
  40. /// Gets a <see cref="PropertySheet"/> for a given shader instance. Sheets are recycled so
  41. /// you can safely call this method on every frame.
  42. /// </summary>
  43. /// <param name="shader">A shader instance to retrieve a sheet for</param>
  44. /// <returns>A sheet for the given shader</returns>
  45. /// <exception cref="ArgumentException">Thrown if the shader is invalid</exception>
  46. public PropertySheet Get(Shader shader)
  47. {
  48. PropertySheet sheet;
  49. if (shader == null)
  50. throw new ArgumentException(string.Format("Invalid shader ({0})", shader));
  51. if (m_Sheets.TryGetValue(shader, out sheet))
  52. return sheet;
  53. var shaderName = shader.name;
  54. var material = new Material(shader)
  55. {
  56. name = string.Format("PostProcess - {0}", shaderName.Substring(shaderName.LastIndexOf('/') + 1)),
  57. hideFlags = HideFlags.DontSave
  58. };
  59. sheet = new PropertySheet(material);
  60. m_Sheets.Add(shader, sheet);
  61. return sheet;
  62. }
  63. /// <summary>
  64. /// Releases all resources used by this factory.
  65. /// </summary>
  66. /// <remarks>
  67. /// You don't need to call this method when using the builtin factory from
  68. /// <see cref="PostProcessRenderContext"/>.
  69. /// </remarks>
  70. public void Release()
  71. {
  72. foreach (var sheet in m_Sheets.Values)
  73. sheet.Release();
  74. m_Sheets.Clear();
  75. }
  76. }
  77. }