diff --git a/Dotnet/AppApi/AppApi.cs b/Dotnet/AppApi/AppApi.cs index 43ab8226..dae37662 100644 --- a/Dotnet/AppApi/AppApi.cs +++ b/Dotnet/AppApi/AppApi.cs @@ -356,18 +356,18 @@ namespace VRCX public void ExecuteVrFeedFunction(string function, string json) { - if (VRCXVR._browser1 == null) return; - if (VRCXVR._browser1.IsLoading) + if (VRCXVR._wristOverlay == null) return; + if (VRCXVR._wristOverlay.IsLoading) VRCXVR.Instance.Restart(); - VRCXVR._browser1.ExecuteScriptAsync($"$app.{function}", json); + VRCXVR._wristOverlay.ExecuteScriptAsync($"$app.{function}", json); } public void ExecuteVrOverlayFunction(string function, string json) { - if (VRCXVR._browser2 == null) return; - if (VRCXVR._browser2.IsLoading) + if (VRCXVR._hmdOverlay == null) return; + if (VRCXVR._hmdOverlay.IsLoading) VRCXVR.Instance.Restart(); - VRCXVR._browser2.ExecuteScriptAsync($"$app.{function}", json); + VRCXVR._hmdOverlay.ExecuteScriptAsync($"$app.{function}", json); } /// diff --git a/Dotnet/Overlay/VRCXVR.cs b/Dotnet/Overlay/VRCXVR.cs index fae8021f..ceaee94a 100644 --- a/Dotnet/Overlay/VRCXVR.cs +++ b/Dotnet/Overlay/VRCXVR.cs @@ -33,20 +33,28 @@ namespace VRCX private static readonly float[] _translationRight = { 7f / 100f, -5f / 100f, 6f / 100f }; private static readonly float[] _rotationLeft = { 90f * (float)(Math.PI / 180f), 90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f) }; private static readonly float[] _rotationRight = { -90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f) }; - public static OffScreenBrowser _browser1; - public static OffScreenBrowser _browser2; + public static OffScreenBrowser _wristOverlay; + public static OffScreenBrowser _hmdOverlay; private readonly List _deviceList; private readonly ReaderWriterLockSlim _deviceListLock; private bool _active; private Device _device; - private bool _hmdOverlayActive; private bool _menuButton; private int _overlayHand; + private Factory _factory; private Texture2D _texture1; private Texture2D _texture2; private Thread _thread; - private bool _wristOverlayActive; private DateTime _nextOverlayUpdate; + + private ulong _hmdOverlayHandle; + private bool _hmdOverlayActive; + private bool _hmdOverlayWasActive; + + private ulong _wristOverlayHandle; + private bool _wristOverlayActive; + private bool _wristOverlayWasActive; + public bool IsHmdAfk { get; private set; } static VRCXVR() @@ -89,8 +97,10 @@ namespace VRCX private void SetupTextures() { - Factory f = new Factory1(); - _device = new Device(f.GetAdapter(OpenVR.System.GetD3D9AdapterIndex()), + _factory ??= new Factory1(); + + _device?.Dispose(); + _device = new Device(_factory.GetAdapter(OpenVR.System.GetD3D9AdapterIndex()), DeviceCreationFlags.BgraSupport); UpgradeDevice(); @@ -108,7 +118,7 @@ namespace VRCX BindFlags = BindFlags.ShaderResource } ); - _browser1?.UpdateRender(_device, _texture1); + _wristOverlay?.UpdateRender(_device, _texture1); _texture2?.Dispose(); _texture2 = new Texture2D( @@ -124,7 +134,7 @@ namespace VRCX BindFlags = BindFlags.ShaderResource } ); - _browser2?.UpdateRender(_device, _texture2); + _hmdOverlay?.UpdateRender(_device, _texture2); } private void UpgradeDevice() @@ -176,16 +186,14 @@ namespace VRCX var overlayVisible1 = false; var overlayVisible2 = false; var dashboardHandle = 0UL; - var overlayHandle1 = 0UL; - var overlayHandle2 = 0UL; - _browser1 = new OffScreenBrowser( + _wristOverlay = new OffScreenBrowser( "file://vrcx/vr.html?1", 512, 512 ); - _browser2 = new OffScreenBrowser( + _hmdOverlay = new OffScreenBrowser( "file://vrcx/vr.html?2", 1024, 1024 @@ -264,22 +272,30 @@ namespace VRCX logger.Error(err); } - err = ProcessOverlay1(overlay, ref overlayHandle1, ref overlayVisible1, dashboardVisible, overlayIndex); - if (err != EVROverlayError.None && - overlayHandle1 != 0) + if (_wristOverlayActive) { - overlay.DestroyOverlay(overlayHandle1); - overlayHandle1 = 0; - logger.Error(err); + err = ProcessOverlay1(overlay, ref _wristOverlayHandle, ref overlayVisible1, + dashboardVisible, overlayIndex); + if (err != EVROverlayError.None && + _wristOverlayHandle != 0) + { + overlay.DestroyOverlay(_wristOverlayHandle); + _wristOverlayHandle = 0; + logger.Error(err); + } } - err = ProcessOverlay2(overlay, ref overlayHandle2, ref overlayVisible2, dashboardVisible); - if (err != EVROverlayError.None && - overlayHandle2 != 0) + if (_hmdOverlayActive) { - overlay.DestroyOverlay(overlayHandle2); - overlayHandle2 = 0; - logger.Error(err); + err = ProcessOverlay2(overlay, ref _hmdOverlayHandle, ref overlayVisible2, + dashboardVisible); + if (err != EVROverlayError.None && + _hmdOverlayHandle != 0) + { + overlay.DestroyOverlay(_hmdOverlayHandle); + _hmdOverlayHandle = 0; + logger.Error(err); + } } } } @@ -301,8 +317,8 @@ namespace VRCX } } - _browser2?.Dispose(); - _browser1?.Dispose(); + _hmdOverlay?.Dispose(); + _wristOverlay?.Dispose(); _texture2?.Dispose(); _texture1?.Dispose(); _device?.Dispose(); @@ -315,12 +331,28 @@ namespace VRCX _wristOverlayActive = wristOverlay; _menuButton = menuButton; _overlayHand = overlayHand; + + if (_hmdOverlayActive != _hmdOverlayWasActive && _hmdOverlayHandle != 0) + { + OpenVR.Overlay.DestroyOverlay(_hmdOverlayHandle); + _hmdOverlayHandle = 0; + } + + _hmdOverlayWasActive = _hmdOverlayActive; + + if (_wristOverlayActive != _wristOverlayWasActive && _wristOverlayHandle != 0) + { + OpenVR.Overlay.DestroyOverlay(_wristOverlayHandle); + _wristOverlayHandle = 0; + } + + _wristOverlayWasActive = _wristOverlayActive; } public void Refresh() { - _browser1.Reload(); - _browser2.Reload(); + _wristOverlay.Reload(); + _hmdOverlay.Reload(); } public string[][] GetDevices() @@ -555,20 +587,20 @@ namespace VRCX if (type == EVREventType.VREvent_MouseMove) { var m = e.data.mouse; - var s = _browser1.Size; - _browser1.GetBrowserHost().SendMouseMoveEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), false, CefEventFlags.None); + var s = _wristOverlay.Size; + _wristOverlay.GetBrowserHost().SendMouseMoveEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), false, CefEventFlags.None); } else if (type == EVREventType.VREvent_MouseButtonDown) { var m = e.data.mouse; - var s = _browser1.Size; - _browser1.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, false, 1, CefEventFlags.LeftMouseButton); + var s = _wristOverlay.Size; + _wristOverlay.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, false, 1, CefEventFlags.LeftMouseButton); } else if (type == EVREventType.VREvent_MouseButtonUp) { var m = e.data.mouse; - var s = _browser1.Size; - _browser1.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, true, 1, CefEventFlags.None); + var s = _wristOverlay.Size; + _wristOverlay.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, true, 1, CefEventFlags.None); } }