Files
2026-02-21 16:45:37 +08:00

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);
}
}
}