OVR_PUBLIC_FUNCTION(ovrResult) ovr_Create(ovrSession* pSession, ovrGraphicsLuid* pLuid) { // Initialize the opaque pointer with our own OpenVR-specific struct ovrSession session = new struct ovrHmdStruct(); memset(session->ColorTexture, 0, sizeof(ovrHmdStruct::ColorTexture)); session->ThumbStick[ovrHand_Left] = true; // Get the compositor interface session->compositor = (vr::IVRCompositor*)VR_GetGenericInterface(vr::IVRCompositor_Version, &g_InitError); if (g_InitError != vr::VRInitError_None) return REV_InitErrorToOvrError(g_InitError); session->compositor->SetTrackingSpace(vr::TrackingUniverseSeated); // Get the settings interface session->settings = (vr::IVRSettings*)VR_GetGenericInterface(vr::IVRSettings_Version, &g_InitError); if (g_InitError != vr::VRInitError_None) return REV_InitErrorToOvrError(g_InitError); // Get the overlay interface session->overlay = (vr::IVROverlay*)VR_GetGenericInterface(vr::IVROverlay_Version, &g_InitError); if (g_InitError != vr::VRInitError_None) return REV_InitErrorToOvrError(g_InitError); // Apply settings session->ThumbStickRange = session->settings->GetFloat(REV_SETTINGS_SECTION, "ThumbStickRange", 0.8f); // Get the LUID for the adapter int32_t index; g_VRSystem->GetDXGIOutputInfo(&index); if (index == -1) index = 0; // Create the DXGI factory IDXGIFactory* pFactory; HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&pFactory)); if (FAILED(hr)) return ovrError_IncompatibleGPU; IDXGIAdapter* pAdapter; hr = pFactory->EnumAdapters(index, &pAdapter); if (FAILED(hr)) return ovrError_MismatchedAdapters; DXGI_ADAPTER_DESC desc; hr = pAdapter->GetDesc(&desc); if (FAILED(hr)) return ovrError_MismatchedAdapters; // Copy the LUID into the structure memcpy(pLuid, &desc.AdapterLuid, sizeof(LUID)); // Cleanup and return pFactory->Release(); pAdapter->Release(); *pSession = session; return ovrSuccess; }
OVR_PUBLIC_FUNCTION(ovrResult) ovr_Initialize(const ovrInitParams* params) { MH_QueueDisableHook(LoadLibraryW); MH_QueueDisableHook(OpenEventW); MH_ApplyQueued(); g_hXInputLib = LoadLibraryW(L"xinput1_3.dll"); if (!g_hXInputLib) return ovrError_LibLoad; g_pXInputGetState = (_XInputGetState)GetProcAddress(g_hXInputLib, "XInputGetState"); if (!g_pXInputGetState) return ovrError_LibLoad; g_pXInputSetState = (_XInputSetState)GetProcAddress(g_hXInputLib, "XInputSetState"); if (!g_pXInputSetState) return ovrError_LibLoad; g_VRSystem = vr::VR_Init(&g_InitError, vr::VRApplication_Scene); MH_QueueEnableHook(LoadLibraryW); MH_QueueEnableHook(OpenEventW); MH_ApplyQueued(); return REV_InitErrorToOvrError(g_InitError); }
OVR_PUBLIC_FUNCTION(void) ovr_GetLastErrorInfo(ovrErrorInfo* errorInfo) { if (!errorInfo) return; const char* error = VR_GetVRInitErrorAsEnglishDescription(g_InitError); strncpy_s(errorInfo->ErrorString, error, sizeof(ovrErrorInfo::ErrorString)); errorInfo->Result = REV_InitErrorToOvrError(g_InitError); }
OVR_PUBLIC_FUNCTION(ovrResult) ovr_Initialize(const ovrInitParams* params) { MH_QueueDisableHook(LoadLibraryW); MH_QueueDisableHook(OpenEventW); MH_ApplyQueued(); g_VRSystem = vr::VR_Init(&g_InitError, vr::VRApplication_Scene); MH_QueueEnableHook(LoadLibraryW); MH_QueueEnableHook(OpenEventW); MH_ApplyQueued(); return REV_InitErrorToOvrError(g_InitError); }