1 using System;
2 using UnityEngine;
3
4 namespace UnityStandardAssets.ImageEffects
5 {
6 [ExecuteInEditMode]
7 [RequireComponent (typeof(Camera))]
8 class PostEffectsHelper : MonoBehaviour
9 {
10 void OnRenderImage (RenderTexture source, RenderTexture destination)
11 {
12 Debug.Log("OnRenderImage in Helper called ...");
13 }
14
15 static void DrawLowLevelPlaneAlignedWithCamera (
16 float dist ,
17 RenderTexture source, RenderTexture dest ,
18 Material material ,
19 Camera cameraForProjectionMatrix )
20 {
21 // Make the destination texture the target for all rendering
22 RenderTexture.active = dest;
23 // Assign the source texture to a property from a shader
24 material.SetTexture("_MainTex", source);
25 bool invertY = true; // source.texelSize.y < 0.0f;
26 // Set up the simple Matrix
27 GL.PushMatrix();
28 GL.LoadIdentity();
29 GL.LoadProjectionMatrix(cameraForProjectionMatrix.projectionMatrix);
30
31 float fovYHalfRad = cameraForProjectionMatrix.fieldOfView * 0.5f * Mathf.Deg2Rad;
32 float cotangent = Mathf.Cos(fovYHalfRad) / Mathf.Sin(fovYHalfRad);
33 float asp = cameraForProjectionMatrix.aspect;
34
35 float x1 = asp/-cotangent;
36 float x2 = asp/cotangent;
37 float y1 = 1.0f/-cotangent;
38 float y2 = 1.0f/cotangent;
39
40 float sc = 1.0f; // magic constant (for now)
41
42 x1 *= dist * sc;
43 x2 *= dist * sc;
44 y1 *= dist * sc;
45 y2 *= dist * sc;
46
47 float z1 = -dist;
48
49 for (int i = 0; i < material.passCount; i++)
50 {
51 material.SetPass(i);
52
53 GL.Begin(GL.QUADS);
54 float y1_; float y2_;
55 if (invertY)
56 {
57 y1_ = 1.0f; y2_ = 0.0f;
58 }
59 else
60 {
61 y1_ = 0.0f; y2_ = 1.0f;
62 }
63 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, z1);
64 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, z1);
65 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, z1);
66 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, z1);
67 GL.End();
68 }
69
70 GL.PopMatrix();
71 }
72
73 static void DrawBorder (
74 RenderTexture dest ,
75 Material material )
76 {
77 float x1;
78 float x2;
79 float y1;
80 float y2;
81
82 RenderTexture.active = dest;
83 bool invertY = true; // source.texelSize.y < 0.0ff;
84 // Set up the simple Matrix
85 GL.PushMatrix();
86 GL.LoadOrtho();
87
88 for (int i = 0; i < material.passCount; i++)
89 {
90 material.SetPass(i);
91
92 float y1_; float y2_;
93 if (invertY)
94 {
95 y1_ = 1.0f; y2_ = 0.0f;
96 }
97 else
98 {
99 y1_ = 0.0f; y2_ = 1.0f;
100 }
101
102 // left
103 x1 = 0.0f;
104 x2 = 0.0f + 1.0f/(dest.width*1.0f);
105 y1 = 0.0f;
106 y2 = 1.0f;
107 GL.Begin(GL.QUADS);
108
109 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
110 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
111 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
112 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
113
114 // right
115 x1 = 1.0f - 1.0f/(dest.width*1.0f);
116 x2 = 1.0f;
117 y1 = 0.0f;
118 y2 = 1.0f;
119
120 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
121 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
122 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
123 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
124
125 // top
126 x1 = 0.0f;
127 x2 = 1.0f;
128 y1 = 0.0f;
129 y2 = 0.0f + 1.0f/(dest.height*1.0f);
130
131 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
132 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
133 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
134 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
135
136 // bottom
137 x1 = 0.0f;
138 x2 = 1.0f;
139 y1 = 1.0f - 1.0f/(dest.height*1.0f);
140 y2 = 1.0f;
141
142 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
143 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
144 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
145 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
146
147 GL.End();
148 }
149
150 GL.PopMatrix();
151 }
152
153 static void DrawLowLevelQuad ( float x1, float x2, float y1, float y2, RenderTexture source, RenderTexture dest, Material material )
154 {
155 // Make the destination texture the target for all rendering
156 RenderTexture.active = dest;
157 // Assign the source texture to a property from a shader
158 material.SetTexture("_MainTex", source);
159 bool invertY = true; // source.texelSize.y < 0.0f;
160 // Set up the simple Matrix
161 GL.PushMatrix();
162 GL.LoadOrtho();
163
164 for (int i = 0; i < material.passCount; i++)
165 {
166 material.SetPass(i);
167
168 GL.Begin(GL.QUADS);
169 float y1_; float y2_;
170 if (invertY)
171 {
172 y1_ = 1.0f; y2_ = 0.0f;
173 }
174 else
175 {
176 y1_ = 0.0f; y2_ = 1.0f;
177 }
178 GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
179 GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
180 GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
181 GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
182 GL.End();
183 }
184
185 GL.PopMatrix();
186 }
187 }
188 }