mirror of https://github.com/bjornbytes/lovr.git
commit
68c1b6a201
|
@ -30,19 +30,15 @@ const char* HeadsetOrigins[] = {
|
||||||
|
|
||||||
const char* Devices[] = {
|
const char* Devices[] = {
|
||||||
[DEVICE_HEAD] = "head",
|
[DEVICE_HEAD] = "head",
|
||||||
[DEVICE_HAND] = "hand",
|
|
||||||
[DEVICE_HAND_LEFT] = "hand/left",
|
[DEVICE_HAND_LEFT] = "hand/left",
|
||||||
[DEVICE_HAND_RIGHT] = "hand/right",
|
[DEVICE_HAND_RIGHT] = "hand/right",
|
||||||
[DEVICE_EYE_LEFT] = "eye/left",
|
[DEVICE_EYE_LEFT] = "eye/left",
|
||||||
[DEVICE_EYE_RIGHT] = "eye/right",
|
[DEVICE_EYE_RIGHT] = "eye/right",
|
||||||
[DEVICE_TRACKER_1] = "tracker/1",
|
|
||||||
[DEVICE_TRACKER_2] = "tracker/2",
|
|
||||||
[DEVICE_TRACKER_3] = "tracker/3",
|
|
||||||
[DEVICE_TRACKER_4] = "tracker/4",
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* DeviceButtons[] = {
|
const char* DeviceButtons[] = {
|
||||||
|
[BUTTON_PRIMARY] = "primary",
|
||||||
[BUTTON_TRIGGER] = "trigger",
|
[BUTTON_TRIGGER] = "trigger",
|
||||||
[BUTTON_THUMBSTICK] = "thumbstick",
|
[BUTTON_THUMBSTICK] = "thumbstick",
|
||||||
[BUTTON_TOUCHPAD] = "touchpad",
|
[BUTTON_TOUCHPAD] = "touchpad",
|
||||||
|
@ -57,6 +53,7 @@ const char* DeviceButtons[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* DeviceAxes[] = {
|
const char* DeviceAxes[] = {
|
||||||
|
[AXIS_PRIMARY] = "primary",
|
||||||
[AXIS_TRIGGER] = "trigger",
|
[AXIS_TRIGGER] = "trigger",
|
||||||
[AXIS_THUMBSTICK] = "thumbstick",
|
[AXIS_THUMBSTICK] = "thumbstick",
|
||||||
[AXIS_TOUCHPAD] = "touchpad",
|
[AXIS_TOUCHPAD] = "touchpad",
|
||||||
|
@ -427,6 +424,7 @@ int l_lovrHeadsetGetAxis(lua_State* L) {
|
||||||
case AXIS_GRIP:
|
case AXIS_GRIP:
|
||||||
lua_pushnumber(L, value[0]);
|
lua_pushnumber(L, value[0]);
|
||||||
return 1;
|
return 1;
|
||||||
|
case AXIS_PRIMARY:
|
||||||
case AXIS_THUMBSTICK:
|
case AXIS_THUMBSTICK:
|
||||||
case AXIS_TOUCHPAD:
|
case AXIS_TOUCHPAD:
|
||||||
lua_pushnumber(L, value[0]);
|
lua_pushnumber(L, value[0]);
|
||||||
|
@ -519,16 +517,38 @@ static int l_lovrHeadsetGetMirrorTexture(lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int deviceIterator(lua_State* L) {
|
static int l_lovrHeadsetGetHands(lua_State* L) {
|
||||||
|
if (lua_istable(L, 1)) {
|
||||||
|
lua_settop(L, 1);
|
||||||
|
} else {
|
||||||
|
lua_newtable(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
float position[3], orientation[4];
|
||||||
|
Device hands[] = { DEVICE_HAND_LEFT, DEVICE_HAND_RIGHT };
|
||||||
|
for (size_t i = 0; i < sizeof(hands) / sizeof(hands[0]); i++) {
|
||||||
|
FOREACH_TRACKING_DRIVER(driver) {
|
||||||
|
if (driver->getPose(hands[i], position, orientation)) {
|
||||||
|
lua_pushstring(L, Devices[hands[i]]);
|
||||||
|
lua_rawseti(L, -2, ++count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lua_pushnil(L);
|
||||||
|
lua_rawseti(L, -2, ++count);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int handIterator(lua_State* L) {
|
||||||
|
Device hands[] = { DEVICE_HAND_LEFT, DEVICE_HAND_RIGHT };
|
||||||
size_t index = lua_tointeger(L, lua_upvalueindex(1));
|
size_t index = lua_tointeger(L, lua_upvalueindex(1));
|
||||||
Device* devices = (Device*) lua_touserdata(L, lua_upvalueindex(2));
|
|
||||||
size_t count = lua_tointeger(L, lua_upvalueindex(3));
|
|
||||||
float position[3], orientation[4];
|
float position[3], orientation[4];
|
||||||
|
|
||||||
while (index < count) {
|
while (index < 2) {
|
||||||
FOREACH_TRACKING_DRIVER(driver) {
|
FOREACH_TRACKING_DRIVER(driver) {
|
||||||
if (driver->getPose(devices[index], position, orientation)) {
|
if (driver->getPose(hands[index], position, orientation)) {
|
||||||
lua_pushstring(L, Devices[devices[index]]);
|
lua_pushstring(L, Devices[hands[index]]);
|
||||||
lua_pushinteger(L, ++index);
|
lua_pushinteger(L, ++index);
|
||||||
lua_replace(L, lua_upvalueindex(1));
|
lua_replace(L, lua_upvalueindex(1));
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -540,32 +560,9 @@ static int deviceIterator(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Device hands[] = {
|
|
||||||
DEVICE_HAND,
|
|
||||||
DEVICE_HAND_LEFT,
|
|
||||||
DEVICE_HAND_RIGHT
|
|
||||||
};
|
|
||||||
|
|
||||||
static Device trackers[] = {
|
|
||||||
DEVICE_TRACKER_1,
|
|
||||||
DEVICE_TRACKER_2,
|
|
||||||
DEVICE_TRACKER_3,
|
|
||||||
DEVICE_TRACKER_4
|
|
||||||
};
|
|
||||||
|
|
||||||
static int l_lovrHeadsetHands(lua_State* L) {
|
static int l_lovrHeadsetHands(lua_State* L) {
|
||||||
lua_pushinteger(L, 0);
|
lua_pushinteger(L, 0);
|
||||||
lua_pushlightuserdata(L, hands);
|
lua_pushcclosure(L, handIterator, 1);
|
||||||
lua_pushinteger(L, sizeof(hands) / sizeof(hands[0]));
|
|
||||||
lua_pushcclosure(L, deviceIterator, 3);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int l_lovrHeadsetTrackers(lua_State* L) {
|
|
||||||
lua_pushinteger(L, 0);
|
|
||||||
lua_pushlightuserdata(L, trackers);
|
|
||||||
lua_pushinteger(L, sizeof(trackers) / sizeof(trackers[0]));
|
|
||||||
lua_pushcclosure(L, deviceIterator, 3);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,8 +596,8 @@ static const luaL_Reg lovrHeadset[] = {
|
||||||
{ "renderTo", l_lovrHeadsetRenderTo },
|
{ "renderTo", l_lovrHeadsetRenderTo },
|
||||||
{ "update", l_lovrHeadsetUpdate },
|
{ "update", l_lovrHeadsetUpdate },
|
||||||
{ "getMirrorTexture", l_lovrHeadsetGetMirrorTexture },
|
{ "getMirrorTexture", l_lovrHeadsetGetMirrorTexture },
|
||||||
|
{ "getHands", l_lovrHeadsetGetHands },
|
||||||
{ "hands", l_lovrHeadsetHands },
|
{ "hands", l_lovrHeadsetHands },
|
||||||
{ "trackers", l_lovrHeadsetTrackers },
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -72,11 +72,11 @@ static const float* desktop_getBoundsGeometry(uint32_t* count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool desktop_getPose(Device device, vec3 position, quat orientation) {
|
static bool desktop_getPose(Device device, vec3 position, quat orientation) {
|
||||||
if (device != DEVICE_HEAD && device != DEVICE_HAND) {
|
if (device != DEVICE_HEAD && device != DEVICE_HAND_LEFT) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3_set(position, 0.f, 0.f, device == DEVICE_HAND ? -.75f : 0.f);
|
vec3_set(position, 0.f, 0.f, device == DEVICE_HAND_LEFT ? -.75f : 0.f);
|
||||||
mat4_transform(state.transform, position);
|
mat4_transform(state.transform, position);
|
||||||
quat_fromMat4(orientation, state.transform);
|
quat_fromMat4(orientation, state.transform);
|
||||||
return true;
|
return true;
|
||||||
|
@ -107,7 +107,7 @@ static bool desktop_getAcceleration(Device device, vec3 acceleration, vec3 angul
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool desktop_isDown(Device device, DeviceButton button, bool* down) {
|
static bool desktop_isDown(Device device, DeviceButton button, bool* down) {
|
||||||
if (device != DEVICE_HAND || button != BUTTON_TRIGGER) {
|
if (device != DEVICE_HAND_LEFT || (button != BUTTON_TRIGGER && button != BUTTON_PRIMARY)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,19 +24,15 @@ typedef enum {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DEVICE_HEAD,
|
DEVICE_HEAD,
|
||||||
DEVICE_HAND,
|
|
||||||
DEVICE_HAND_LEFT,
|
DEVICE_HAND_LEFT,
|
||||||
DEVICE_HAND_RIGHT,
|
DEVICE_HAND_RIGHT,
|
||||||
DEVICE_EYE_LEFT,
|
DEVICE_EYE_LEFT,
|
||||||
DEVICE_EYE_RIGHT,
|
DEVICE_EYE_RIGHT,
|
||||||
DEVICE_TRACKER_1,
|
|
||||||
DEVICE_TRACKER_2,
|
|
||||||
DEVICE_TRACKER_3,
|
|
||||||
DEVICE_TRACKER_4,
|
|
||||||
MAX_DEVICES
|
MAX_DEVICES
|
||||||
} Device;
|
} Device;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
BUTTON_PRIMARY,
|
||||||
BUTTON_TRIGGER,
|
BUTTON_TRIGGER,
|
||||||
BUTTON_THUMBSTICK,
|
BUTTON_THUMBSTICK,
|
||||||
BUTTON_TOUCHPAD,
|
BUTTON_TOUCHPAD,
|
||||||
|
@ -51,6 +47,7 @@ typedef enum {
|
||||||
} DeviceButton;
|
} DeviceButton;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
AXIS_PRIMARY,
|
||||||
AXIS_TRIGGER,
|
AXIS_TRIGGER,
|
||||||
AXIS_THUMBSTICK,
|
AXIS_THUMBSTICK,
|
||||||
AXIS_TOUCHPAD,
|
AXIS_TOUCHPAD,
|
||||||
|
|
|
@ -225,6 +225,7 @@ static bool oculus_isDown(Device device, DeviceButton button, bool* down) {
|
||||||
case BUTTON_X: return *down = (buttons & ovrButton_X), true;
|
case BUTTON_X: return *down = (buttons & ovrButton_X), true;
|
||||||
case BUTTON_Y: return *down = (buttons & ovrButton_Y), true;
|
case BUTTON_Y: return *down = (buttons & ovrButton_Y), true;
|
||||||
case BUTTON_MENU: return *down = (buttons & ovrButton_Enter), true;
|
case BUTTON_MENU: return *down = (buttons & ovrButton_Enter), true;
|
||||||
|
case BUTTON_PRIMARY:
|
||||||
case BUTTON_TRIGGER: return *down = (is->IndexTriggerNoDeadzone[hand] > .5f), true;
|
case BUTTON_TRIGGER: return *down = (is->IndexTriggerNoDeadzone[hand] > .5f), true;
|
||||||
case BUTTON_THUMBSTICK: return *down = (buttons & (ovrButton_LThumb | ovrButton_RThumb), true;
|
case BUTTON_THUMBSTICK: return *down = (buttons & (ovrButton_LThumb | ovrButton_RThumb), true;
|
||||||
case BUTTON_GRIP: return *down = (masks->HandTrigger[hand] > .9f), true;
|
case BUTTON_GRIP: return *down = (masks->HandTrigger[hand] > .9f), true;
|
||||||
|
@ -246,6 +247,7 @@ static bool oculus_isTouched(Device device, DeviceButton button, bool* touched)
|
||||||
case BUTTON_B: return *touched = (touches & ovrTouch_B), true;
|
case BUTTON_B: return *touched = (touches & ovrTouch_B), true;
|
||||||
case BUTTON_X: return *touched = (touches & ovrTouch_X), true;
|
case BUTTON_X: return *touched = (touches & ovrTouch_X), true;
|
||||||
case BUTTON_Y: return *touched = (touches & ovrTouch_Y), true;
|
case BUTTON_Y: return *touched = (touches & ovrTouch_Y), true;
|
||||||
|
case BUTTON_PRIMARY:
|
||||||
case BUTTON_TRIGGER: return *touched = (touches & (ovrTouch_LIndexTrigger | ovrTouch_RIndexTrigger)), true;
|
case BUTTON_TRIGGER: return *touched = (touches & (ovrTouch_LIndexTrigger | ovrTouch_RIndexTrigger)), true;
|
||||||
case BUTTON_THUMBSTICK: return *touched = (touches & (ovrTouch_LThumb | ovrTouch_RThumb)), true;
|
case BUTTON_THUMBSTICK: return *touched = (touches & (ovrTouch_LThumb | ovrTouch_RThumb)), true;
|
||||||
default: return false;
|
default: return false;
|
||||||
|
@ -263,6 +265,7 @@ static bool oculus_getAxis(Device device, DeviceAxis axis, vec3* value) {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case AXIS_GRIP: return *value = is->HandTriggerNoDeadzone[hand], true;
|
case AXIS_GRIP: return *value = is->HandTriggerNoDeadzone[hand], true;
|
||||||
case AXIS_TRIGGER: return *value = is->IndexTriggerNoDeadzone[hand], true;
|
case AXIS_TRIGGER: return *value = is->IndexTriggerNoDeadzone[hand], true;
|
||||||
|
case AXIS_PRIMARY:
|
||||||
case AXIS_THUMBSTICK:
|
case AXIS_THUMBSTICK:
|
||||||
value[0] = is->ThumbstickNoDeadzone[hand].x;
|
value[0] = is->ThumbstickNoDeadzone[hand].x;
|
||||||
value[1] = is->ThumbstickNoDeadzone[hand].y;
|
value[1] = is->ThumbstickNoDeadzone[hand].y;
|
||||||
|
|
|
@ -76,23 +76,14 @@ static const float* vrapi_getBoundsGeometry(uint32_t* count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getHandIdx(Device device) {
|
static int getHandIdx(Device device) {
|
||||||
switch (device) {
|
if (device == DEVICE_HAND_LEFT || device == DEVICE_HAND_RIGHT) {
|
||||||
case DEVICE_HAND:
|
for(int c = 0; c < BRIDGE_LOVR_CONTROLLERMAX && c < bridgeLovrMobileData.updateData.controllerCount; c++) {
|
||||||
if (bridgeLovrMobileData.deviceType != BRIDGE_LOVR_DEVICE_GO || bridgeLovrMobileData.updateData.controllerCount <= 0)
|
BridgeLovrHand hand = (device == DEVICE_HAND_LEFT ? BRIDGE_LOVR_HAND_LEFT : BRIDGE_LOVR_HAND_RIGHT);
|
||||||
return -1;
|
if (bridgeLovrMobileData.updateData.controllers[c].hand & hand)
|
||||||
return 0;
|
return c;
|
||||||
case DEVICE_HAND_LEFT:
|
}
|
||||||
case DEVICE_HAND_RIGHT:
|
|
||||||
if (bridgeLovrMobileData.deviceType == BRIDGE_LOVR_DEVICE_QUEST) {
|
|
||||||
for(int c = 0; c < BRIDGE_LOVR_CONTROLLERMAX && c < bridgeLovrMobileData.updateData.controllerCount; c++) {
|
|
||||||
BridgeLovrHand hand = (device == DEVICE_HAND_LEFT ? BRIDGE_LOVR_HAND_LEFT : BRIDGE_LOVR_HAND_RIGHT);
|
|
||||||
if (bridgeLovrMobileData.updateData.controllers[c].hand & hand)
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default: // FALLTHROUGH
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool vrapi_getPose(Device device, vec3 position, quat orientation) {
|
static bool vrapi_getPose(Device device, vec3 position, quat orientation) {
|
||||||
|
@ -148,6 +139,7 @@ static bool buttonDown(BridgeLovrButton field, DeviceButton button, bool *result
|
||||||
if (bridgeLovrMobileData.deviceType == BRIDGE_LOVR_DEVICE_QUEST) {
|
if (bridgeLovrMobileData.deviceType == BRIDGE_LOVR_DEVICE_QUEST) {
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case BUTTON_MENU: *result = field & BRIDGE_LOVR_BUTTON_MENU; break; // Technically "LMENU" but only fires on left controller
|
case BUTTON_MENU: *result = field & BRIDGE_LOVR_BUTTON_MENU; break; // Technically "LMENU" but only fires on left controller
|
||||||
|
case BUTTON_PRIMARY:
|
||||||
case BUTTON_TRIGGER: *result = field & BRIDGE_LOVR_BUTTON_SHOULDER; break;
|
case BUTTON_TRIGGER: *result = field & BRIDGE_LOVR_BUTTON_SHOULDER; break;
|
||||||
case BUTTON_GRIP: *result = field & BRIDGE_LOVR_BUTTON_GRIP; break;
|
case BUTTON_GRIP: *result = field & BRIDGE_LOVR_BUTTON_GRIP; break;
|
||||||
case BUTTON_TOUCHPAD: *result = field & BRIDGE_LOVR_BUTTON_JOYSTICK; break;
|
case BUTTON_TOUCHPAD: *result = field & BRIDGE_LOVR_BUTTON_JOYSTICK; break;
|
||||||
|
@ -160,6 +152,7 @@ static bool buttonDown(BridgeLovrButton field, DeviceButton button, bool *result
|
||||||
} else {
|
} else {
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case BUTTON_MENU: *result = field & BRIDGE_LOVR_BUTTON_GOMENU; break; // Technically "RMENU" but quest only has one
|
case BUTTON_MENU: *result = field & BRIDGE_LOVR_BUTTON_GOMENU; break; // Technically "RMENU" but quest only has one
|
||||||
|
case BUTTON_PRIMARY:
|
||||||
case BUTTON_TRIGGER: *result = field & BRIDGE_LOVR_BUTTON_GOSHOULDER; break;
|
case BUTTON_TRIGGER: *result = field & BRIDGE_LOVR_BUTTON_GOSHOULDER; break;
|
||||||
case BUTTON_TOUCHPAD: *result = field & BRIDGE_LOVR_BUTTON_TOUCHPAD; break;
|
case BUTTON_TOUCHPAD: *result = field & BRIDGE_LOVR_BUTTON_TOUCHPAD; break;
|
||||||
default: return false;
|
default: return false;
|
||||||
|
@ -174,6 +167,7 @@ static bool buttonTouch(BridgeLovrTouch field, DeviceButton button, bool *result
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (button) {
|
switch (button) {
|
||||||
|
case BUTTON_PRIMARY:
|
||||||
case BUTTON_TRIGGER: *result = field & (BRIDGE_LOVR_TOUCH_TRIGGER); break;
|
case BUTTON_TRIGGER: *result = field & (BRIDGE_LOVR_TOUCH_TRIGGER); break;
|
||||||
case BUTTON_TOUCHPAD: *result = field & (BRIDGE_LOVR_TOUCH_TOUCHPAD | BRIDGE_LOVR_TOUCH_JOYSTICK); break;
|
case BUTTON_TOUCHPAD: *result = field & (BRIDGE_LOVR_TOUCH_TOUCHPAD | BRIDGE_LOVR_TOUCH_JOYSTICK); break;
|
||||||
case BUTTON_A: *result = field & BRIDGE_LOVR_TOUCH_A; break;
|
case BUTTON_A: *result = field & BRIDGE_LOVR_TOUCH_A; break;
|
||||||
|
@ -207,9 +201,10 @@ static bool vrapi_getAxis(Device device, DeviceAxis axis, float* value) {
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BridgeLovrController *data = &bridgeLovrMobileData.updateData.controllers[idx];
|
BridgeLovrController *data = &bridgeLovrMobileData.updateData.controllers[idx];
|
||||||
|
|
||||||
if (bridgeLovrMobileData.deviceType == BRIDGE_LOVR_DEVICE_QUEST) {
|
if (bridgeLovrMobileData.deviceType == BRIDGE_LOVR_DEVICE_QUEST) {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
|
case AXIS_PRIMARY:
|
||||||
case AXIS_THUMBSTICK:
|
case AXIS_THUMBSTICK:
|
||||||
value[0] = data->trackpad.x;
|
value[0] = data->trackpad.x;
|
||||||
value[1] = data->trackpad.y;
|
value[1] = data->trackpad.y;
|
||||||
|
@ -220,6 +215,7 @@ static bool vrapi_getAxis(Device device, DeviceAxis axis, float* value) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
|
case AXIS_PRIMARY:
|
||||||
case AXIS_TOUCHPAD:
|
case AXIS_TOUCHPAD:
|
||||||
value[0] = (data->trackpad.x - 160) / 160.f;
|
value[0] = (data->trackpad.x - 160) / 160.f;
|
||||||
value[1] = (data->trackpad.y - 160) / 160.f;
|
value[1] = (data->trackpad.y - 160) / 160.f;
|
||||||
|
@ -447,8 +443,6 @@ void bridgeLovrUpdate(BridgeLovrUpdateData *updateData) {
|
||||||
// Unpack update data
|
// Unpack update data
|
||||||
bridgeLovrMobileData.updateData = *updateData;
|
bridgeLovrMobileData.updateData = *updateData;
|
||||||
|
|
||||||
// for(int c = 0; c < updateData->controllerCount; c++) lovrLog("%d: d %x t %x\n", c, (uint32_t)updateData->controllers[c].buttonDown, (uint32_t)updateData->controllers[c].buttonTouch);
|
|
||||||
|
|
||||||
if (pauseState == PAUSESTATE_BUG) { // Bad frame-- replace bad time with last known good oculus time
|
if (pauseState == PAUSESTATE_BUG) { // Bad frame-- replace bad time with last known good oculus time
|
||||||
bridgeLovrMobileData.updateData.displayTime = lastPauseAtRaw;
|
bridgeLovrMobileData.updateData.displayTime = lastPauseAtRaw;
|
||||||
pauseState = PAUSESTATE_RESUME;
|
pauseState = PAUSESTATE_RESUME;
|
||||||
|
|
|
@ -95,18 +95,8 @@ static struct {
|
||||||
static TrackedDeviceIndex_t getDeviceIndex(Device device) {
|
static TrackedDeviceIndex_t getDeviceIndex(Device device) {
|
||||||
switch (device) {
|
switch (device) {
|
||||||
case DEVICE_HEAD: return HEADSET;
|
case DEVICE_HEAD: return HEADSET;
|
||||||
case DEVICE_HAND: return INVALID_DEVICE;
|
|
||||||
case DEVICE_HAND_LEFT: return state.system->GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole_TrackedControllerRole_LeftHand);
|
case DEVICE_HAND_LEFT: return state.system->GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole_TrackedControllerRole_LeftHand);
|
||||||
case DEVICE_HAND_RIGHT: return state.system->GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole_TrackedControllerRole_RightHand);
|
case DEVICE_HAND_RIGHT: return state.system->GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole_TrackedControllerRole_RightHand);
|
||||||
case DEVICE_TRACKER_1:
|
|
||||||
case DEVICE_TRACKER_2:
|
|
||||||
case DEVICE_TRACKER_3:
|
|
||||||
case DEVICE_TRACKER_4: {
|
|
||||||
TrackedDeviceIndex_t trackers[4];
|
|
||||||
uint32_t trackerCount = state.system->GetSortedTrackedDeviceIndicesOfClass(ETrackedDeviceClass_TrackedDeviceClass_GenericTracker, trackers, 4, 0);
|
|
||||||
uint32_t i = device - DEVICE_TRACKER_1;
|
|
||||||
return i < trackerCount ? trackers[i] : INVALID_DEVICE;
|
|
||||||
}
|
|
||||||
default: return INVALID_DEVICE;
|
default: return INVALID_DEVICE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,23 @@
|
||||||
var LibraryLOVR = {
|
var LibraryLOVR = {
|
||||||
$webvr: {
|
$webvr: {
|
||||||
buttonMap: {
|
buttonMap: {
|
||||||
'OpenVR Gamepad': [1, null, 0, 2],
|
'OpenVR Gamepad': [1, 1, null, 0, 2],
|
||||||
'Oculus Touch (Left)': [1, 0, null, 2, null, null, null, 3, 4],
|
'Oculus Touch (Left)': [1, 1, 0, null, 2, null, null, null, 3, 4],
|
||||||
'Oculus Touch (Right)': [1, 0, null, 2, null, 3, 4, null, null],
|
'Oculus Touch (Right)': [1, 1, 0, null, 2, null, 3, 4, null, null],
|
||||||
'Spatial Controller (Spatial Interaction Source) 045E-065D': [0, 1, 3, 2, 4]
|
'Spatial Controller (Spatial Interaction Source) 045E-065D': [0, 0, 1, 3, 2, 4]
|
||||||
},
|
},
|
||||||
|
|
||||||
refreshGamepads: function(event) {
|
refreshGamepads: function(event) {
|
||||||
if (event.gamepad.hand) {
|
if (event.gamepad.hand) {
|
||||||
var device = ({
|
var device = ({
|
||||||
'': C.DEVICE_HAND,
|
|
||||||
'left': C.DEVICE_HAND_LEFT,
|
'left': C.DEVICE_HAND_LEFT,
|
||||||
'right': C.DEVICE_HAND_RIGHT
|
'right': C.DEVICE_HAND_RIGHT
|
||||||
})[event.gamepad.hand];
|
})[event.gamepad.hand];
|
||||||
|
|
||||||
webvr.gamepads[device] = event.gamepad;
|
if (device) {
|
||||||
webvr.poses[device] = event.gamepad.pose;
|
webvr.gamepads[device] = event.gamepad;
|
||||||
|
webvr.poses[device] = event.gamepad.pose;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -227,7 +228,7 @@ var LibraryLOVR = {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HEAPF32[down >> 2] = gamepad.buttons[webvr.buttonMaps[gamepad.id][button]].pressed;
|
HEAPF32[down >> 2] = gamepad.buttons[webvr.buttonMap[gamepad.id][button]].pressed;
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -238,7 +239,7 @@ var LibraryLOVR = {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HEAPF32[touched >> 2] = gamepad.buttons[webvr.buttonMaps[gamepad.id][button]].touched;
|
HEAPF32[touched >> 2] = gamepad.buttons[webvr.buttonMap[gamepad.id][button]].touched;
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -252,7 +253,8 @@ var LibraryLOVR = {
|
||||||
if (gamepad.id.startsWith('OpenVR')) {
|
if (gamepad.id.startsWith('OpenVR')) {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
|
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
|
||||||
case C.AXIS_TRACKPAD:
|
case C.AXIS_PRIMARY:
|
||||||
|
case C.AXIS_TOUCHPAD:
|
||||||
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
||||||
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
||||||
return true;
|
return true;
|
||||||
|
@ -262,6 +264,7 @@ var LibraryLOVR = {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
|
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
|
||||||
case C.AXIS_GRIP: HEAPF32[value >> 2] = gamepad.buttons[2].value; return true;
|
case C.AXIS_GRIP: HEAPF32[value >> 2] = gamepad.buttons[2].value; return true;
|
||||||
|
case C.AXIS_PRIMARY:
|
||||||
case C.AXIS_THUMBSTICK:
|
case C.AXIS_THUMBSTICK:
|
||||||
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
||||||
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
||||||
|
@ -271,11 +274,12 @@ var LibraryLOVR = {
|
||||||
} else if (gamepad.id.startsWith('Spatial Controller')) {
|
} else if (gamepad.id.startsWith('Spatial Controller')) {
|
||||||
switch (axis) {
|
switch (axis) {
|
||||||
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[0].value; return true;
|
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[0].value; return true;
|
||||||
|
case C.AXIS_PRIMARY:
|
||||||
case C.AXIS_THUMBSTICK:
|
case C.AXIS_THUMBSTICK:
|
||||||
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
|
||||||
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
|
||||||
return true;
|
return true;
|
||||||
case C.AXIS_TRACKPAD:
|
case C.AXIS_TOUCHPAD:
|
||||||
HEAPF32[value >> 2 + 0] = gamepad.axes[2];
|
HEAPF32[value >> 2 + 0] = gamepad.axes[2];
|
||||||
HEAPF32[value >> 2 + 1] = gamepad.axes[3];
|
HEAPF32[value >> 2 + 1] = gamepad.axes[3];
|
||||||
return true;
|
return true;
|
||||||
|
@ -313,11 +317,12 @@ var LibraryLOVR = {
|
||||||
ORIGIN_FLOOR: 1,
|
ORIGIN_FLOOR: 1,
|
||||||
|
|
||||||
// DeviceAxis
|
// DeviceAxis
|
||||||
AXIS_TRIGGER: 0,
|
AXIS_PRIMARY: 0,
|
||||||
AXIS_THUMBSTICK: 1,
|
AXIS_TRIGGER: 1,
|
||||||
AXIS_TRACKPAD: 2,
|
AXIS_THUMBSTICK: 2,
|
||||||
AXIS_PINCH: 5,
|
AXIS_TOUCHPAD: 3,
|
||||||
AXIS_GRIP: 6
|
AXIS_PINCH: 4,
|
||||||
|
AXIS_GRIP: 5
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue