154 lines
3.1 KiB
C#
154 lines
3.1 KiB
C#
using System;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
|
|
namespace LIV.SDK.Unity
|
|
{
|
|
public static class Calibration
|
|
{
|
|
private const string ConfigFileName = "externalcamera.cfg";
|
|
|
|
public static float X;
|
|
|
|
public static float Y;
|
|
|
|
public static float Z;
|
|
|
|
public static float Yaw;
|
|
|
|
public static float Pitch;
|
|
|
|
public static float Roll;
|
|
|
|
public static float FieldOfVision;
|
|
|
|
public static float NearClip;
|
|
|
|
public static float FarClip;
|
|
|
|
public static float HMDOffset;
|
|
|
|
public static float NearOffset;
|
|
|
|
private static readonly FileSystemWatcher ConfigWatcher;
|
|
|
|
public static Vector3 PositionOffset
|
|
{
|
|
get
|
|
{
|
|
return new Vector3(X, Y, Z);
|
|
}
|
|
}
|
|
|
|
public static Quaternion RotationOffset
|
|
{
|
|
get
|
|
{
|
|
return Quaternion.Euler(Pitch, Yaw, Roll);
|
|
}
|
|
}
|
|
|
|
public static event System.EventHandler Changed;
|
|
|
|
static Calibration()
|
|
{
|
|
try
|
|
{
|
|
FileInfo fileInfo = new FileInfo("externalcamera.cfg");
|
|
ConfigWatcher = new FileSystemWatcher(fileInfo.DirectoryName ?? string.Empty, fileInfo.Name)
|
|
{
|
|
NotifyFilter = NotifyFilters.LastWrite
|
|
};
|
|
ConfigWatcher.Changed += delegate
|
|
{
|
|
Read();
|
|
};
|
|
ConfigWatcher.EnableRaisingEvents = true;
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
Read();
|
|
}
|
|
|
|
private static void Reset()
|
|
{
|
|
X = (Y = (Z = 0f));
|
|
Pitch = (Yaw = (Roll = 0f));
|
|
FieldOfVision = 60f;
|
|
NearClip = 0.01f;
|
|
FarClip = 1000f;
|
|
HMDOffset = 0f;
|
|
NearOffset = 0f;
|
|
}
|
|
|
|
public static void Read()
|
|
{
|
|
Reset();
|
|
string[] array = new string[0];
|
|
try
|
|
{
|
|
array = File.ReadAllLines("externalcamera.cfg");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Debug.LogWarningFormat("LIV: Failed to read camera calibration from disk. Error: {0}", ex);
|
|
}
|
|
string[] array2 = array;
|
|
foreach (string text in array2)
|
|
{
|
|
string[] array3 = text.Split(new char[1] { '=' }, StringSplitOptions.RemoveEmptyEntries);
|
|
if (array3.Length == 2)
|
|
{
|
|
switch (array3[0].ToLowerInvariant())
|
|
{
|
|
case "x":
|
|
TryParseInvariantFloat(array3[1], out X);
|
|
break;
|
|
case "y":
|
|
TryParseInvariantFloat(array3[1], out Y);
|
|
break;
|
|
case "z":
|
|
TryParseInvariantFloat(array3[1], out Z);
|
|
break;
|
|
case "rx":
|
|
TryParseInvariantFloat(array3[1], out Pitch);
|
|
break;
|
|
case "ry":
|
|
TryParseInvariantFloat(array3[1], out Yaw);
|
|
break;
|
|
case "rz":
|
|
TryParseInvariantFloat(array3[1], out Roll);
|
|
break;
|
|
case "fov":
|
|
TryParseInvariantFloat(array3[1], out FieldOfVision);
|
|
break;
|
|
case "near":
|
|
TryParseInvariantFloat(array3[1], out NearClip);
|
|
break;
|
|
case "far":
|
|
TryParseInvariantFloat(array3[1], out FarClip);
|
|
break;
|
|
case "hmdoffset":
|
|
TryParseInvariantFloat(array3[1], out HMDOffset);
|
|
break;
|
|
case "nearoffset":
|
|
TryParseInvariantFloat(array3[1], out NearOffset);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (Calibration.Changed != null)
|
|
{
|
|
Calibration.Changed(null, EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
private static bool TryParseInvariantFloat(string number, out float result)
|
|
{
|
|
return float.TryParse(number, NumberStyles.Float, CultureInfo.InvariantCulture, out result);
|
|
}
|
|
}
|
|
}
|