8 using UnityEngine.Rendering;
17 public float rx, ry, rz;
19 public float near, far;
20 public float sceneResolutionScale;
21 public float frameSkip;
22 public float nearOffset, farOffset;
23 public float hmdOffset;
24 public float r, g, b, a;
25 public bool disableStandardAssets;
29 public string configPath;
31 public void ReadConfig()
36 var readCamMatrix =
false;
39 var lines = System.IO.File.ReadAllLines(configPath);
40 foreach (var line
in lines)
42 var split = line.Split(
'=');
43 if (split.Length == 2)
48 var values = split[1].Split(
',');
49 if (values.Length == 12)
51 mCam.m0 = float.Parse(values[0]);
52 mCam.m1 = float.Parse(values[1]);
53 mCam.m2 = float.Parse(values[2]);
54 mCam.m3 = float.Parse(values[3]);
55 mCam.m4 = float.Parse(values[4]);
56 mCam.m5 = float.Parse(values[5]);
57 mCam.m6 = float.Parse(values[6]);
58 mCam.m7 = float.Parse(values[7]);
59 mCam.m8 = float.Parse(values[8]);
60 mCam.m9 = float.Parse(values[9]);
61 mCam.m10 = float.Parse(values[10]);
62 mCam.m11 = float.Parse(values[11]);
67 else if (key ==
"disableStandardAssets")
69 var field = c.GetType().GetField(key);
71 field.SetValue(c, bool.Parse(split[1]));
75 var field = c.GetType().GetField(key);
77 field.SetValue(c, float.Parse(split[1]));
91 var angles = t.rot.eulerAngles;
105 var fi =
new System.IO.FileInfo(configPath);
106 watcher =
new System.IO.FileSystemWatcher(fi.DirectoryName, fi.Name);
107 watcher.NotifyFilter = System.IO.NotifyFilters.LastWrite;
108 watcher.Changed +=
new System.IO.FileSystemEventHandler(OnChanged);
109 watcher.EnableRaisingEvents =
true;
113 void OnChanged(
object source, System.IO.FileSystemEventArgs e)
118 System.IO.FileSystemWatcher watcher;
125 Material clipMaterial;
129 if (target == vrcam.head)
134 var root = transform.parent;
135 var origin = vrcam.head.parent;
136 root.parent = origin;
137 root.localPosition = Vector3.zero;
138 root.localRotation = Quaternion.identity;
139 root.localScale = Vector3.one;
142 vrcam.enabled =
false;
143 var go = Instantiate(vrcam.gameObject);
144 vrcam.enabled =
true;
150 cam = go.GetComponent<Camera>();
151 cam.stereoTargetEye = StereoTargetEyeMask.None;
152 cam.fieldOfView = config.fov;
153 cam.useOcclusionCulling =
false;
156 colorMat =
new Material(Shader.Find(
"Custom/SteamVR_ColorOut"));
157 alphaMat =
new Material(Shader.Find(
"Custom/SteamVR_AlphaOut"));
158 clipMaterial =
new Material(Shader.Find(
"Custom/SteamVR_ClearAll"));
160 var offset = go.transform;
161 offset.parent = transform;
162 offset.localPosition =
new Vector3(config.x, config.y, config.z);
163 offset.localRotation = Quaternion.Euler(config.rx, config.ry, config.rz);
164 offset.localScale = Vector3.one;
167 while (offset.childCount > 0)
168 DestroyImmediate(offset.GetChild(0).gameObject);
171 clipQuad = GameObject.CreatePrimitive(PrimitiveType.Quad);
172 clipQuad.name =
"ClipQuad";
173 DestroyImmediate(clipQuad.GetComponent<MeshCollider>());
175 var clipRenderer = clipQuad.GetComponent<MeshRenderer>();
176 clipRenderer.material = clipMaterial;
177 clipRenderer.shadowCastingMode = ShadowCastingMode.Off;
178 clipRenderer.receiveShadows =
false;
179 clipRenderer.lightProbeUsage = LightProbeUsage.Off;
180 clipRenderer.reflectionProbeUsage = ReflectionProbeUsage.Off;
182 var clipTransform = clipQuad.transform;
183 clipTransform.parent = offset;
184 clipTransform.localScale =
new Vector3(1000.0f, 1000.0f, 1.0f);
185 clipTransform.localRotation = Quaternion.identity;
187 clipQuad.SetActive(
false);
190 public float GetTargetDistance()
193 return config.near + 0.01f;
195 var offset = cam.transform;
196 var forward =
new Vector3(offset.forward.x, 0.0f, offset.forward.z).normalized;
197 var targetPos = target.position +
new Vector3(target.forward.x, 0.0f, target.forward.z).normalized * config.hmdOffset;
199 var distance = -(
new Plane(forward, targetPos)).GetDistanceToPoint(offset.position);
200 return Mathf.Clamp(distance, config.near + 0.01f, config.far - 0.01f);
203 Material colorMat, alphaMat;
205 public void RenderNear()
207 var w = Screen.width / 2;
208 var h = Screen.height / 2;
210 if (cam.targetTexture == null || cam.targetTexture.width != w || cam.targetTexture.height != h)
212 var tex =
new RenderTexture(w, h, 24, RenderTextureFormat.ARGB32);
213 tex.antiAliasing = QualitySettings.antiAliasing == 0 ? 1 : QualitySettings.antiAliasing;
214 cam.targetTexture = tex;
217 cam.nearClipPlane = config.near;
218 cam.farClipPlane = config.far;
220 var clearFlags = cam.clearFlags;
221 var backgroundColor = cam.backgroundColor;
223 cam.clearFlags = CameraClearFlags.Color;
224 cam.backgroundColor = Color.clear;
226 clipMaterial.color =
new Color(config.r, config.g, config.b, config.a);
228 float dist = Mathf.Clamp(GetTargetDistance() + config.nearOffset, config.near, config.far);
229 var clipParent = clipQuad.transform.parent;
230 clipQuad.transform.position = clipParent.position + clipParent.forward * dist;
232 MonoBehaviour[] behaviours = null;
233 bool[] wasEnabled = null;
234 if (config.disableStandardAssets)
236 behaviours = cam.gameObject.GetComponents<MonoBehaviour>();
237 wasEnabled =
new bool[behaviours.Length];
238 for (
int i = 0; i < behaviours.Length; i++)
240 var behaviour = behaviours[i];
241 if (behaviour.enabled && behaviour.GetType().ToString().StartsWith(
"UnityStandardAssets."))
243 behaviour.enabled =
false;
244 wasEnabled[i] =
true;
249 clipQuad.SetActive(
true);
253 Graphics.DrawTexture(
new Rect(0, 0, w, h), cam.targetTexture, colorMat);
256 var pp = cam.gameObject.GetComponent(
"PostProcessingBehaviour") as MonoBehaviour;
257 if ((pp != null) && pp.enabled)
264 Graphics.DrawTexture(
new Rect(w, 0, w, h), cam.targetTexture, alphaMat);
267 clipQuad.SetActive(
false);
269 if (behaviours != null)
271 for (
int i = 0; i < behaviours.Length; i++)
275 behaviours[i].enabled =
true;
280 cam.clearFlags = clearFlags;
281 cam.backgroundColor = backgroundColor;
284 public void RenderFar()
286 cam.nearClipPlane = config.near;
287 cam.farClipPlane = config.far;
290 var w = Screen.width / 2;
291 var h = Screen.height / 2;
292 Graphics.DrawTexture(
new Rect(0, h, w, h), cam.targetTexture, colorMat);
302 float sceneResolutionScale;
307 cameras = FindObjectsOfType<Camera>() as Camera[];
310 var numCameras = cameras.Length;
311 cameraRects =
new Rect[numCameras];
312 for (
int i = 0; i < numCameras; i++)
314 var cam = cameras[i];
315 cameraRects[i] = cam.rect;
320 if (cam.targetTexture != null)
326 cam.rect =
new Rect(0.5f, 0.0f, 0.5f, 0.5f);
330 if (config.sceneResolutionScale > 0.0f)
332 sceneResolutionScale = SteamVR_Camera.sceneResolutionScale;
333 SteamVR_Camera.sceneResolutionScale = config.sceneResolutionScale;
342 var numCameras = cameras.Length;
343 for (
int i = 0; i < numCameras; i++)
345 var cam = cameras[i];
347 cam.rect = cameraRects[i];
353 if (config.sceneResolutionScale > 0.0f)
355 SteamVR_Camera.sceneResolutionScale = sceneResolutionScale;