| using System; | 
| using System.Collections.Generic; | 
|   | 
| namespace UnityEngine.PostProcessing | 
| { | 
|     using UnityObject = Object; | 
|   | 
|     public sealed class MaterialFactory : IDisposable | 
|     { | 
|         Dictionary<string, Material> m_Materials; | 
|   | 
|         public MaterialFactory() | 
|         { | 
|             m_Materials = new Dictionary<string, Material>(); | 
|         } | 
|   | 
|         public Material Get(string shaderName) | 
|         { | 
|             Material material; | 
|   | 
|             if (!m_Materials.TryGetValue(shaderName, out material)) | 
|             { | 
|                 var shader = Shader.Find(shaderName); | 
|   | 
|                 if (shader == null) | 
|                     throw new ArgumentException(string.Format("Shader not found ({0})", shaderName)); | 
|   | 
|                 material = new Material(shader) | 
|                 { | 
|                     name = string.Format("PostFX - {0}", shaderName.Substring(shaderName.LastIndexOf("/") + 1)), | 
|                     hideFlags = HideFlags.DontSave | 
|                 }; | 
|   | 
|                 m_Materials.Add(shaderName, material); | 
|             } | 
|   | 
|             return material; | 
|         } | 
|   | 
|         public void Dispose() | 
|         { | 
|             var enumerator = m_Materials.GetEnumerator(); | 
|             while (enumerator.MoveNext()) | 
|             { | 
|                 var material = enumerator.Current.Value; | 
|                 GraphicsUtils.Destroy(material); | 
|             } | 
|   | 
|             m_Materials.Clear(); | 
|         } | 
|     } | 
| } |