private static EVROverlayError ProcessDashboard(CVROverlay overlay, ref ulong dashboardHandle, bool dashboardVisible) { var err = EVROverlayError.None; if (dashboardHandle == 0) { err = overlay.FindOverlay("VRCX", ref dashboardHandle); if (err != EVROverlayError.None) { if (err != EVROverlayError.UnknownOverlay) { return(err); } ulong handle = 0; err = overlay.CreateDashboardOverlay("VRCX", "VRCX", ref dashboardHandle, ref handle); if (err != EVROverlayError.None) { return(err); } err = overlay.SetOverlayWidthInMeters(dashboardHandle, 1.5f); if (err != EVROverlayError.None) { return(err); } err = overlay.SetOverlayInputMethod(dashboardHandle, VROverlayInputMethod.Mouse); if (err != EVROverlayError.None) { return(err); } } } var e = new VREvent_t(); while (overlay.PollNextOverlayEvent(dashboardHandle, ref e, (uint)Marshal.SizeOf(e))) { var type = (EVREventType)e.eventType; 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); } 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); } 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); } } if (dashboardVisible) { var texture = new Texture_t { handle = m_Texture1.NativePointer }; err = overlay.SetOverlayTexture(dashboardHandle, ref texture); if (err != EVROverlayError.None) { return(err); } } return(err); }
void Start() { var openVRError = EVRInitError.None; var overlayError = EVROverlayError.None; //OpenVRの初期化 openvr = OpenVR.Init(ref openVRError, EVRApplicationType.VRApplication_Overlay); if (openVRError != EVRInitError.None) { Debug.LogError(Tag + "OpenVRの初期化に失敗." + openVRError.ToString()); error = true; return; } //オーバーレイ機能の初期化 overlay = OpenVR.Overlay; overlayError = overlay.CreateDashboardOverlay(OverlayKeyName, OverlayFriendlyName, ref overlayHandle, ref thumbnailHandle); if (overlayError != EVROverlayError.None) { Debug.LogError(Tag + "Overlayの初期化に失敗. " + overlayError.ToString()); error = true; return; } //マウス(Dashboardのときのみ有効) overlay.SetOverlayInputMethod(overlayHandle, VROverlayInputMethod.Mouse); //オーバーレイに渡すテクスチャ種類の設定 OverlayTextureBounds = new VRTextureBounds_t(); var isOpenGL = SystemInfo.graphicsDeviceVersion.Contains("OpenGL"); if (isOpenGL) { //pGLuintTexture overlayTexture.eType = ETextureType.OpenGL; thumbnailTexture.eType = ETextureType.OpenGL; //上下反転しない OverlayTextureBounds.uMin = 1; OverlayTextureBounds.vMin = 0; OverlayTextureBounds.uMax = 1; OverlayTextureBounds.vMax = 0; overlay.SetOverlayTextureBounds(thumbnailHandle, ref OverlayTextureBounds); } else { //pTexture overlayTexture.eType = ETextureType.DirectX; thumbnailTexture.eType = ETextureType.DirectX; //上下反転する OverlayTextureBounds.uMin = 0; OverlayTextureBounds.vMin = 1; OverlayTextureBounds.uMax = 1; OverlayTextureBounds.vMax = 0; overlay.SetOverlayTextureBounds(overlayHandle, ref OverlayTextureBounds); } //サムネイルテクスチャが存在するなら if (thumbnailTextureInput != null) { //サムネイルテクスチャの情報を取得 var thumWidth = thumbnailTextureInput.width; var thumHeight = thumbnailTextureInput.height; //作業用テクスチャの領域を確保 thumbnailTexture2D = new Texture2D(thumWidth, thumHeight, TextureFormat.RGBA32, false); //力技でコピーして圧縮を解除 if (isOpenGL) { for (int y = 0; y < thumHeight; y++) { for (int x = 0; x < thumWidth; x++) { thumbnailTexture2D.SetPixel(x, y, thumbnailTextureInput.GetPixel(x, y)); } } } else { //DirectXは上下反転 for (int y = 0; y < thumHeight; y++) { for (int x = 0; x < thumWidth; x++) { thumbnailTexture2D.SetPixel(x, thumHeight - y - 1, thumbnailTextureInput.GetPixel(x, y)); } } } //操作を反映 thumbnailTexture2D.Apply(); //ネイティブテクスチャを取得して設定 thumbnailTexture.handle = thumbnailTexture2D.GetNativeTexturePtr(); //サムネイル利用可能フラグを立てる thumbnailAvailable = true; } Debug.Log(Tag + "初期化完了しました"); }