lovr/src/modules/headset/headset.c

83 lines
2.2 KiB
C
Raw Normal View History

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;
HeadsetInterface* lovrHeadsetTrackingDrivers = NULL;
2018-02-23 09:28:42 +00:00
static bool initialized = false;
2019-08-01 00:51:49 +00:00
bool lovrHeadsetInit(HeadsetDriver* drivers, size_t count, float offset, uint32_t msaa) {
if (initialized) return false;
2018-02-23 09:28:42 +00:00
initialized = true;
HeadsetInterface* lastTrackingDriver = NULL;
2019-08-01 00:51:49 +00:00
for (size_t i = 0; i < count; i++) {
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;
#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
#ifdef LOVR_USE_OCULUS
case DRIVER_OCULUS: interface = &lovrHeadsetOculusDriver; break;
2018-09-11 22:47:03 +00:00
#endif
#ifdef LOVR_USE_OCULUS_MOBILE
case DRIVER_OCULUS_MOBILE: interface = &lovrHeadsetOculusMobileDriver; break;
#endif
#ifdef LOVR_USE_OPENVR
case DRIVER_OPENVR: interface = &lovrHeadsetOpenVRDriver; break;
#endif
#ifdef LOVR_USE_OPENXR
case DRIVER_OPENXR: interface = &lovrHeadsetOpenXRDriver; break;
#endif
#ifdef LOVR_USE_WEBVR
case DRIVER_WEBVR: interface = &lovrHeadsetWebVRDriver; break;
#endif
default: continue;
}
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;
}
}
2018-04-28 23:59:53 +00:00
lovrAssert(lovrHeadsetDriver, "No headset display driver available, check t.headset.drivers in conf.lua");
return true;
}
void lovrHeadsetDestroy() {
2018-02-23 09:28:42 +00:00
if (!initialized) return;
initialized = false;
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;
}
}