2016-11-19 09:28:01 +00:00
|
|
|
#include "headset/headset.h"
|
2022-03-22 07:13:21 +00:00
|
|
|
#include "util.h"
|
2016-08-11 04:17:14 +00:00
|
|
|
|
2020-09-28 00:13:00 +00:00
|
|
|
HeadsetInterface* lovrHeadsetDisplayDriver = 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
|
|
|
|
2020-11-18 00:38:27 +00:00
|
|
|
bool lovrHeadsetInit(HeadsetDriver* drivers, size_t count, float supersample, float offset, uint32_t msaa, bool overlay) {
|
2018-11-19 16:08:56 +00:00
|
|
|
if (initialized) return false;
|
2018-02-23 09:28:42 +00:00
|
|
|
initialized = true;
|
|
|
|
|
2020-08-22 19:42:52 +00:00
|
|
|
HeadsetInterface** trackingDrivers = &lovrHeadsetTrackingDrivers;
|
2019-03-20 00:21:16 +00:00
|
|
|
|
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]) {
|
2021-04-07 14:55:44 +00:00
|
|
|
#ifdef LOVR_USE_DESKTOP
|
2019-03-07 07:02:03 +00:00
|
|
|
case DRIVER_DESKTOP: interface = &lovrHeadsetDesktopDriver; 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
|
2020-03-05 06:47:24 +00:00
|
|
|
#ifdef LOVR_USE_WEBXR
|
|
|
|
case DRIVER_WEBXR: interface = &lovrHeadsetWebXRDriver; break;
|
|
|
|
#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;
|
2020-09-28 00:13:00 +00:00
|
|
|
bool shouldInitialize = !hasDisplay || !lovrHeadsetDisplayDriver;
|
2019-03-20 00:21:16 +00:00
|
|
|
|
2020-11-18 00:38:27 +00:00
|
|
|
if (shouldInitialize && interface->init(supersample, offset, msaa, overlay)) {
|
2019-03-20 00:21:16 +00:00
|
|
|
if (hasDisplay) {
|
2020-09-28 00:13:00 +00:00
|
|
|
lovrHeadsetDisplayDriver = interface;
|
2019-03-20 00:21:16 +00:00
|
|
|
}
|
|
|
|
|
2020-08-22 19:42:52 +00:00
|
|
|
*trackingDrivers = interface;
|
|
|
|
trackingDrivers = &interface->next;
|
2017-10-20 20:32:46 +00:00
|
|
|
}
|
|
|
|
}
|
2018-04-28 23:59:53 +00:00
|
|
|
|
2020-09-28 00:13:00 +00:00
|
|
|
lovrAssert(lovrHeadsetDisplayDriver, "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) {
|
2020-09-28 00:13:00 +00:00
|
|
|
if (driver != lovrHeadsetDisplayDriver) {
|
2019-03-20 00:21:16 +00:00
|
|
|
driver->destroy();
|
|
|
|
}
|
|
|
|
HeadsetInterface* next = driver->next;
|
|
|
|
driver->next = NULL;
|
|
|
|
driver = next;
|
|
|
|
}
|
|
|
|
|
2020-09-28 00:13:00 +00:00
|
|
|
if (lovrHeadsetDisplayDriver) {
|
|
|
|
lovrHeadsetDisplayDriver->destroy();
|
|
|
|
lovrHeadsetDisplayDriver = NULL;
|
2017-10-20 20:32:46 +00:00
|
|
|
}
|
|
|
|
}
|