From 2114ab12877614dd8dad9291aa65da232dcae515 Mon Sep 17 00:00:00 2001 From: pypy Date: Sun, 8 Nov 2020 18:54:03 +0900 Subject: [PATCH] cleanup code --- AppApi.cs | 8 +- CpuMonitor.cs | 38 ++-- MainForm.cs | 15 +- OffScreenBrowser.cs | 138 +++++++++++--- Program.cs | 4 +- VRCXVR.cs | 455 ++++++++++++++++++++++++-------------------- VRForm.cs | 42 ++-- WebApi.cs | 1 + 8 files changed, 419 insertions(+), 282 deletions(-) diff --git a/AppApi.cs b/AppApi.cs index de298931..a63aabbe 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -156,22 +156,22 @@ namespace VRCX public void StartVR() { - VRCXVR.SetActive(true); + VRCXVR.Instance.SetActive(true); } public void StopVR() { - VRCXVR.SetActive(false); + VRCXVR.Instance.SetActive(false); } public void RefreshVR() { - VRCXVR.Refresh(); + VRCXVR.Instance.Refresh(); } public string[][] GetVRDevices() { - return VRCXVR.GetDevices(); + return VRCXVR.Instance.GetDevices(); } public float CpuUsage() diff --git a/CpuMonitor.cs b/CpuMonitor.cs index 59ca2f77..182f81d4 100644 --- a/CpuMonitor.cs +++ b/CpuMonitor.cs @@ -11,9 +11,9 @@ namespace VRCX public class CpuMonitor { public static readonly CpuMonitor Instance; - public float CpuUsage { get; private set; } - private readonly PerformanceCounter m_Counter; - private Thread m_Thread; + public float CpuUsage; + private PerformanceCounter _performanceCounter; + private Thread _thread; static CpuMonitor() { @@ -24,25 +24,35 @@ namespace VRCX { try { - m_Counter = new PerformanceCounter("Processor Information", "% Processor Utility", "_Total", true); + _performanceCounter = new PerformanceCounter( + "Processor Information", + "% Processor Utility", + "_Total", + true + ); } catch { } // fallback - if (m_Counter == null) + if (_performanceCounter == null) { try { - m_Counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); + _performanceCounter = new PerformanceCounter( + "Processor", + "% Processor Time", + "_Total", + true + ); } catch { } } - m_Thread = new Thread(ThreadLoop) + _thread = new Thread(ThreadLoop) { IsBackground = true }; @@ -50,25 +60,25 @@ namespace VRCX internal void Init() { - m_Thread.Start(); + _thread.Start(); } internal void Exit() { - var thread = m_Thread; - m_Thread = null; + var thread = _thread; + _thread = null; thread.Interrupt(); thread.Join(); - m_Counter?.Dispose(); + _performanceCounter?.Dispose(); } private void ThreadLoop() { - while (m_Thread != null) + while (_thread != null) { - if (m_Counter != null) + if (_performanceCounter != null) { - CpuUsage = m_Counter.NextValue(); + CpuUsage = _performanceCounter.NextValue(); } try diff --git a/MainForm.cs b/MainForm.cs index 6ce23246..1bfc7efe 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -26,6 +26,7 @@ namespace VRCX { Instance = this; InitializeComponent(); + try { var location = Assembly.GetExecutingAssembly().Location; @@ -36,22 +37,26 @@ namespace VRCX catch { } - // Program.BaseDirectory + "/html/index.html" - Browser = new ChromiumWebBrowser(Path.Combine(Program.BaseDirectory, "html/index.html")) + + Browser = new ChromiumWebBrowser( + Path.Combine(Program.BaseDirectory, "html/index.html") + ) { DragHandler = new NoopDragHandler(), BrowserSettings = { - // UniversalAccessFromFileUrls = CefState.Enabled, DefaultEncoding = "UTF-8", }, - Dock = DockStyle.Fill, + Dock = DockStyle.Fill }; - Util.ApplyJavascriptBindings(Browser.JavascriptObjectRepository); + Browser.IsBrowserInitializedChanged += (A, B) => { // Browser.ShowDevTools(); }; + + Util.ApplyJavascriptBindings(Browser.JavascriptObjectRepository); + Controls.Add(Browser); } diff --git a/OffScreenBrowser.cs b/OffScreenBrowser.cs index 93ff0915..763a88c0 100644 --- a/OffScreenBrowser.cs +++ b/OffScreenBrowser.cs @@ -9,22 +9,32 @@ using CefSharp.OffScreen; using CefSharp.Structs; using SharpDX.Direct3D11; using System; +using System.Runtime.InteropServices; +using System.Threading; namespace VRCX { public class OffScreenBrowser : ChromiumWebBrowser, IRenderHandler { - private Texture2D _texture; + private ReaderWriterLockSlim _paintBufferLock; + private GCHandle _paintBuffer; + private int _width; + private int _height; - public OffScreenBrowser(Texture2D texture, string address) - : base(address, new BrowserSettings() - { - DefaultEncoding = "UTF-8" - }) + public OffScreenBrowser(string address, int width, int height) + : base( + address, + new BrowserSettings() + { + DefaultEncoding = "UTF-8" + } + ) { - _texture = texture; - Size = new System.Drawing.Size(texture.Description.Width, texture.Description.Height); + _paintBufferLock = new ReaderWriterLockSlim(); + + Size = new System.Drawing.Size(width, height); RenderHandler = this; + Util.ApplyJavascriptBindings(JavascriptObjectRepository); } @@ -32,17 +42,78 @@ namespace VRCX { RenderHandler = null; base.Dispose(); - _texture = null; + + _paintBufferLock.EnterWriteLock(); + try + { + if (_paintBuffer.IsAllocated == true) + { + _paintBuffer.Free(); + } + } + finally + { + _paintBufferLock.ExitWriteLock(); + } + + _paintBufferLock.Dispose(); } - // + public void RenderToTexture(Texture2D texture) + { + _paintBufferLock.EnterReadLock(); + try + { + if (_width > 0 && + _height > 0) + { + var context = texture.Device.ImmediateContext; + var dataBox = context.MapSubresource( + texture, + 0, + MapMode.WriteDiscard, + MapFlags.None + ); + if (dataBox.IsEmpty == false) + { + var sourcePtr = _paintBuffer.AddrOfPinnedObject(); + var destinationPtr = dataBox.DataPointer; + var pitch = _width * 4; + var rowPitch = dataBox.RowPitch; + if (pitch == rowPitch) + { + WinApi.CopyMemory( + destinationPtr, + sourcePtr, + (uint)(_width * _height * 4) + ); + } + else + { + for (var y = _height; y > 0; --y) + { + WinApi.CopyMemory( + destinationPtr, + sourcePtr, + (uint)pitch + ); + sourcePtr += pitch; + destinationPtr += rowPitch; + } + } + } + context.UnmapSubresource(texture, 0); + } + } + finally + { + _paintBufferLock.ExitReadLock(); + } + } ScreenInfo? IRenderHandler.GetScreenInfo() { - return new ScreenInfo - { - DeviceScaleFactor = 1f - }; + return null; } bool IRenderHandler.GetScreenPoint(int viewX, int viewY, out int screenX, out int screenY) @@ -74,29 +145,34 @@ namespace VRCX { if (type == PaintElementType.View) { - var context = _texture.Device.ImmediateContext; - var dataBox = context.MapSubresource(_texture, 0, MapMode.WriteDiscard, MapFlags.None); - if (dataBox.IsEmpty == false) + _paintBufferLock.EnterWriteLock(); + try { - var sourcePtr = buffer; - var destinationPtr = dataBox.DataPointer; - var rowPitch = dataBox.RowPitch; - var pitch = width * 4; - if (rowPitch == pitch) + if (_width != width || + _height != height) { - WinApi.CopyMemory(destinationPtr, sourcePtr, (uint)(width * height * 4)); - } - else - { - for (var i = height; i > 0; --i) + _width = width; + _height = height; + if (_paintBuffer.IsAllocated == true) { - WinApi.CopyMemory(destinationPtr, sourcePtr, (uint)pitch); - sourcePtr += pitch; - destinationPtr += rowPitch; + _paintBuffer.Free(); } + _paintBuffer = GCHandle.Alloc( + new byte[_width * _height * 4], + GCHandleType.Pinned + ); } + + WinApi.CopyMemory( + _paintBuffer.AddrOfPinnedObject(), + buffer, + (uint)(width * height * 4) + ); + } + finally + { + _paintBufferLock.ExitWriteLock(); } - context.UnmapSubresource(_texture, 0); } } diff --git a/Program.cs b/Program.cs index 9fdfebff..46e5f3b8 100644 --- a/Program.cs +++ b/Program.cs @@ -45,9 +45,9 @@ namespace VRCX LogWatcher.Instance.Init(); CefService.Instance.Init(); - VRCXVR.Init(); + VRCXVR.Instance.Init(); Application.Run(new MainForm()); - VRCXVR.Exit(); + VRCXVR.Instance.Exit(); CefService.Instance.Exit(); LogWatcher.Instance.Exit(); diff --git a/VRCXVR.cs b/VRCXVR.cs index 272514c3..45fef4d5 100644 --- a/VRCXVR.cs +++ b/VRCXVR.cs @@ -19,222 +19,263 @@ using Device = SharpDX.Direct3D11.Device; namespace VRCX { - public static class VRCXVR + public class VRCXVR { - private static readonly ReaderWriterLockSlim m_Lock = new ReaderWriterLockSlim(); - private static List m_Devices = new List(); - private static Thread m_Thread; - private static Device m_Device; - private static Texture2D m_Texture1; - private static Texture2D m_Texture2; - private static OffScreenBrowser m_Browser1; - private static OffScreenBrowser m_Browser2; - private static bool m_Active; - private static float[] m_Rotation = { 0f, 0f, 0f }; - private static float[] m_Translation = { 0f, 0f, 0f }; - private static float[] m_L_Translation = { -7f / 100f, -5f / 100f, 6f / 100f }; - private static float[] m_R_Translation = { 7f / 100f, -5f / 100f, 6f / 100f }; - private static float[] m_L_Rotation = { 90f * (float)(Math.PI / 180f), 90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f) }; - private static float[] m_R_Rotation = { -90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f), -90f * (float)(Math.PI / 180f) }; + public static readonly VRCXVR Instance; + private static readonly float[] _rotation = { 0f, 0f, 0f }; + private static readonly float[] _translation = { 0f, 0f, 0f }; + private static readonly float[] _translationLeft = { -7f / 100f, -5f / 100f, 6f / 100f }; + 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) }; + private readonly ReaderWriterLockSlim _deviceListLock; + private List _deviceList; + private Thread _thread; + private Device _device; + private Texture2D _texture1; + private Texture2D _texture2; + private OffScreenBrowser _browser1; + private OffScreenBrowser _browser2; + private bool _active; - // NOTE - // 메모리 릭 때문에 미리 생성해놓고 계속 사용함 - public static void Init() + static VRCXVR() { - m_Device = new Device( - DriverType.Hardware, - DeviceCreationFlags.BgraSupport - ); - m_Texture1 = new Texture2D(m_Device, new Texture2DDescription() - { - Width = 512, - Height = 512, - MipLevels = 1, - ArraySize = 1, - Format = Format.B8G8R8A8_UNorm, - SampleDescription = new SampleDescription(1, 0), - Usage = ResourceUsage.Dynamic, - BindFlags = BindFlags.ShaderResource, - CpuAccessFlags = CpuAccessFlags.Write - }); - m_Texture2 = new Texture2D(m_Device, new Texture2DDescription() - { - Width = 512, - Height = 512, - MipLevels = 1, - ArraySize = 1, - Format = Format.B8G8R8A8_UNorm, - SampleDescription = new SampleDescription(1, 0), - Usage = ResourceUsage.Dynamic, - BindFlags = BindFlags.ShaderResource, - CpuAccessFlags = CpuAccessFlags.Write - }); - m_Browser1 = new OffScreenBrowser(m_Texture1, Path.Combine(Program.BaseDirectory, "html/vr.html?1")); - m_Browser2 = new OffScreenBrowser(m_Texture2, Path.Combine(Program.BaseDirectory, "html/vr.html?2")); - m_Thread = new Thread(() => - { - var active = false; - var e = new VREvent_t(); - var nextInit = DateTime.MinValue; - var nextDeviceUpdate = DateTime.MinValue; - var nextOverlay = DateTime.MinValue; - var overlayIndex = OpenVR.k_unTrackedDeviceIndexInvalid; - var overlayVisible1 = false; - var overlayVisible2 = false; - var dashboardHandle = 0UL; - var overlayHandle1 = 0UL; - var overlayHandle2 = 0UL; - while (m_Thread != null) - { - try - { - Thread.Sleep(10); - } - catch - { - // ThreadInterruptedException - } - if (m_Active) - { - m_Browser1.Render(); - m_Browser2.Render(); - var system = OpenVR.System; - if (system == null) - { - if (DateTime.UtcNow.CompareTo(nextInit) <= 0) - { - continue; - } - var _err = EVRInitError.None; - system = OpenVR.Init(ref _err, EVRApplicationType.VRApplication_Overlay); - nextInit = DateTime.UtcNow.AddSeconds(5); - if (system == null) - { - continue; - } - active = true; - } - while (system.PollNextEvent(ref e, (uint)Marshal.SizeOf(e))) - { - var type = (EVREventType)e.eventType; - if (type == EVREventType.VREvent_Quit) - { - active = false; - OpenVR.Shutdown(); - nextInit = DateTime.UtcNow.AddSeconds(10); - system = null; - break; - } - } - if (system != null) - { - if (DateTime.UtcNow.CompareTo(nextDeviceUpdate) >= 0) - { - overlayIndex = OpenVR.k_unTrackedDeviceIndexInvalid; - UpdateDevices(system, ref overlayIndex); - if (overlayIndex != OpenVR.k_unTrackedDeviceIndexInvalid) - { - nextOverlay = DateTime.UtcNow.AddSeconds(10); - } - nextDeviceUpdate = DateTime.UtcNow.AddSeconds(0.1); - } - var overlay = OpenVR.Overlay; - if (overlay != null) - { - var dashboardVisible = overlay.IsDashboardVisible(); - var err = ProcessDashboard(overlay, ref dashboardHandle, dashboardVisible); - if (err != EVROverlayError.None && - dashboardHandle != 0) - { - overlay.DestroyOverlay(dashboardHandle); - dashboardHandle = 0; - } - err = ProcessOverlay1(overlay, ref overlayHandle1, ref overlayVisible1, dashboardVisible, overlayIndex, nextOverlay); - if (err != EVROverlayError.None && - overlayHandle1 != 0) - { - overlay.DestroyOverlay(overlayHandle1); - overlayHandle1 = 0; - } - err = ProcessOverlay2(overlay, ref overlayHandle2, ref overlayVisible2, dashboardVisible); - if (err != EVROverlayError.None && - overlayHandle2 != 0) - { - overlay.DestroyOverlay(overlayHandle2); - overlayHandle2 = 0; - } - } - } - } - else if (active) - { - active = false; - OpenVR.Shutdown(); - m_Lock.EnterWriteLock(); - try - { - m_Devices.Clear(); - } - finally - { - m_Lock.ExitWriteLock(); - } - } - } - }) + Instance = new VRCXVR(); + } + + public VRCXVR() + { + _deviceListLock = new ReaderWriterLockSlim(); + _deviceList = new List(); + _thread = new Thread(ThreadLoop) { IsBackground = true }; - m_Thread.Start(); } - public static void Exit() + // NOTE + // 메모리 릭 때문에 미리 생성해놓고 계속 사용함 + internal void Init() { - var T = m_Thread; - m_Thread = null; - T.Interrupt(); - T.Join(); - m_Browser2.Dispose(); - m_Browser1.Dispose(); - m_Texture2.Dispose(); - m_Texture1.Dispose(); - m_Device.Dispose(); + _thread.Start(); } - public static void SetActive(bool active) + internal void Exit() { - m_Active = active; + var thread = _thread; + _thread = null; + thread.Interrupt(); + thread.Join(); } - public static void Refresh() + private void ThreadLoop() { - m_Browser1.ExecuteScriptAsync("location.reload()"); - m_Browser2.ExecuteScriptAsync("location.reload()"); + var active = false; + var e = new VREvent_t(); + var nextInit = DateTime.MinValue; + var nextDeviceUpdate = DateTime.MinValue; + var nextOverlay = DateTime.MinValue; + var overlayIndex = OpenVR.k_unTrackedDeviceIndexInvalid; + var overlayVisible1 = false; + var overlayVisible2 = false; + var dashboardHandle = 0UL; + var overlayHandle1 = 0UL; + var overlayHandle2 = 0UL; + + // REMOVE THIS + nextOverlay = DateTime.MaxValue; + + _device = new Device( + DriverType.Hardware, + DeviceCreationFlags.SingleThreaded | DeviceCreationFlags.BgraSupport + ); + + _texture1 = new Texture2D( + _device, + new Texture2DDescription() + { + Width = 512, + Height = 512, + MipLevels = 1, + ArraySize = 1, + Format = Format.B8G8R8A8_UNorm, + SampleDescription = new SampleDescription(1, 0), + Usage = ResourceUsage.Dynamic, + BindFlags = BindFlags.ShaderResource, + CpuAccessFlags = CpuAccessFlags.Write + } + ); + + _texture2 = new Texture2D( + _device, + new Texture2DDescription() + { + Width = 512, + Height = 512, + MipLevels = 1, + ArraySize = 1, + Format = Format.B8G8R8A8_UNorm, + SampleDescription = new SampleDescription(1, 0), + Usage = ResourceUsage.Dynamic, + BindFlags = BindFlags.ShaderResource, + CpuAccessFlags = CpuAccessFlags.Write + } + ); + + _browser1 = new OffScreenBrowser( + Path.Combine(Program.BaseDirectory, "html/vr.html?1"), + 512, + 512 + ); + + _browser2 = new OffScreenBrowser( + Path.Combine(Program.BaseDirectory, "html/vr.html?2"), + 512, + 512 + ); + + while (_thread != null) + { + _browser1.RenderToTexture(_texture1); + _browser2.RenderToTexture(_texture2); + + try + { + Thread.Sleep(10); + } + catch + { + // ThreadInterruptedException + } + + if (_active) + { + var system = OpenVR.System; + if (system == null) + { + if (DateTime.UtcNow.CompareTo(nextInit) <= 0) + { + continue; + } + var _err = EVRInitError.None; + system = OpenVR.Init(ref _err, EVRApplicationType.VRApplication_Overlay); + nextInit = DateTime.UtcNow.AddSeconds(5); + if (system == null) + { + continue; + } + active = true; + } + while (system.PollNextEvent(ref e, (uint)Marshal.SizeOf(e))) + { + var type = (EVREventType)e.eventType; + if (type == EVREventType.VREvent_Quit) + { + active = false; + OpenVR.Shutdown(); + nextInit = DateTime.UtcNow.AddSeconds(10); + system = null; + break; + } + } + if (system != null) + { + if (DateTime.UtcNow.CompareTo(nextDeviceUpdate) >= 0) + { + overlayIndex = OpenVR.k_unTrackedDeviceIndexInvalid; + UpdateDevices(system, ref overlayIndex); + if (overlayIndex != OpenVR.k_unTrackedDeviceIndexInvalid) + { + nextOverlay = DateTime.UtcNow.AddSeconds(10); + } + nextDeviceUpdate = DateTime.UtcNow.AddSeconds(0.1); + } + var overlay = OpenVR.Overlay; + if (overlay != null) + { + var dashboardVisible = overlay.IsDashboardVisible(); + var err = ProcessDashboard(overlay, ref dashboardHandle, dashboardVisible); + if (err != EVROverlayError.None && + dashboardHandle != 0) + { + overlay.DestroyOverlay(dashboardHandle); + dashboardHandle = 0; + } + err = ProcessOverlay1(overlay, ref overlayHandle1, ref overlayVisible1, dashboardVisible, overlayIndex, nextOverlay); + if (err != EVROverlayError.None && + overlayHandle1 != 0) + { + overlay.DestroyOverlay(overlayHandle1); + overlayHandle1 = 0; + } + err = ProcessOverlay2(overlay, ref overlayHandle2, ref overlayVisible2, dashboardVisible); + if (err != EVROverlayError.None && + overlayHandle2 != 0) + { + overlay.DestroyOverlay(overlayHandle2); + overlayHandle2 = 0; + } + } + } + } + else if (active) + { + active = false; + OpenVR.Shutdown(); + _deviceListLock.EnterWriteLock(); + try + { + _deviceList.Clear(); + } + finally + { + _deviceListLock.ExitWriteLock(); + } + } + } + + _browser2.Dispose(); + _browser1.Dispose(); + _texture2.Dispose(); + _texture1.Dispose(); + _device.Dispose(); + } - public static string[][] GetDevices() + public void SetActive(bool active) { - m_Lock.EnterReadLock(); + _active = active; + } + + public void Refresh() + { + _browser1.ExecuteScriptAsync("location.reload()"); + _browser2.ExecuteScriptAsync("location.reload()"); + } + + public string[][] GetDevices() + { + _deviceListLock.EnterReadLock(); try { - return m_Devices.ToArray(); + return _deviceList.ToArray(); } finally { - m_Lock.ExitReadLock(); + _deviceListLock.ExitReadLock(); } } - private static void UpdateDevices(CVRSystem system, ref uint overlayIndex) + internal void UpdateDevices(CVRSystem system, ref uint overlayIndex) { - m_Lock.EnterWriteLock(); + _deviceListLock.EnterWriteLock(); try { - m_Devices.Clear(); + _deviceList.Clear(); } finally { - m_Lock.ExitWriteLock(); + _deviceListLock.ExitWriteLock(); } var sb = new StringBuilder(256); var state = new VRControllerState_t(); @@ -267,13 +308,13 @@ namespace VRCX { if (role == ETrackedControllerRole.LeftHand) { - Array.Copy(m_L_Translation, m_Translation, 3); - Array.Copy(m_L_Rotation, m_Rotation, 3); + Array.Copy(_translationLeft, _translation, 3); + Array.Copy(_rotationLeft, _rotation, 3); } else { - Array.Copy(m_R_Translation, m_Translation, 3); - Array.Copy(m_R_Rotation, m_Rotation, 3); + Array.Copy(_translationRight, _translation, 3); + Array.Copy(_rotationRight, _rotation, 3); } overlayIndex = i; } @@ -310,20 +351,20 @@ namespace VRCX : "disconnected", (batteryPercentage * 100).ToString() }; - m_Lock.EnterWriteLock(); + _deviceListLock.EnterWriteLock(); try { - m_Devices.Add(item); + _deviceList.Add(item); } finally { - m_Lock.ExitWriteLock(); + _deviceListLock.ExitWriteLock(); } } } } - private static EVROverlayError ProcessDashboard(CVROverlay overlay, ref ulong dashboardHandle, bool dashboardVisible) + internal EVROverlayError ProcessDashboard(CVROverlay overlay, ref ulong dashboardHandle, bool dashboardVisible) { var err = EVROverlayError.None; @@ -363,20 +404,20 @@ namespace VRCX if (type == EVREventType.VREvent_MouseMove) { var m = e.data.mouse; - var s = m_Browser1.Size; - m_Browser1.GetBrowserHost().SendMouseMoveEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), false, CefEventFlags.None); + var s = _browser1.Size; + _browser1.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 = m_Browser1.Size; - m_Browser1.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, false, 1, CefEventFlags.LeftMouseButton); + 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); } else if (type == EVREventType.VREvent_MouseButtonUp) { var m = e.data.mouse; - var s = m_Browser1.Size; - m_Browser1.GetBrowserHost().SendMouseClickEvent((int)(m.x * s.Width), s.Height - (int)(m.y * s.Height), MouseButtonType.Left, true, 1, CefEventFlags.None); + 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); } } @@ -384,7 +425,7 @@ namespace VRCX { var texture = new Texture_t { - handle = m_Texture1.NativePointer + handle = _texture1.NativePointer }; err = overlay.SetOverlayTexture(dashboardHandle, ref texture); if (err != EVROverlayError.None) @@ -396,7 +437,7 @@ namespace VRCX return err; } - private static EVROverlayError ProcessOverlay1(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible, uint overlayIndex, DateTime nextOverlay) + internal EVROverlayError ProcessOverlay1(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible, uint overlayIndex, DateTime nextOverlay) { var err = EVROverlayError.None; @@ -438,10 +479,10 @@ namespace VRCX // http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices // Scaling-Rotation-Translation var m = Matrix.Scaling(0.25f); - m *= Matrix.RotationX(m_Rotation[0]); - m *= Matrix.RotationY(m_Rotation[1]); - m *= Matrix.RotationZ(m_Rotation[2]); - m *= Matrix.Translation(m_Translation[0], m_Translation[1], m_Translation[2]); + m *= Matrix.RotationX(_rotation[0]); + m *= Matrix.RotationY(_rotation[1]); + m *= Matrix.RotationZ(_rotation[2]); + m *= Matrix.Translation(_translation[0], _translation[1], _translation[2]); var hm34 = new HmdMatrix34_t { m0 = m.M11, @@ -469,7 +510,7 @@ namespace VRCX { var texture = new Texture_t { - handle = m_Texture1.NativePointer + handle = _texture1.NativePointer }; err = overlay.SetOverlayTexture(overlayHandle, ref texture); if (err != EVROverlayError.None) @@ -499,7 +540,7 @@ namespace VRCX return err; } - private static EVROverlayError ProcessOverlay2(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible) + internal EVROverlayError ProcessOverlay2(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible) { var err = EVROverlayError.None; @@ -562,7 +603,7 @@ namespace VRCX { var texture = new Texture_t { - handle = m_Texture2.NativePointer + handle = _texture2.NativePointer }; err = overlay.SetOverlayTexture(overlayHandle, ref texture); if (err != EVROverlayError.None) diff --git a/VRForm.cs b/VRForm.cs index 8f2addf3..a8fbda98 100644 --- a/VRForm.cs +++ b/VRForm.cs @@ -3,7 +3,6 @@ // This work is licensed under the terms of the MIT license. // For a copy, see . -using System; using System.IO; using System.Windows.Forms; using CefSharp; @@ -14,51 +13,56 @@ namespace VRCX public partial class VRForm : Form { public static VRForm Instance; - private ChromiumWebBrowser Browser1; - private ChromiumWebBrowser Browser2; + private ChromiumWebBrowser _browser1; + private ChromiumWebBrowser _browser2; public VRForm() { Instance = this; InitializeComponent(); - // - Browser1 = new ChromiumWebBrowser(Path.Combine(Program.BaseDirectory, "html/vr.html?1")) + + _browser1 = new ChromiumWebBrowser( + Path.Combine(Program.BaseDirectory, "html/vr.html?1") + ) { DragHandler = new NoopDragHandler(), BrowserSettings = { - // UniversalAccessFromFileUrls = CefState.Enabled, DefaultEncoding = "UTF-8", }, - Dock = DockStyle.Fill, + Dock = DockStyle.Fill }; - Browser2 = new ChromiumWebBrowser(Path.Combine(Program.BaseDirectory, "html/vr.html?2")) + + _browser2 = new ChromiumWebBrowser( + Path.Combine(Program.BaseDirectory, "html/vr.html?2") + ) { DragHandler = new NoopDragHandler(), BrowserSettings = { - // UniversalAccessFromFileUrls = CefState.Enabled, DefaultEncoding = "UTF-8", }, - Dock = DockStyle.Fill, + Dock = DockStyle.Fill }; - Util.ApplyJavascriptBindings(Browser1.JavascriptObjectRepository); - Util.ApplyJavascriptBindings(Browser2.JavascriptObjectRepository); - panel1.Controls.Add(Browser1); - panel2.Controls.Add(Browser2); + + Util.ApplyJavascriptBindings(_browser1.JavascriptObjectRepository); + Util.ApplyJavascriptBindings(_browser2.JavascriptObjectRepository); + + panel1.Controls.Add(_browser1); + panel2.Controls.Add(_browser2); } private void button_refresh_Click(object sender, System.EventArgs e) { - Browser1.ExecuteScriptAsync("location.reload()"); - Browser2.ExecuteScriptAsync("location.reload()"); - VRCXVR.Refresh(); + _browser1.ExecuteScriptAsync("location.reload()"); + _browser2.ExecuteScriptAsync("location.reload()"); + VRCXVR.Instance.Refresh(); } private void button_devtools_Click(object sender, System.EventArgs e) { - Browser1.ShowDevTools(); - Browser2.ShowDevTools(); + _browser1.ShowDevTools(); + _browser2.ShowDevTools(); } } } diff --git a/WebApi.cs b/WebApi.cs index 1b52611f..b036c606 100644 --- a/WebApi.cs +++ b/WebApi.cs @@ -140,6 +140,7 @@ namespace VRCX } catch (Exception e) { + // FIXME: 브라우저는 종료되었는데 얘는 이후에 실행되면 터짐 callback.ExecuteAsync(e.Message, null); }