using UnityEngine;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
//-----------------------------------------------------------------------------
// Copyright 2012-2017 RenderHeads Ltd. All rights reserved.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProMovieCapture
{
public class Utils
{
///
/// The "main" camera isn't necessarily the one the gets rendered last to screen,
/// so we sort all cameras by depth and find the one with no render target
///
public static Camera GetUltimateRenderCamera()
{
Camera result = Camera.main;
{
// Iterate all enabled cameras
float highestDepth = float.MinValue;
Camera[] enabledCameras = Camera.allCameras;
for (int cameraIndex = 0; cameraIndex < enabledCameras.Length; cameraIndex++)
{
Camera camera = enabledCameras[cameraIndex];
// Ignore null cameras
if (camera != null)
{
// Ignore cameras that are hidden or have a targetTexture
bool isHidden = (camera.hideFlags & HideFlags.HideInHierarchy) == HideFlags.HideInHierarchy;
if (!isHidden && camera.targetTexture == null)
{
// Ignore cameras that render nothing
if (camera.pixelRect.width > 0f && camera.pixelHeight > 0f)
{
// Keep the one with highest depth
// TODO: handle the case where camera depths are equal - which one is first then?
if (camera.depth >= highestDepth)
{
highestDepth = camera.depth;
result = camera;
}
}
}
}
}
}
return result;
}
public static bool HasContributingCameras(Camera parentCamera)
{
bool result = true;
// If the camera doesn't clear the target completely then it may have other contributing cameras
if (parentCamera.rect == new Rect(0f, 0f, 1f, 1f))
{
if (parentCamera.clearFlags == CameraClearFlags.Skybox ||
parentCamera.clearFlags == CameraClearFlags.Color)
{
result = false;
}
}
return result;
}
///
/// Returns a list of cameras sorted in render order from first to last that contribute to the rendering to parentCamera
///
public static Camera[] FindContributingCameras(Camera parentCamera)
{
System.Collections.Generic.List validCameras = new System.Collections.Generic.List(8);
{
// Iterate all enabled cameras
Camera[] enabledCameras = Camera.allCameras;
for (int cameraIndex = 0; cameraIndex < enabledCameras.Length; cameraIndex++)
{
Camera camera = enabledCameras[cameraIndex];
// Ignore null cameras and camera that is the parent
if (camera != null && camera != parentCamera)
{
// Only allow cameras with depth less or equal to parent camera
// TODO: handle the case where camera depths are equal - which one is first then?
if (camera.depth <= parentCamera.depth)
{
// Ignore cameras that are hidden or have a targetTexture that doesn't match the parent
bool isHidden = (camera.hideFlags & HideFlags.HideInHierarchy) == HideFlags.HideInHierarchy;
if (!isHidden && camera.targetTexture == parentCamera.targetTexture)
{
// Ignore cameras that render nothing
if (camera.pixelRect.width > 0 && camera.pixelHeight > 0)
{
validCameras.Add(camera);
}
}
}
}
}
}
if (validCameras.Count > 1)
{
// Sort by depth (render order)
validCameras.Sort(delegate (Camera a, Camera b)
{
if (a.depth < b.depth)
{
return -1;
}
else if (a.depth > b.depth)
{
return 1;
}
return 0;
});
// Starting from the last camera to render, find the first one that clears the screen completely
for (int i = (validCameras.Count - 1); i >= 0; i--)
{
if (validCameras[i].rect == new Rect(0f, 0f, 1f, 1f))
{
if (validCameras[i].clearFlags == CameraClearFlags.Skybox ||
validCameras[i].clearFlags == CameraClearFlags.Color)
{
// Remove all cameras before this
validCameras.RemoveRange(0, i);
break;
}
}
}
}
return validCameras.ToArray();
}
public static bool ShowInExplorer(string itemPath)
{
bool result = false;
#if !UNITY_WEBPLAYER
itemPath = Path.GetFullPath(itemPath.Replace(@"/", @"\")); // explorer doesn't like front slashes
if (File.Exists(itemPath))
{
Process.Start("explorer.exe", "/select," + itemPath);
result = true;
}
#endif
return result;
}
public static bool OpenInDefaultApp(string itemPath)
{
bool result = false;
itemPath = Path.GetFullPath(itemPath.Replace(@"/", @"\"));
if (File.Exists(itemPath))
{
UnityEngine.Application.OpenURL(itemPath);
result = true;
}
return result;
}
public static long GetFileSize(string filename)
{
#if UNITY_WEBPLAYER
return 0;
#else
System.IO.FileInfo fi = new System.IO.FileInfo(filename);
return fi.Length;
#endif
}
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);
public static bool DriveFreeBytes(string folderName, out ulong freespace)
{
freespace = 0;
if (string.IsNullOrEmpty(folderName))
{
throw new System.ArgumentNullException("folderName");
}
if (!folderName.EndsWith("\\"))
{
folderName += '\\';
}
ulong free = 0, dummy1 = 0, dummy2 = 0;
if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
{
freespace = free;
return true;
}
else
{
return false;
}
}
#endif
}
}