| using System; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
| namespace UnityStandardAssets.ImageEffects | 
| { | 
|     [ExecuteAlways] | 
|     [RequireComponent (typeof(Camera))] | 
|     public class PostEffectsBase : MonoBehaviour | 
|     { | 
|         protected bool  supportHDRTextures = true; | 
|         protected bool  supportDX11 = false; | 
|         protected bool  isSupported = true; | 
|   | 
|         private List<Material> createdMaterials = new List<Material> (); | 
|   | 
|         protected Material CheckShaderAndCreateMaterial ( Shader s, Material m2Create) | 
|         { | 
|             if (!s) | 
|             { | 
|                 Debug.Log("Missing shader in " + ToString ()); | 
|                 enabled = false; | 
|                 return null; | 
|             } | 
|   | 
|             if (s.isSupported && m2Create && m2Create.shader == s) | 
|                 return m2Create; | 
|   | 
|             if (!s.isSupported) | 
|             { | 
|                 NotSupported (); | 
|                 Debug.Log("The shader " + s.ToString() + " on effect "+ToString()+" is not supported on this platform!"); | 
|                 return null; | 
|             } | 
|   | 
|             m2Create = new Material (s); | 
|             createdMaterials.Add (m2Create); | 
|             m2Create.hideFlags = HideFlags.DontSave; | 
|   | 
|             return m2Create; | 
|         } | 
|   | 
|   | 
|         protected Material CreateMaterial (Shader s, Material m2Create) | 
|         { | 
|             if (!s) | 
|             { | 
|                 Debug.Log ("Missing shader in " + ToString ()); | 
|                 return null; | 
|             } | 
|   | 
|             if (m2Create && (m2Create.shader == s) && (s.isSupported)) | 
|                 return m2Create; | 
|   | 
|             if (!s.isSupported) | 
|             { | 
|                 return null; | 
|             } | 
|   | 
|             m2Create = new Material (s); | 
|             createdMaterials.Add (m2Create); | 
|             m2Create.hideFlags = HideFlags.DontSave; | 
|                  | 
|             return m2Create; | 
|         } | 
|   | 
|         void OnEnable () | 
|         { | 
|             isSupported = true; | 
|         } | 
|   | 
|         void OnDestroy () | 
|         { | 
|             RemoveCreatedMaterials ();     | 
|         } | 
|   | 
|         private void RemoveCreatedMaterials () | 
|         { | 
|             while (createdMaterials.Count > 0) | 
|             { | 
|                 Material mat = createdMaterials[0]; | 
|                 createdMaterials.RemoveAt (0); | 
| #if UNITY_EDITOR | 
|                 DestroyImmediate (mat); | 
| #else | 
|                 Destroy(mat); | 
| #endif | 
|             } | 
|         } | 
|   | 
|         protected bool CheckSupport () | 
|         { | 
|             return CheckSupport (false); | 
|         } | 
|   | 
|   | 
|         public virtual bool CheckResources () | 
|         { | 
|             Debug.LogWarning ("CheckResources () for " + ToString() + " should be overwritten."); | 
|             return isSupported; | 
|         } | 
|   | 
|   | 
|         protected void Start () | 
|         { | 
|             CheckResources (); | 
|         } | 
|   | 
|         protected bool CheckSupport (bool needDepth) | 
|         { | 
|             isSupported = true; | 
|             supportHDRTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf); | 
|             supportDX11 = SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders; | 
|   | 
|    //         if (!SystemInfo.supportsImageEffects) | 
|             //{ | 
|    //             NotSupported (); | 
|    //             return false; | 
|    //         } | 
|   | 
|             if (needDepth && !SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth)) | 
|             { | 
|                 NotSupported (); | 
|                 return false; | 
|             } | 
|   | 
|             if (needDepth) | 
|                 GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth; | 
|   | 
|             return true; | 
|         } | 
|   | 
|         protected bool CheckSupport (bool needDepth,  bool needHdr) | 
|         { | 
|             if (!CheckSupport(needDepth)) | 
|                 return false; | 
|   | 
|             if (needHdr && !supportHDRTextures) | 
|             { | 
|                 NotSupported (); | 
|                 return false; | 
|             } | 
|   | 
|             return true; | 
|         } | 
|   | 
|   | 
|         public bool Dx11Support () | 
|         { | 
|             return supportDX11; | 
|         } | 
|   | 
|   | 
|         protected void ReportAutoDisable () | 
|         { | 
|             Debug.LogWarning ("The image effect " + ToString() + " has been disabled as it's not supported on the current platform."); | 
|         } | 
|   | 
|         // deprecated but needed for old effects to survive upgrading | 
|         bool CheckShader (Shader s) | 
|         { | 
|             Debug.Log("The shader " + s.ToString () + " on effect "+ ToString () + " is not part of the Unity 3.2+ effects suite anymore. For best performance and quality, please ensure you are using the latest Standard Assets Image Effects (Pro only) package."); | 
|             if (!s.isSupported) | 
|             { | 
|                 NotSupported (); | 
|                 return false; | 
|             } | 
|             else | 
|             { | 
|                 return false; | 
|             } | 
|         } | 
|   | 
|   | 
|         protected void NotSupported () | 
|         { | 
|             enabled = false; | 
|             isSupported = false; | 
|             return; | 
|         } | 
|   | 
|   | 
|         protected void DrawBorder (RenderTexture dest, Material material) | 
|         { | 
|             float x1; | 
|             float x2; | 
|             float y1; | 
|             float y2; | 
|   | 
|             RenderTexture.active = dest; | 
|             bool  invertY = true; // source.texelSize.y < 0.0ff; | 
|             // Set up the simple Matrix | 
|             GL.PushMatrix(); | 
|             GL.LoadOrtho(); | 
|   | 
|             for (int i = 0; i < material.passCount; i++) | 
|             { | 
|                 material.SetPass(i); | 
|   | 
|                 float y1_; float y2_; | 
|                 if (invertY) | 
|                 { | 
|                     y1_ = 1.0f; y2_ = 0.0f; | 
|                 } | 
|                 else | 
|                 { | 
|                     y1_ = 0.0f; y2_ = 1.0f; | 
|                 } | 
|   | 
|                 // left | 
|                 x1 = 0.0f; | 
|                 x2 = 0.0f + 1.0f/(dest.width*1.0f); | 
|                 y1 = 0.0f; | 
|                 y2 = 1.0f; | 
|                 GL.Begin(GL.QUADS); | 
|   | 
|                 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); | 
|                 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); | 
|   | 
|                 // right | 
|                 x1 = 1.0f - 1.0f/(dest.width*1.0f); | 
|                 x2 = 1.0f; | 
|                 y1 = 0.0f; | 
|                 y2 = 1.0f; | 
|   | 
|                 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); | 
|                 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); | 
|   | 
|                 // top | 
|                 x1 = 0.0f; | 
|                 x2 = 1.0f; | 
|                 y1 = 0.0f; | 
|                 y2 = 0.0f + 1.0f/(dest.height*1.0f); | 
|   | 
|                 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); | 
|                 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); | 
|   | 
|                 // bottom | 
|                 x1 = 0.0f; | 
|                 x2 = 1.0f; | 
|                 y1 = 1.0f - 1.0f/(dest.height*1.0f); | 
|                 y2 = 1.0f; | 
|   | 
|                 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f); | 
|                 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f); | 
|                 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f); | 
|   | 
|                 GL.End(); | 
|             } | 
|   | 
|             GL.PopMatrix(); | 
|         } | 
|     } | 
| } |