More leap fixes;

Also reduce branching in headset accessors.
This commit is contained in:
bjorn 2019-05-09 02:17:33 -07:00
parent 06b8b6f405
commit 6ff35420bd
8 changed files with 64 additions and 110 deletions

View File

@ -267,9 +267,9 @@ int l_lovrHeadsetGetPose(lua_State* L) {
int l_lovrHeadsetGetPosition(lua_State* L) {
Device device = luax_optdevice(L, 1);
float position[3];
float position[3], orientation[4];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getPose(device, position, NULL)) {
if (driver->getPose(device, position, orientation)) {
lua_pushnumber(L, position[0]);
lua_pushnumber(L, position[1]);
lua_pushnumber(L, position[2]);
@ -281,9 +281,9 @@ int l_lovrHeadsetGetPosition(lua_State* L) {
int l_lovrHeadsetGetOrientation(lua_State* L) {
Device device = luax_optdevice(L, 1);
float orientation[4];
float position[3], orientation[4];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getPose(device, NULL, orientation)) {
if (driver->getPose(device, position, orientation)) {
float angle, ax, ay, az;
quat_getAngleAxis(orientation, &angle, &ax, &ay, &az);
lua_pushnumber(L, angle);
@ -298,9 +298,9 @@ int l_lovrHeadsetGetOrientation(lua_State* L) {
int l_lovrHeadsetGetDirection(lua_State* L) {
Device device = luax_optdevice(L, 1);
float orientation[4];
float position[3], orientation[4];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getPose(device, NULL, orientation)) {
if (driver->getPose(device, position, orientation)) {
float v[3] = { 0.f, 0.f, -1.f };
quat_rotate(orientation, v);
lua_pushnumber(L, v[0]);
@ -335,9 +335,9 @@ int l_lovrHeadsetGetBonePose(lua_State* L) {
int l_lovrHeadsetGetVelocity(lua_State* L) {
Device device = luax_optdevice(L, 1);
float velocity[3];
float velocity[3], angularVelocity[3];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getVelocity(device, velocity, NULL)) {
if (driver->getVelocity(device, velocity, angularVelocity)) {
lua_pushnumber(L, velocity[0]);
lua_pushnumber(L, velocity[1]);
lua_pushnumber(L, velocity[2]);
@ -349,9 +349,9 @@ int l_lovrHeadsetGetVelocity(lua_State* L) {
int l_lovrHeadsetGetAngularVelocity(lua_State* L) {
Device device = luax_optdevice(L, 1);
float angularVelocity[3];
float velocity[3], angularVelocity[3];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getVelocity(device, NULL, angularVelocity)) {
if (driver->getVelocity(device, velocity, angularVelocity)) {
lua_pushnumber(L, angularVelocity[0]);
lua_pushnumber(L, angularVelocity[1]);
lua_pushnumber(L, angularVelocity[2]);
@ -363,9 +363,9 @@ int l_lovrHeadsetGetAngularVelocity(lua_State* L) {
int l_lovrHeadsetGetAcceleration(lua_State* L) {
Device device = luax_optdevice(L, 1);
float acceleration[3];
float acceleration[3], angularAcceleration[3];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getAcceleration(device, acceleration, NULL)) {
if (driver->getAcceleration(device, acceleration, angularAcceleration)) {
lua_pushnumber(L, acceleration[0]);
lua_pushnumber(L, acceleration[1]);
lua_pushnumber(L, acceleration[2]);
@ -377,9 +377,9 @@ int l_lovrHeadsetGetAcceleration(lua_State* L) {
int l_lovrHeadsetGetAngularAcceleration(lua_State* L) {
Device device = luax_optdevice(L, 1);
float angularAcceleration[3];
float acceleration[3], angularAcceleration[3];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getAcceleration(device, NULL, angularAcceleration)) {
if (driver->getAcceleration(device, acceleration, angularAcceleration)) {
lua_pushnumber(L, angularAcceleration[0]);
lua_pushnumber(L, angularAcceleration[1]);
lua_pushnumber(L, angularAcceleration[2]);

View File

@ -79,15 +79,9 @@ static bool desktop_getPose(Device device, vec3 position, quat orientation) {
return false;
}
if (position) {
vec3_set(position, 0.f, 0.f, device == DEVICE_HAND ? -.75f : 0.f);
mat4_transform(state.transform, position);
}
if (orientation) {
quat_fromMat4(orientation, state.transform);
}
vec3_set(position, 0.f, 0.f, device == DEVICE_HAND ? -.75f : 0.f);
mat4_transform(state.transform, position);
quat_fromMat4(orientation, state.transform);
return true;
}

View File

@ -69,7 +69,7 @@ static void adjustPose(vec3 position, vec3 direction) {
vec3_scale(position, -.001f);
temp = position[1];
position[1] = position[2];
position[2] = position[1];
position[2] = temp;
position[2] -= .080f;
mat4_transform(state.headPose, position);
@ -91,8 +91,12 @@ static bool leap_getPose(Device device, vec3 position, quat orientation) {
default: return false;
}
if (!hand) {
return false;
}
float direction[3];
vec3_init(position, hand->palm.position);
vec3_init(position, hand->palm.position.v);
vec3_init(direction, hand->palm.normal.v);
adjustPose(position, direction);
quat_between(orientation, (float[3]) { 0.f, 0.f, -1.f }, direction);
@ -108,6 +112,10 @@ static bool leap_getBonePose(Device device, DeviceBone bone, vec3 position, quat
default: return false;
}
if (!hand) {
return false;
}
// Assumes that enum values for non-tip bones are grouped by finger, and start after BONE_PINKY,
// could be less clever and use a switch if needed
float direction[3];
@ -120,7 +128,7 @@ static bool leap_getBonePose(Device device, DeviceBone bone, vec3 position, quat
} else {
bone -= BONE_PINKY + 1;
LEAP_DIGIT* finger = &hand->digits[bone / 4];
LEAP_BONE* leapBone = finger->bones[bone % 4];
LEAP_BONE* leapBone = &finger->bones[bone % 4];
vec3 base = leapBone->prev_joint.v;
vec3 tip = leapBone->next_joint.v;
vec3_sub(vec3_init(direction, tip), base);
@ -141,6 +149,10 @@ static bool leap_getVelocity(Device device, vec3 velocity, vec3 angularVelocity)
default: return false;
}
if (!hand) {
return false;
}
vec3_set(velocity, hand->palm.velocity.x, hand->palm.velocity.z, hand->palm.velocity.y);
vec3_scale(velocity, -.001f);
mat4_transformDirection(state.headPose, velocity);
@ -169,9 +181,13 @@ static bool leap_getAxis(Device device, DeviceAxis axis, float* value) {
default: return false;
}
switch (button) {
case BUTTON_PINCH: return *value = hand->pinch_strength, true;
case BUTTON_GRIP: return *value = hand->grab_strength, true;
if (!hand) {
return false;
}
switch (axis) {
case AXIS_PINCH: return *value = hand->pinch_strength, true;
case AXIS_GRIP: return *value = hand->grab_strength, true;
default: return false;
}
}
@ -218,7 +234,7 @@ static void leap_update(float dt) {
}
float position[3], orientation[4];
if (lovrHeadsetDriver && lovrHeadsetDriver->getPose("head", position, orientation)) {
if (lovrHeadsetDriver && lovrHeadsetDriver->getPose(DEVICE_HEAD, position, orientation)) {
mat4 m = state.headPose;
mat4_identity(m);
mat4_translate(m, position[0], position[1], position[2]);

View File

@ -178,15 +178,8 @@ static bool oculus_getPose(Device device, vec3 position, quat orientation) {
if (!poseState) return false;
ovrPosef* pose = poseState->ThePose;
if (position) {
vec3_set(position, pose->Position.x, pose->Position.y + state.offset, pose->Position.z);
}
if (orientation) {
quat_set(orientation, pose->Orientation.x, pose->Orientation.y, pose->Orientation.z, pose->Orientation.w);
}
vec3_set(position, pose->Position.x, pose->Position.y + state.offset, pose->Position.z);
quat_set(orientation, pose->Orientation.x, pose->Orientation.y, pose->Orientation.z, pose->Orientation.w);
return true;
}
@ -198,14 +191,8 @@ static bool oculus_getVelocity(const char* path, vec3 velocity, vec3 angularVelo
ovrPoseStatef* pose = getPose(device);
if (!pose) return false;
if (velocity) {
vec3_set(velocity, pose->LinearVelocity.x, pose->LinearVelocity.y, pose->LinearVelocity.z);
}
if (angularVelocity) {
vec3_set(angularVelocity, pose->AngularVelocity.x, pose->AngularVelocity.y, pose->AngularVelocity.z);
}
vec3_set(velocity, pose->LinearVelocity.x, pose->LinearVelocity.y, pose->LinearVelocity.z);
vec3_set(angularVelocity, pose->AngularVelocity.x, pose->AngularVelocity.y, pose->AngularVelocity.z);
return true;
}
@ -213,14 +200,8 @@ static bool oculus_getAcceleration(Device device, vec3 acceleration, vec3 angula
ovrPoseStatef* pose = getPose(device);
if (!pose) return false;
if (acceleration) {
vec3_set(acceleration, pose->LinearAcceleration.x, pose->LinearAcceleration.y, pose->LinearAcceleration.z);
}
if (angularAcceleration) {
vec3_set(angularAcceleration, pose->AngularAcceleration.x, pose->AngularAcceleration.y, pose->AngularAcceleration.z);
}
vec3_set(acceleration, pose->LinearAcceleration.x, pose->LinearAcceleration.y, pose->LinearAcceleration.z);
vec3_set(angularAcceleration, pose->AngularAcceleration.x, pose->AngularAcceleration.y, pose->AngularAcceleration.z);
return true;
}

View File

@ -83,14 +83,8 @@ static bool vrapi_getPose(Device device, vec3 position, quat orientation) {
default: return false;
}
if (position) {
vec3_set(position, pose->x, pose->y + state.offset, pose->z);
}
if (orientation) {
quat_init(orientation, pose->q);
}
vec3_set(position, pose->x, pose->y + state.offset, pose->z);
quat_init(orientation, pose->q);
return true;
}
@ -107,14 +101,8 @@ static bool vrapi_getVelocity(Device device, vec3 velocity, vec3 angularVelocity
default: return false;
}
if (velocity) {
vec3_set(velocity, v->x, v->y, v->z);
}
if (angularVelocity) {
vec3_set(angularVelocity, v->ax, v->ay, v->az);
}
vec3_set(velocity, v->x, v->y, v->z);
vec3_set(angularVelocity, v->ax, v->ay, v->az);
return true;
}

View File

@ -209,14 +209,8 @@ static bool openvr_getVelocity(Device device, vec3 velocity, vec3 angularVelocit
return false;
}
if (velocity) {
vec3_init(velocity, pose->vVelocity.v);
}
if (angularVelocity) {
vec3_init(angularVelocity, pose->vAngularVelocity.v);
}
vec3_init(velocity, pose->vVelocity.v);
vec3_init(angularVelocity, pose->vAngularVelocity.v);
return true;
}

View File

@ -445,15 +445,8 @@ static bool openxr_getPose(Device device, vec3 position, quat orientation) {
if (getRelation(device, &relation) && (relation.relationFlags & (XR_SPACE_RELATION_POSITION_VALID_BIT | XR_SPACE_RELATION_ORIENTATION_VALID_BIT))) {
XrPosef* pose = &relation.pose;
if (position) {
vec3_set(position, pose->position.x, pose->position.y, pose->position.z);
}
if (orientation) {
quat_set(orientation, pose->orientation.x, pose->orientation.y, pose->orientation.z, pose->orientation.w);
}
vec3_set(position, pose->position.x, pose->position.y, pose->position.z);
quat_set(orientation, pose->orientation.x, pose->orientation.y, pose->orientation.z, pose->orientation.w);
return true;
}
@ -468,14 +461,8 @@ static bool openxr_getVelocity(Device device, vec3 velocity, vec3 angularVelocit
XrSpaceRelation relation;
if (getRelation(device, &relation) && (relation.relationFlags & (XR_SPACE_RELATION_LINEAR_VELOCITY_VALID_BIT | XR_SPACE_RELATION_ANGULAR_VELOCITY_VALID_BIT))) {
if (velocity) {
vec3_set(velocity, relation.linearVelocity.x, relation.linearVelocity.y, relation.linearVelocity.z);
}
if (angularVelocity) {
vec3_set(angularVelocity, relation.angularVelocity.x, relation.angularVelocity.y, relation.angularVelocity.z);
}
vec3_set(velocity, relation.linearVelocity.x, relation.linearVelocity.y, relation.linearVelocity.z);
vec3_set(angularVelocity, relation.angularVelocity.x, relation.angularVelocity.y, relation.angularVelocity.z);
return true;
}
@ -486,14 +473,8 @@ static bool openxr_getAcceleration(Device device, vec3 acceleration, vec3 angula
XrSpaceRelation relation;
if (getRelation(device, &relation) && (relation.relationFlags & (XR_SPACE_RELATION_LINEAR_ACCELERATION_VALID_BIT | XR_SPACE_RELATION_ANGULAR_ACCELERATION_VALID_BIT))) {
if (acceleration) {
vec3_set(acceleration, relation.linearAcceleration.x, relation.linearAcceleration.y, relation.linearAcceleration.z);
}
if (angularAcceleration) {
vec3_set(angularAcceleration, relation.angularAcceleration.x, relation.angularAcceleration.y, relation.angularAcceleration.z);
}
vec3_set(acceleration, relation.linearAcceleration.x, relation.linearAcceleration.y, relation.linearAcceleration.z);
vec3_set(angularAcceleration, relation.angularAcceleration.x, relation.angularAcceleration.y, relation.angularAcceleration.z);
return true;
}

View File

@ -156,14 +156,14 @@ var LibraryLOVR = {
var pose = webvr.poses[device];
if (!pose) { return false; }
if (position && pose.position) {
if (pose.position) {
HEAPF32.set(pose.position, position >> 2);
Module._mat4_transform(webvr.poseTransform, position);
} else {
HEAPF32.fill(0, position >> 2, position >> 2 + 3);
}
if (orientation && pose.orientation) {
if (pose.orientation) {
HEAPF32.set(pose.orientation, orientation >> 2);
Module._mat4_rotateQuat(Module._mat4_init(webvr.matA, webvr.poseTransform), orientation);
Module._quat_fromMat4(orientation, webvr.matA);
@ -182,14 +182,14 @@ var LibraryLOVR = {
var pose = webvr.poses[device];
if (!pose) { return false; }
if (velocity && pose.linearVelocity) {
if (pose.linearVelocity) {
HEAPF32.set(pose.linearVelocity, velocity >> 2);
Module._mat4_transformDirection(webvr.poseTransform, velocity);
} else {
HEAPF32.fill(0, velocity >> 2, velocity >> 2 + 3);
}
if (angularVelocity && pose.angularVelocity) {
if (pose.angularVelocity) {
HEAPF32.set(pose.angularVelocity, angularVelocity >> 2);
Module._mat4_transformDirection(webvr.poseTransform, angularVelocity);
} else {
@ -203,14 +203,14 @@ var LibraryLOVR = {
var pose = webvr.poses[device];
if (!pose) { return false; }
if (acceleration && pose.linearAcceleration) {
if (pose.linearAcceleration) {
HEAPF32.set(pose.linearAcceleration, acceleration >> 2);
Module._mat4_transformDirection(webvr.poseTransform, acceleration);
} else {
HEAPF32.fill(0, accleration >> 2, accleration >> 2 + 3);
}
if (angularAcceleration && pose.angularAcceleration) {
if (pose.angularAcceleration) {
HEAPF32.set(pose.angularAcceleration, angularAcceleration >> 2);
Module._mat4_transformDirection(webvr.poseTransform, angularAcceleration);
} else {