2016-11-19 09:28:01 +00:00
|
|
|
#include "headset/headset.h"
|
2019-12-10 21:01:28 +00:00
|
|
|
#include "core/util.h"
|
2016-08-11 04:17:14 +00:00
|
|
|
|
2018-04-28 23:59:53 +00:00
|
|
|
HeadsetInterface* lovrHeadsetDriver = NULL;
|
2019-03-20 00:21:16 +00:00
|
|
|
HeadsetInterface* lovrHeadsetTrackingDrivers = NULL;
|
2018-02-23 09:28:42 +00:00
|
|
|
static bool initialized = false;
|
2017-10-20 20:32:46 +00:00
|
|
|
|
2019-08-01 00:51:49 +00:00
|
|
|
bool lovrHeadsetInit(HeadsetDriver* drivers, size_t count, float offset, uint32_t msaa) {
|
2018-11-19 16:08:56 +00:00
|
|
|
if (initialized) return false;
|
2018-02-23 09:28:42 +00:00
|
|
|
initialized = true;
|
|
|
|
|
2019-03-20 00:21:16 +00:00
|
|
|
HeadsetInterface* lastTrackingDriver = NULL;
|
|
|
|
|
2019-08-01 00:51:49 +00:00
|
|
|
for (size_t i = 0; i < count; i++) {
|
2017-11-25 21:01:56 +00:00
|
|
|
HeadsetInterface* interface = NULL;
|
|
|
|
|
|
|
|
switch (drivers[i]) {
|
2019-03-07 07:02:03 +00:00
|
|
|
#ifdef LOVR_USE_DESKTOP_HEADSET
|
|
|
|
case DRIVER_DESKTOP: interface = &lovrHeadsetDesktopDriver; break;
|
2018-09-19 07:03:04 +00:00
|
|
|
#endif
|
2019-04-30 04:54:19 +00:00
|
|
|
#ifdef LOVR_USE_LEAP
|
2019-04-09 19:38:55 +00:00
|
|
|
case DRIVER_LEAP_MOTION: interface = &lovrHeadsetLeapMotionDriver; break;
|
|
|
|
#endif
|
2018-09-19 07:03:04 +00:00
|
|
|
#ifdef LOVR_USE_OCULUS
|
2018-09-09 17:58:20 +00:00
|
|
|
case DRIVER_OCULUS: interface = &lovrHeadsetOculusDriver; break;
|
2018-09-11 22:47:03 +00:00
|
|
|
#endif
|
2018-10-25 03:40:11 +00:00
|
|
|
#ifdef LOVR_USE_OCULUS_MOBILE
|
|
|
|
case DRIVER_OCULUS_MOBILE: interface = &lovrHeadsetOculusMobileDriver; break;
|
|
|
|
#endif
|
2018-09-19 07:03:04 +00:00
|
|
|
#ifdef LOVR_USE_OPENVR
|
2017-11-25 21:01:56 +00:00
|
|
|
case DRIVER_OPENVR: interface = &lovrHeadsetOpenVRDriver; break;
|
2018-09-19 07:03:04 +00:00
|
|
|
#endif
|
2019-08-04 02:06:46 +00:00
|
|
|
#ifdef LOVR_USE_OPENXR
|
|
|
|
case DRIVER_OPENXR: interface = &lovrHeadsetOpenXRDriver; break;
|
|
|
|
#endif
|
2018-09-19 07:03:04 +00:00
|
|
|
#ifdef LOVR_USE_WEBVR
|
2017-11-25 21:01:56 +00:00
|
|
|
case DRIVER_WEBVR: interface = &lovrHeadsetWebVRDriver; break;
|
2017-10-21 09:52:07 +00:00
|
|
|
#endif
|
2019-03-20 00:21:16 +00:00
|
|
|
default: continue;
|
2017-11-25 21:01:56 +00:00
|
|
|
}
|
|
|
|
|
2019-03-20 00:21:16 +00:00
|
|
|
bool hasDisplay = interface->renderTo != NULL;
|
|
|
|
bool shouldInitialize = !hasDisplay || !lovrHeadsetDriver;
|
|
|
|
|
|
|
|
if (shouldInitialize && interface->init(offset, msaa)) {
|
|
|
|
if (hasDisplay) {
|
|
|
|
lovrHeadsetDriver = interface;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lastTrackingDriver) {
|
|
|
|
lastTrackingDriver->next = interface;
|
|
|
|
} else {
|
|
|
|
lovrHeadsetTrackingDrivers = interface;
|
|
|
|
}
|
|
|
|
|
|
|
|
lastTrackingDriver = interface;
|
2017-10-20 20:32:46 +00:00
|
|
|
}
|
|
|
|
}
|
2018-04-28 23:59:53 +00:00
|
|
|
|
2019-03-20 00:21:16 +00:00
|
|
|
lovrAssert(lovrHeadsetDriver, "No headset display driver available, check t.headset.drivers in conf.lua");
|
2018-11-19 16:08:56 +00:00
|
|
|
return true;
|
2017-10-20 20:32:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void lovrHeadsetDestroy() {
|
2018-02-23 09:28:42 +00:00
|
|
|
if (!initialized) return;
|
|
|
|
initialized = false;
|
|
|
|
|
2019-03-20 00:21:16 +00:00
|
|
|
HeadsetInterface* driver = lovrHeadsetTrackingDrivers;
|
|
|
|
while (driver) {
|
|
|
|
if (driver != lovrHeadsetDriver) {
|
|
|
|
driver->destroy();
|
|
|
|
}
|
|
|
|
HeadsetInterface* next = driver->next;
|
|
|
|
driver->next = NULL;
|
|
|
|
driver = next;
|
|
|
|
}
|
|
|
|
|
2018-04-28 23:59:53 +00:00
|
|
|
if (lovrHeadsetDriver) {
|
|
|
|
lovrHeadsetDriver->destroy();
|
|
|
|
lovrHeadsetDriver = NULL;
|
2017-10-20 20:32:46 +00:00
|
|
|
}
|
|
|
|
}
|