2017-04-13 03:53:35 +02:00
|
|
|
#include "Session.h"
|
2017-04-13 03:48:18 +02:00
|
|
|
#include "CompositorBase.h"
|
|
|
|
|
#include "SessionDetails.h"
|
|
|
|
|
#include "InputManager.h"
|
2017-08-18 14:58:29 +02:00
|
|
|
#include "SettingsManager.h"
|
2017-04-13 03:48:18 +02:00
|
|
|
#include "Settings.h"
|
2016-09-24 13:22:26 +02:00
|
|
|
|
2017-12-08 15:48:10 +01:00
|
|
|
#define SESSION_RELOAD_EVENT_NAME L"ReviveReloadSettings"
|
|
|
|
|
|
2017-08-23 22:54:28 +02:00
|
|
|
void SessionThreadFunc(ovrSession session)
|
|
|
|
|
{
|
|
|
|
|
std::chrono::microseconds freq(std::chrono::milliseconds(10));
|
2017-08-24 21:09:20 +02:00
|
|
|
DWORD procId = GetCurrentProcessId();
|
2017-12-08 15:48:10 +01:00
|
|
|
HANDLE reload = OpenEventW(SYNCHRONIZE, FALSE, SESSION_RELOAD_EVENT_NAME);
|
2017-08-23 22:54:28 +02:00
|
|
|
|
|
|
|
|
while (session->Running)
|
|
|
|
|
{
|
|
|
|
|
vr::VREvent_t vrEvent;
|
|
|
|
|
while (vr::VRSystem()->PollNextEvent(&vrEvent, sizeof(vrEvent)))
|
|
|
|
|
{
|
|
|
|
|
switch (vrEvent.eventType)
|
|
|
|
|
{
|
|
|
|
|
case vr::VREvent_TrackedDeviceActivated:
|
|
|
|
|
case vr::VREvent_TrackedDeviceDeactivated:
|
|
|
|
|
{
|
|
|
|
|
vr::ETrackedDeviceClass deviceClass = vr::VRSystem()->GetTrackedDeviceClass(vrEvent.trackedDeviceIndex);
|
|
|
|
|
if (deviceClass == vr::TrackedDeviceClass_Controller)
|
|
|
|
|
session->Input->UpdateConnectedControllers();
|
|
|
|
|
else if (deviceClass == vr::TrackedDeviceClass_HMD)
|
|
|
|
|
session->Details->UpdateHmdDesc();
|
|
|
|
|
else if (deviceClass == vr::TrackedDeviceClass_TrackingReference)
|
|
|
|
|
session->Details->UpdateTrackerDesc();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-08-28 15:44:39 +02:00
|
|
|
case vr::VREvent_TrackedDeviceRoleChanged:
|
|
|
|
|
session->Input->UpdateConnectedControllers();
|
|
|
|
|
break;
|
2017-08-24 21:09:20 +02:00
|
|
|
case vr::VREvent_SceneApplicationChanged:
|
|
|
|
|
{
|
|
|
|
|
SessionStatusBits status = session->SessionStatus;
|
|
|
|
|
status.IsVisible = vrEvent.data.process.pid == procId;
|
|
|
|
|
session->SessionStatus = status;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case vr::VREvent_Quit:
|
|
|
|
|
{
|
|
|
|
|
SessionStatusBits status = session->SessionStatus;
|
|
|
|
|
status.ShouldQuit = true;
|
|
|
|
|
session->SessionStatus = status;
|
|
|
|
|
vr::VRSystem()->AcknowledgeQuit_Exiting();
|
2017-08-23 22:54:28 +02:00
|
|
|
}
|
2017-08-24 21:09:20 +02:00
|
|
|
break;
|
|
|
|
|
case vr::VREvent_TrackedDeviceUserInteractionStarted:
|
|
|
|
|
case vr::VREvent_TrackedDeviceUserInteractionEnded:
|
|
|
|
|
if (vrEvent.trackedDeviceIndex == vr::k_unTrackedDeviceIndex_Hmd)
|
|
|
|
|
{
|
|
|
|
|
SessionStatusBits status = session->SessionStatus;
|
2017-12-07 03:57:00 +01:00
|
|
|
status.HmdMounted = vrEvent.eventType == vr::VREvent_TrackedDeviceUserInteractionStarted;
|
2017-08-24 21:09:20 +02:00
|
|
|
session->SessionStatus = status;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-12-06 17:53:51 +01:00
|
|
|
case vr::VREvent_InputFocusCaptured:
|
|
|
|
|
case vr::VREvent_InputFocusReleased:
|
2017-12-02 14:11:40 -08:00
|
|
|
{
|
|
|
|
|
SessionStatusBits status = session->SessionStatus;
|
2017-12-06 17:53:51 +01:00
|
|
|
status.HasInputFocus = vrEvent.eventType == vr::VREvent_InputFocusReleased;
|
2017-12-02 14:11:40 -08:00
|
|
|
session->SessionStatus = status;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case vr::VREvent_DashboardActivated:
|
|
|
|
|
case vr::VREvent_DashboardDeactivated:
|
|
|
|
|
{
|
|
|
|
|
SessionStatusBits status = session->SessionStatus;
|
|
|
|
|
status.OverlayPresent = vrEvent.eventType == vr::VREvent_DashboardActivated;
|
|
|
|
|
session->SessionStatus = status;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-08-24 21:09:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
OutputDebugStringA(vr::VRSystem()->GetEventTypeNameFromEnum((vr::EVREventType)vrEvent.eventType));
|
|
|
|
|
OutputDebugStringA("\n");
|
|
|
|
|
#endif
|
2017-08-23 22:54:28 +02:00
|
|
|
}
|
|
|
|
|
|
2017-12-08 15:48:10 +01:00
|
|
|
if (reload && WaitForSingleObject(reload, 0) == WAIT_OBJECT_0)
|
|
|
|
|
{
|
|
|
|
|
session->Settings->ReloadSettings();
|
2017-12-14 18:37:35 +01:00
|
|
|
|
|
|
|
|
std::string script = session->Settings->GetInputScript();
|
|
|
|
|
session->Input->LoadInputScript(script.c_str());
|
2017-12-08 15:48:10 +01:00
|
|
|
}
|
|
|
|
|
|
2017-08-23 22:54:28 +02:00
|
|
|
std::this_thread::sleep_for(freq);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-24 13:22:26 +02:00
|
|
|
ovrHmdStruct::ovrHmdStruct()
|
2017-08-23 22:54:28 +02:00
|
|
|
: Running(true)
|
2017-08-24 21:09:20 +02:00
|
|
|
, SessionStatus()
|
2017-10-25 22:15:46 +02:00
|
|
|
, StringBuffer()
|
2016-09-24 13:22:26 +02:00
|
|
|
, FrameIndex(0)
|
2016-09-25 15:05:20 +02:00
|
|
|
, StatsIndex(0)
|
2017-10-25 22:15:46 +02:00
|
|
|
, BaseStats()
|
2016-09-24 13:22:26 +02:00
|
|
|
, Compositor(nullptr)
|
|
|
|
|
, Input(new InputManager())
|
2017-02-15 17:22:48 +01:00
|
|
|
, Details(new SessionDetails())
|
2017-08-18 14:58:29 +02:00
|
|
|
, Settings(new SettingsManager())
|
2016-09-24 13:22:26 +02:00
|
|
|
{
|
2017-08-20 15:38:07 +02:00
|
|
|
// Get the default universe origin from the settings
|
2017-12-08 02:36:31 +01:00
|
|
|
TrackingOrigin = (vr::ETrackingUniverseOrigin)Settings->Get<int>(REV_KEY_DEFAULT_ORIGIN, REV_DEFAULT_ORIGIN);
|
2017-08-23 22:54:28 +02:00
|
|
|
|
2017-08-24 21:09:20 +02:00
|
|
|
SessionStatusBits status = {};
|
|
|
|
|
status.HmdPresent = vr::VR_IsHmdPresent();
|
2017-12-06 15:32:49 +01:00
|
|
|
vr::EDeviceActivityLevel activity = vr::VRSystem()->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
|
2017-12-07 03:57:00 +01:00
|
|
|
status.HmdMounted = activity != vr::k_EDeviceActivityLevel_Idle;
|
2017-12-06 15:32:49 +01:00
|
|
|
status.HasInputFocus = !vr::VRSystem()->IsInputFocusCapturedByAnotherProcess();
|
|
|
|
|
status.OverlayPresent = vr::VROverlay()->IsDashboardVisible();
|
2017-08-24 21:09:20 +02:00
|
|
|
SessionStatus = status;
|
|
|
|
|
|
2017-12-14 18:37:35 +01:00
|
|
|
std::string script = Settings->GetInputScript();
|
|
|
|
|
Input->LoadInputScript(script.c_str());
|
|
|
|
|
|
2017-08-23 22:54:28 +02:00
|
|
|
SessionThread = std::thread(SessionThreadFunc, this);
|
2016-09-24 13:22:26 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-18 14:58:29 +02:00
|
|
|
ovrHmdStruct::~ovrHmdStruct()
|
2016-12-22 22:12:48 +01:00
|
|
|
{
|
2017-08-23 22:54:28 +02:00
|
|
|
Running = false;
|
|
|
|
|
if (SessionThread.joinable())
|
|
|
|
|
SessionThread.join();
|
2016-12-22 22:12:48 +01:00
|
|
|
}
|