diff --git a/VRDash/Logger.cs b/VRDash/Logger.cs
index 4888d3d..9e7e38f 100644
--- a/VRDash/Logger.cs
+++ b/VRDash/Logger.cs
@@ -17,7 +17,7 @@ namespace VRDash
{
public static void Setup()
{
- var configLoc = ProfileManager.ConfigDirectory + @"\Logs\VRDash.log";
+ var configLoc = ProfileManager.ConfigDirectory + @"\Logs\VRDash_";
if (!Directory.Exists(Path.GetDirectoryName(configLoc)))
{
@@ -38,9 +38,10 @@ namespace VRDash
roller.File = configLoc;
roller.Layout = patternLayout;
roller.MaxSizeRollBackups = 10;
- roller.MaximumFileSize = "10MB";
- roller.RollingStyle = RollingFileAppender.RollingMode.Size;
- roller.StaticLogFileName = true;
+ roller.MaximumFileSize = "1MB";
+ roller.RollingStyle = RollingFileAppender.RollingMode.Date;
+ roller.DatePattern = @"yyyyMMdd.lo\g";
+ roller.StaticLogFileName = false;
roller.ActivateOptions();
hierarchy.Root.AddAppender(roller);
#endregion
diff --git a/VRDash/MainWindow.xaml.cs b/VRDash/MainWindow.xaml.cs
index c4de85c..d43e6cc 100644
--- a/VRDash/MainWindow.xaml.cs
+++ b/VRDash/MainWindow.xaml.cs
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
+using OpenTK;
using System;
using System.Collections.Generic;
using System.IO;
@@ -232,16 +233,63 @@ namespace VRDash
private void Window_KeyDown(object sender, KeyEventArgs e)
{
- //if(e.Key == Key.F1)
- //{
- // var conf = new MonitorOverlayConfig();
- // conf.Name = "Test Browser";
- // conf.Key = "asdfasdf";
- // conf.Location = new Overlay.Config.OverlayLocation.DashboardLocation();
- // var overlay = new Overlay.BrowserOverlay(conf);
- // overlay.Create();
- // overlay.Show();
- //}
+ if (e.Key == Key.F1)
+ {
+ //var quat = Quaternion.FromEulerAngles(MathHelper.DegreesToRadians(41), MathHelper.DegreesToRadians(44), MathHelper.DegreesToRadians(43));
+ //var matrix = Matrix3x4.Mult(Matrix3x4.CreateTranslation(11, 12, 13), Matrix3x4.Mult(Matrix3x4.CreateFromQuaternion(quat), Matrix3x4.CreateScale(4, 4, 4)));
+
+
+ //Vector3 transform = new Vector3(matrix.M14, matrix.M24, matrix.M34);
+
+ //Vector3 scaling = new Vector3((float)Math.Sqrt((matrix.M11 * matrix.M11) + (matrix.M12 * matrix.M12) + (matrix.M13 * matrix.M13)),
+ // (float)Math.Sqrt((matrix.M21 * matrix.M21) + (matrix.M22 * matrix.M22) + (matrix.M23 * matrix.M23)),
+ // (float)Math.Sqrt((matrix.M31 * matrix.M31) + (matrix.M32 * matrix.M32) + (matrix.M33 * matrix.M33)));
+
+ //Matrix3 rotation = new Matrix3()
+ //{
+ // M11 = matrix.M11 / scaling.X, M12 = matrix.M12 / scaling.X, M13 = matrix.M13 / scaling.X,
+ // M21 = matrix.M21 / scaling.Y, M22 = matrix.M22 / scaling.Y, M23 = matrix.M23 / scaling.Y,
+ // M31 = matrix.M31 / scaling.Z, M32 = matrix.M32 / scaling.Z, M33 = matrix.M33 / scaling.Z
+ //};
+
+ //Quaternion quatRes = Quaternion.FromMatrix(rotation);
+
+ //var q = quatRes;
+
+ //double pitch = 0;
+ //double yaw = 0;
+ //double roll = 0;
+
+ //double sinr_cosp = +2.0 * (q.W * q.X + q.Y * q.Z);
+ //double cosr_cosp = +1.0 - 2.0 * (q.X * q.X + q.Y * q.Y);
+ //roll = Math.Atan2(sinr_cosp, cosr_cosp);
+
+
+
+ //// pitch (y-axis rotation)
+ //double sinp = +2.0 * (q.W * q.Y - q.Z * q.X);
+ //if ( Math.Abs(sinp) >= 1)
+ // pitch = C.math.copysign(MathHelper.Pi / 2, sinp); // use 90 degrees if out of range
+ //else
+ // pitch = Math.Asin(sinp);
+
+ //// yaw (z-axis rotation)
+ //double siny_cosp = +2.0 * (q.W * q.Z + q.X * q.Y);
+ //double cosy_cosp = +1.0 - 2.0 * (q.Y * q.Y + q.Z * q.Z);
+ //yaw = Math.Atan2(siny_cosp, cosy_cosp);
+
+ //pitch = MathHelper.RadiansToDegrees(pitch);
+ //yaw = MathHelper.RadiansToDegrees(yaw);
+ //roll = MathHelper.RadiansToDegrees(roll);
+
+ //var conf = new MonitorOverlayConfig();
+ //conf.Name = "Test Browser";
+ //conf.Key = "asdfasdf";
+ //conf.Location = new Overlay.Config.OverlayLocation.DashboardLocation();
+ //var overlay = new Overlay.BrowserOverlay(conf);
+ //overlay.Create();
+ //overlay.Show();
+ }
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
diff --git a/VRDash/Overlay/Config/OverlayLocation/PlayspaceLocation.cs b/VRDash/Overlay/Config/OverlayLocation/PlayspaceLocation.cs
index 6412667..c983b43 100644
--- a/VRDash/Overlay/Config/OverlayLocation/PlayspaceLocation.cs
+++ b/VRDash/Overlay/Config/OverlayLocation/PlayspaceLocation.cs
@@ -1,124 +1,179 @@
-//using Newtonsoft.Json;
-//using OpenTK;
-//using System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Text;
-//using System.Threading.Tasks;
-//using Valve.VR;
-//using VRDash.UI.LocationEditors;
-//using VRDash.Utilities;
+using Newtonsoft.Json;
+using OpenTK;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Valve.VR;
+using VRDash.UI.LocationEditors;
+using VRDash.Utilities;
-//namespace VRDash.Overlay.Config.OverlayLocation
-//{
-// [OverlayLocationInfo("Playspace", typeof(ControllerLocationEditor))]
-// public class PlayspaceLocation : IOverlayLocation
-// {
-// public ControllerHand Controller { get; set; } = ControllerHand.Left;
+namespace VRDash.Overlay.Config.OverlayLocation
+{
+ [OverlayLocationInfo("Playspace", typeof(PlayspaceLocationEditor))]
+ public class PlayspaceLocation : IOverlayLocation
+ {
-// [JsonIgnore]
-// public Matrix3x4 Location { get; private set; } = new Matrix3x4(new Vector4(1, 0, 0, 0),
-// new Vector4(0, 1, 0, 0),
-// new Vector4(0, 0, 1, 0));
+ [JsonIgnore]
+ public Matrix3x4 Location { get; private set; } = new Matrix3x4(new Vector4(1, 0, 0, 0),
+ new Vector4(0, 1, 0, 0),
+ new Vector4(0, 0, 1, 0));
-// public float PosX { get; set; } = 0;
-// public float PosY { get; set; } = 0;
-// public float PosZ { get; set; } = 0;
+ public float PosX { get; set; } = 0;
+ public float PosY { get; set; } = 0;
+ public float PosZ { get; set; } = 0;
-// public float RotP { get; set; } = 0;
-// public float RotY { get; set; } = 0;
-// public float RotR { get; set; } = 0;
+ public float RotP { get; set; } = 0;
+ public float RotY { get; set; } = 0;
+ public float RotR { get; set; } = 0;
-// public float ScaleX { get; set; } = 1;
-// public float ScaleY { get; set; } = 1;
-// public float ScaleZ { get; set; } = 1;
-
-// DateTime m_LastCheck = DateTime.MinValue;
+ public float ScaleX { get; set; } = 1;
+ public float ScaleY { get; set; } = 1;
+ public float ScaleZ { get; set; } = 1;
-// IOverlay m_Overlay = null;
+ DateTime m_LastCheck = DateTime.MinValue;
-// public OverlayHandles CreateOverlay(string key, string name, IOverlay overlay)
-// {
-// ulong overlayHandle = 0;
-// EVROverlayError err = OpenVR.Overlay.CreateOverlay(key, name, ref overlayHandle);
+ [JsonIgnore]
+ public IOverlay Overlay { get; internal set; } = null;
-// if (err != EVROverlayError.None){
-// throw new Exception($"Error creating overlay: {err}");
-// }
+ public OverlayHandles CreateOverlay(string key, string name, IOverlay overlay)
+ {
+ ulong overlayHandle = 0;
+ EVROverlayError err = OpenVR.Overlay.CreateOverlay(key, name, ref overlayHandle);
-// ETrackedDeviceClass type = OpenVR.System.GetTrackedDeviceClass(0);
+ if (err != EVROverlayError.None)
+ {
+ throw new Exception($"Error creating overlay: {err}");
+ }
-// overlay.Update += Overlay_Update;
+ ETrackedDeviceClass type = OpenVR.System.GetTrackedDeviceClass(0);
-// m_Overlay = overlay;
+ overlay.Update += Overlay_Update;
+
+ Overlay = overlay;
+
+
+ return new OverlayHandles(overlayHandle, 0);
+ }
+
+ public void SetLocationBasedOnController()
+ {
+ uint controllerIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
+
+ TrackedDevicePose_t pose = new TrackedDevicePose_t();
+ TrackedDevicePose_t gamePose = new TrackedDevicePose_t();
+ var err = OpenVR.Compositor.GetLastPoseForTrackedDeviceIndex(controllerIndex, ref pose, ref gamePose);
+ if (err != EVRCompositorError.None)
+ {
+ this.GetLogger(Overlay).Warn($"Unable to set location based on controller: {err}");
+ return;
+ }
+
+ if (pose.eTrackingResult != ETrackingResult.Running_OK)
+ {
+ this.GetLogger(Overlay).Warn($"Unable to get reliable tracking: {pose.eTrackingResult}");
+ }
+
+ var matrix = gamePose.mDeviceToAbsoluteTracking.ToOpenTKMatrix();
+
+ DecomposeMatrix(matrix);
+ }
+
+ private void DecomposeMatrix(Matrix3x4 matrix)
+ {
+ Vector3 transform = new Vector3(matrix.M14, matrix.M24, matrix.M34);
+
+ PosX = transform.X;
+ PosY = transform.Y;
+ PosZ = transform.Z;
+
+ Vector3 scaling = new Vector3((float)Math.Sqrt((matrix.M11 * matrix.M11) + (matrix.M12 * matrix.M12) + (matrix.M13 * matrix.M13)),
+ (float)Math.Sqrt((matrix.M21 * matrix.M21) + (matrix.M22 * matrix.M22) + (matrix.M23 * matrix.M23)),
+ (float)Math.Sqrt((matrix.M31 * matrix.M31) + (matrix.M32 * matrix.M32) + (matrix.M33 * matrix.M33)));
+
+ //ScaleX = scaling.X;
+ //ScaleY = scaling.Y;
+ //ScaleZ = scaling.Z;
+
+ Matrix3 rotation = new Matrix3()
+ {
+ M11 = matrix.M11 / scaling.X,
+ M12 = matrix.M12 / scaling.X,
+ M13 = matrix.M13 / scaling.X,
+ M21 = matrix.M21 / scaling.Y,
+ M22 = matrix.M22 / scaling.Y,
+ M23 = matrix.M23 / scaling.Y,
+ M31 = matrix.M31 / scaling.Z,
+ M32 = matrix.M32 / scaling.Z,
+ M33 = matrix.M33 / scaling.Z
+ };
+
+ Quaternion quatRes = Quaternion.FromMatrix(rotation);
+
+ var q = quatRes;
+
+ double pitch = 0;
+ double yaw = 0;
+ double roll = 0;
+
+ double sinr_cosp = +2.0 * (q.W * q.X + q.Y * q.Z);
+ double cosr_cosp = +1.0 - 2.0 * (q.X * q.X + q.Y * q.Y);
+ roll = Math.Atan2(sinr_cosp, cosr_cosp);
-// return new OverlayHandles(overlayHandle, 0);
-// }
-// public void SetLocationBasedOnController()
-// {
-// uint controllerIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
+ // pitch (y-axis rotation)
+ double sinp = +2.0 * (q.W * q.Y - q.Z * q.X);
+ if (Math.Abs(sinp) >= 1)
+ pitch = C.math.copysign(MathHelper.Pi / 2, sinp); // use 90 degrees if out of range
+ else
+ pitch = Math.Asin(sinp);
-// TrackedDevicePose_t pose = new TrackedDevicePose_t();
-// TrackedDevicePose_t gamePose = new TrackedDevicePose_t();
-// var err = OpenVR.Compositor.GetLastPoseForTrackedDeviceIndex(controllerIndex, ref pose, ref gamePose);
-// if(err != EVRCompositorError.None)
-// {
-// this.GetLogger(m_Overlay).Warn($"Unable to set location based on controller: {err}");
-// return;
-// }
+ // yaw (z-axis rotation)
+ double siny_cosp = +2.0 * (q.W * q.Z + q.X * q.Y);
+ double cosy_cosp = +1.0 - 2.0 * (q.Y * q.Y + q.Z * q.Z);
+ yaw = Math.Atan2(siny_cosp, cosy_cosp);
-// if(pose.eTrackingResult != ETrackingResult.Running_OK)
-// {
-// this.GetLogger(m_Overlay).Warn($"Unable to get reliable tracking: {pose.eTrackingResult}");
-// }
+ pitch = MathHelper.RadiansToDegrees(pitch);
+ yaw = MathHelper.RadiansToDegrees(yaw);
+ roll = MathHelper.RadiansToDegrees(roll);
-// var matrix = pose.mDeviceToAbsoluteTracking.ToOpenTKMatrix();
-
-// matrix
-// }
+ RotP = (float)pitch;
+ RotY = (float)yaw;
+ RotR = (float)roll;
+ }
-// private void Overlay_Update(object sender, EventArgs e)
-// {
-// if (DateTime.Now.Subtract(m_LastCheck).TotalSeconds >= 1)
-// {
+ private void Overlay_Update(object sender, EventArgs e)
+ {
+ if (DateTime.Now.Subtract(m_LastCheck).TotalSeconds >= 1)
+ {
-// MathHelper.DegreesToRadians(RotP);
-// var quat = Quaternion.FromEulerAngles(MathHelper.DegreesToRadians(RotP), MathHelper.DegreesToRadians(RotY), MathHelper.DegreesToRadians(RotR));
-// Location = Matrix3x4.Mult(Matrix3x4.CreateTranslation(PosX, PosY, PosZ), Matrix3x4.Mult(Matrix3x4.CreateFromQuaternion(quat), Matrix3x4.CreateScale(ScaleX, ScaleY, ScaleZ)));
+ MathHelper.DegreesToRadians(RotP);
+ var quat = Quaternion.FromEulerAngles(MathHelper.DegreesToRadians(RotP), MathHelper.DegreesToRadians(RotY), MathHelper.DegreesToRadians(RotR));
+ Location = Matrix3x4.Mult(Matrix3x4.CreateTranslation(PosX, PosY, PosZ), Matrix3x4.Mult(Matrix3x4.CreateFromQuaternion(quat), Matrix3x4.CreateScale(ScaleX, ScaleY, ScaleZ)));
-// if (m_Overlay.OverlayHandle == OpenVR.k_ulOverlayHandleInvalid) { return; }
+ if (Overlay.OverlayHandle == OpenVR.k_ulOverlayHandleInvalid) { return; }
-// var matrix = Location.ToOpenVRMatrix();
+ var matrix = Location.ToOpenVRMatrix();
-// var err = OpenVR.Overlay.SetOverlayTransformAbsolute(m_Overlay.OverlayHandle, ETrackingUniverseOrigin.TrackingUniverseStanding, ref matrix);
+ var err = OpenVR.Overlay.SetOverlayTransformAbsolute(Overlay.OverlayHandle, ETrackingUniverseOrigin.TrackingUniverseStanding, ref matrix);
-// //var err = OpenVR.Overlay.SetOverlayTransformTrackedDeviceRelative(m_Overlay.OverlayHandle, m_ControllerIndex, ref matrix);
+ //var err = OpenVR.Overlay.SetOverlayTransformTrackedDeviceRelative(m_Overlay.OverlayHandle, m_ControllerIndex, ref matrix);
-// if (err != EVROverlayError.None)
-// {
-// this.GetLogger(m_Overlay).Warn($"Error setting tracked device relative to {Controller} hand: {err}");
-// }
-// else
-// {
-// this.GetLogger(m_Overlay).Info($"Controller index updated.");
-// }
+ if (err != EVROverlayError.None)
+ {
+ this.GetLogger(Overlay).Warn($"Error setting overlay absolute location: {err}");
+ }
-// m_LastCheck = DateTime.Now;
-// }
-// }
+ m_LastCheck = DateTime.Now;
+ }
+ }
-// public void ResetCheckTimer()
-// {
-// m_LastCheck = DateTime.MinValue;
-// }
-
-// public enum ControllerHand
-// {
-// Left = 0,
-// Right = 1
-// }
-// }
-//}
+ public void ResetCheckTimer()
+ {
+ m_LastCheck = DateTime.MinValue;
+ }
+ }
+}
diff --git a/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml b/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml
new file mode 100644
index 0000000..aa4239d
--- /dev/null
+++ b/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Position:
+
+ X:
+
+
+
+ Y:
+
+
+
+ Z:
+
+
+
+
+ Rotation:
+
+ P:
+
+
+
+ Y:
+
+
+
+ R:
+
+
+
+
+ Scale:
+
+ X:
+
+
+
+ Y:
+
+
+
+ Z:
+
+
+
+
+
+
+
+
+
diff --git a/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml.cs b/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml.cs
new file mode 100644
index 0000000..1f891e8
--- /dev/null
+++ b/VRDash/UI/LocationEditors/PlayspaceLocationEditor.xaml.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Valve.VR;
+using VRDash.Overlay.Config.OverlayLocation;
+
+namespace VRDash.UI.LocationEditors
+{
+ ///
+ /// Interaction logic for ControllerLocationEditor.xaml
+ ///
+ public partial class PlayspaceLocationEditor : UserControl
+ {
+ public PlayspaceLocation Location { get; set; } = null;
+
+ public PlayspaceLocationEditor(PlayspaceLocation loction)
+ {
+ Location = loction;
+ InitializeComponent();
+ DataContext = this;
+ //We're still in overlay creation mode. Don't display the button for now
+ if (Location.Overlay == null)
+ {
+ btnFromController.Visibility = Visibility.Hidden;
+ }
+ }
+
+ private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
+ {
+ Location.ResetCheckTimer();
+ }
+
+ public void RefreshUI()
+ {
+ Panel container = (Panel)this.Content;
+ UIElementCollection children = container.Children;
+
+ List lstElement = children.Cast().ToList();
+
+ var lstControl = lstElement.OfType();
+
+ //Lazy way of updating all of those text boxes.
+ foreach(var control in children)
+ {
+ if (control.GetType() == typeof(DockPanel))
+ {
+ var dockPanel = (DockPanel)control;
+ foreach (var dcChild in dockPanel.Children)
+ {
+ if(dcChild.GetType() == typeof(TextBox))
+ {
+ var tb = (TextBox)dcChild;
+ tb.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
+ }
+ }
+ }
+ }
+ }
+
+ private void btnFromController_Click(object sender, RoutedEventArgs e)
+ {
+ PlayspaceLocationSelector sel = new PlayspaceLocationSelector(Location);
+ sel.ShowDialog();
+
+ RefreshUI();
+ }
+ }
+}
diff --git a/VRDash/UI/PlayspaceLocationSelector.xaml b/VRDash/UI/PlayspaceLocationSelector.xaml
new file mode 100644
index 0000000..29d247a
--- /dev/null
+++ b/VRDash/UI/PlayspaceLocationSelector.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+ Close the SteamVR menu. Position your left controller where you'd like the overlay to be positioned. Press the application menu button, (the menu button above the touchpad) to drop the overlay there. Press 'Close' when finished.
+
+
+
diff --git a/VRDash/UI/PlayspaceLocationSelector.xaml.cs b/VRDash/UI/PlayspaceLocationSelector.xaml.cs
new file mode 100644
index 0000000..42b42d6
--- /dev/null
+++ b/VRDash/UI/PlayspaceLocationSelector.xaml.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using Valve.VR;
+using VRDash.Overlay.Config.OverlayLocation;
+
+namespace VRDash.UI
+{
+ ///
+ /// Interaction logic for PlayspaceLocationSelector.xaml
+ ///
+ public partial class PlayspaceLocationSelector : Window
+ {
+ PlayspaceLocation m_Location = null;
+ Task m_Task = null;
+ bool m_Running = true;
+ uint m_ControllerIndex = OpenVR.k_unTrackedDeviceIndexInvalid;
+
+ public PlayspaceLocationSelector(PlayspaceLocation location)
+ {
+ InitializeComponent();
+ m_Location = location;
+ }
+
+ void RunTask()
+ {
+ while (m_Running)
+ {
+ VREvent_t ev = new VREvent_t();
+ while (OpenVR.System.PollNextEvent(ref ev, (uint)Marshal.SizeOf(ev)))
+ {
+ //If this is a button press, tracked device is the left controller, and it is the application button
+ if(ev.eventType == (uint)EVREventType.VREvent_ButtonUnpress && ev.trackedDeviceIndex == m_ControllerIndex && ev.data.controller.button == (uint)EVRButtonId.k_EButton_ApplicationMenu)
+ {
+ m_Location.SetLocationBasedOnController();
+ this.GetLogger().Debug("Setting overlay pos to left controller.");
+ }
+ }
+ }
+ }
+
+ private void btnClose_Click(object sender, RoutedEventArgs e)
+ {
+ m_Running = false;
+ m_Task?.Wait();
+ Close();
+ }
+
+ bool m_Shown = false;
+ private void Window_ContentRendered(object sender, EventArgs e)
+ {
+ if (m_Shown) { return; }
+ m_Shown = true;
+ m_ControllerIndex = OpenVR.System.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
+
+ if (m_ControllerIndex == OpenVR.k_unTrackedDeviceIndexInvalid)
+ {
+ MessageBox.Show("Unable to identify left controller. Is it connected?", "Controller Ident Error", MessageBoxButton.OK, MessageBoxImage.Warning);
+ Close();
+ return;
+ }
+
+ m_Task = Task.Factory.StartNew(() => { RunTask(); });
+ }
+ }
+}
diff --git a/VRDash/VRDash.csproj b/VRDash/VRDash.csproj
index 60149e4..473671d 100644
--- a/VRDash/VRDash.csproj
+++ b/VRDash/VRDash.csproj
@@ -61,6 +61,9 @@
true
+
+ ..\packages\C.math.NET.1.1\lib\net20\C.math.dll
+
..\packages\log4net.2.0.8\lib\net45-full\log4net.dll
@@ -141,6 +144,9 @@
+
+ PlayspaceLocationEditor.xaml
+
ControllerLocationEditor.xaml
@@ -150,6 +156,9 @@
OverlayEditor.xaml
+
+ PlayspaceLocationSelector.xaml
+
ProcessSelectorEditor.xaml
@@ -203,6 +212,10 @@
Designer
MSBuild:Compile
+
+ MSBuild:Compile
+ Designer
+
Designer
MSBuild:Compile
@@ -215,6 +228,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/VRDash/packages.config b/VRDash/packages.config
index ef9c35d..59bdb32 100644
--- a/VRDash/packages.config
+++ b/VRDash/packages.config
@@ -1,5 +1,6 @@
+