mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-04 05:23:34 +00:00
Do less work in lovr.headset.getPosition/getOrientation;
This commit is contained in:
parent
9a8b119a81
commit
965f39f834
|
@ -227,12 +227,12 @@ int l_lovrHeadsetGetPose(lua_State* L) {
|
||||||
|
|
||||||
int l_lovrHeadsetGetPosition(lua_State* L) {
|
int l_lovrHeadsetGetPosition(lua_State* L) {
|
||||||
Path path = luax_optpath(L, 1, "head");
|
Path path = luax_optpath(L, 1, "head");
|
||||||
float position[3], angle, ax, ay, az;
|
float x, y, z;
|
||||||
FOREACH_TRACKING_DRIVER(driver) {
|
FOREACH_TRACKING_DRIVER(driver) {
|
||||||
if (driver->getPose(path, &position[0], &position[1], &position[2], &angle, &ax, &ay, &az)) {
|
if (driver->getPose(path, &x, &y, &z, NULL, NULL, NULL, NULL)) {
|
||||||
lua_pushnumber(L, position[0]);
|
lua_pushnumber(L, x);
|
||||||
lua_pushnumber(L, position[1]);
|
lua_pushnumber(L, y);
|
||||||
lua_pushnumber(L, position[2]);
|
lua_pushnumber(L, z);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,9 +241,9 @@ int l_lovrHeadsetGetPosition(lua_State* L) {
|
||||||
|
|
||||||
int l_lovrHeadsetGetOrientation(lua_State* L) {
|
int l_lovrHeadsetGetOrientation(lua_State* L) {
|
||||||
Path path = luax_optpath(L, 1, "head");
|
Path path = luax_optpath(L, 1, "head");
|
||||||
float x, y, z, angle, ax, ay, az;
|
float angle, ax, ay, az;
|
||||||
FOREACH_TRACKING_DRIVER(driver) {
|
FOREACH_TRACKING_DRIVER(driver) {
|
||||||
if (driver->getPose(path, &x, &y, &z, &angle, &ax, &ay, &az)) {
|
if (driver->getPose(path, NULL, NULL, NULL, &angle, &ax, &ay, &az)) {
|
||||||
lua_pushnumber(L, angle);
|
lua_pushnumber(L, angle);
|
||||||
lua_pushnumber(L, ax);
|
lua_pushnumber(L, ax);
|
||||||
lua_pushnumber(L, ay);
|
lua_pushnumber(L, ay);
|
||||||
|
|
|
@ -73,20 +73,25 @@ static const float* getBoundsGeometry(int* count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool getPose(Path path, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az) {
|
static bool getPose(Path path, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az) {
|
||||||
if (PATH_EQ(path, P_HEAD)) {
|
bool head = PATH_EQ(path, P_HEAD);
|
||||||
*x = *y = *z = 0.f;
|
bool hand = PATH_EQ(path, P_HAND, P_LEFT) || PATH_EQ(path, P_HAND, P_RIGHT);
|
||||||
} else if (PATH_EQ(path, P_HAND, P_LEFT) || PATH_EQ(path, P_HAND, P_RIGHT)) {
|
|
||||||
*x = 0.f;
|
if (!head && !hand) {
|
||||||
*y = 0.f;
|
|
||||||
*z = -.75f;
|
|
||||||
} else {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
float q[4];
|
if (x) {
|
||||||
mat4_transform(state.transform, x, y, z);
|
*x = *y = 0.f;
|
||||||
quat_fromMat4(q, state.transform);
|
*z = hand ? -.75f : 0.f;
|
||||||
quat_getAngleAxis(q, angle, ax, ay, az);
|
mat4_transform(state.transform, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle) {
|
||||||
|
float q[4];
|
||||||
|
quat_fromMat4(q, state.transform);
|
||||||
|
quat_getAngleAxis(q, angle, ax, ay, az);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,12 +169,17 @@ static bool getPose(Path path, float* x, float* y, float* z, float* angle, float
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*x = pose->Position.x;;
|
if (x) {
|
||||||
*y = pose->Position.y + state.offset;
|
*x = pose->Position.x;;
|
||||||
*z = pose->Position.z;
|
*y = pose->Position.y + state.offset;
|
||||||
|
*z = pose->Position.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle) {
|
||||||
|
float quat[4] = { pose->Orientation.x, pose->Orientation.y, pose->Orientation.z, pose->Orientation.w };
|
||||||
|
quat_getAngleAxis(quat, angle, ax, ay, az);
|
||||||
|
}
|
||||||
|
|
||||||
float quat[4] = { pose->Orientation.x, pose->Orientation.y, pose->Orientation.z, pose->Orientation.w };
|
|
||||||
quat_getAngleAxis(quat, angle, ax, ay, az);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,16 +71,28 @@ static const float* getBoundsGeometry(int* count) {
|
||||||
|
|
||||||
static bool getPose(Path path, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az) {
|
static bool getPose(Path path, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az) {
|
||||||
if (PATH_EQ(path, P_HEAD)) {
|
if (PATH_EQ(path, P_HEAD)) {
|
||||||
*x = bridgeLovrMobileData.updateData.lastHeadPose.x;
|
if (x) {
|
||||||
*y = bridgeLovrMobileData.updateData.lastHeadPose.y + state.offset; // Correct for head height
|
*x = bridgeLovrMobileData.updateData.lastHeadPose.x;
|
||||||
*z = bridgeLovrMobileData.updateData.lastHeadPose.z;
|
*y = bridgeLovrMobileData.updateData.lastHeadPose.y + state.offset; // Correct for head height
|
||||||
quat_getAngleAxis(bridgeLovrMobileData.updateData.lastHeadPose.q, angle, ax, ay, az);
|
*z = bridgeLovrMobileData.updateData.lastHeadPose.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle) {
|
||||||
|
quat_getAngleAxis(bridgeLovrMobileData.updateData.lastHeadPose.q, angle, ax, ay, az);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else if (PATH_EQ(path, P_HAND)) {
|
} else if (PATH_EQ(path, P_HAND)) {
|
||||||
*x = bridgeLovrMobileData.updateData.goPose.x;
|
if (x) {
|
||||||
*y = bridgeLovrMobileData.updateData.goPose.y + state.offset; // Correct for head height
|
*x = bridgeLovrMobileData.updateData.goPose.x;
|
||||||
*z = bridgeLovrMobileData.updateData.goPose.z;
|
*y = bridgeLovrMobileData.updateData.goPose.y + state.offset; // Correct for head height
|
||||||
quat_getAngleAxis(bridgeLovrMobileData.updateData.goPose.q, angle, ax, ay, az);
|
*z = bridgeLovrMobileData.updateData.goPose.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle) {
|
||||||
|
quat_getAngleAxis(bridgeLovrMobileData.updateData.goPose.q, angle, ax, ay, az);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -249,7 +249,7 @@ static bool getPose(Path path, float* x, float* y, float* z, float* angle, float
|
||||||
TrackedDeviceIndex_t deviceIndex = getDeviceIndexForPath(path);
|
TrackedDeviceIndex_t deviceIndex = getDeviceIndexForPath(path);
|
||||||
float transform[16];
|
float transform[16];
|
||||||
if (deviceIndex != INVALID_INDEX && getTransform(deviceIndex, transform)) {
|
if (deviceIndex != INVALID_INDEX && getTransform(deviceIndex, transform)) {
|
||||||
mat4_getPose(transform, x, y, z, angle, ax, ay, az);
|
mat4_getTransform(transform, x, y, z, NULL, NULL, NULL, angle, ax, ay, az);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -491,28 +491,27 @@ mat4 mat4_scale(mat4 m, float x, float y, float z) {
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mat4_getPose(mat4 m, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az) {
|
|
||||||
*x = m[12];
|
|
||||||
*y = m[13];
|
|
||||||
*z = m[14];
|
|
||||||
float quat[4];
|
|
||||||
quat_fromMat4(quat, m);
|
|
||||||
quat_getAngleAxis(quat, angle, ax, ay, az);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mat4_getTransform(mat4 m, float* x, float* y, float* z, float* sx, float* sy, float* sz, float* angle, float* ax, float* ay, float* az) {
|
void mat4_getTransform(mat4 m, float* x, float* y, float* z, float* sx, float* sy, float* sz, float* angle, float* ax, float* ay, float* az) {
|
||||||
*x = m[12];
|
if (x) {
|
||||||
*y = m[13];
|
*x = m[12];
|
||||||
*z = m[14];
|
*y = m[13];
|
||||||
float a[3] = { m[0], m[1], m[2] };
|
*z = m[14];
|
||||||
float b[3] = { m[4], m[5], m[6] };
|
}
|
||||||
float c[3] = { m[8], m[9], m[10] };
|
|
||||||
*sx = vec3_length(a);
|
if (sx) {
|
||||||
*sy = vec3_length(b);
|
float a[3] = { m[0], m[1], m[2] };
|
||||||
*sz = vec3_length(c);
|
float b[3] = { m[4], m[5], m[6] };
|
||||||
float quat[4];
|
float c[3] = { m[8], m[9], m[10] };
|
||||||
quat_fromMat4(quat, m);
|
*sx = vec3_length(a);
|
||||||
quat_getAngleAxis(quat, angle, ax, ay, az);
|
*sy = vec3_length(b);
|
||||||
|
*sz = vec3_length(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (angle) {
|
||||||
|
float quat[4];
|
||||||
|
quat_fromMat4(quat, m);
|
||||||
|
quat_getAngleAxis(quat, angle, ax, ay, az);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float clipNear, float clipFar) {
|
mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float clipNear, float clipFar) {
|
||||||
|
|
|
@ -54,7 +54,6 @@ MAF_EXPORT mat4 mat4_translate(mat4 m, float x, float y, float z);
|
||||||
MAF_EXPORT mat4 mat4_rotate(mat4 m, float angle, float x, float y, float z);
|
MAF_EXPORT mat4 mat4_rotate(mat4 m, float angle, float x, float y, float z);
|
||||||
MAF_EXPORT mat4 mat4_rotateQuat(mat4 m, quat q);
|
MAF_EXPORT mat4 mat4_rotateQuat(mat4 m, quat q);
|
||||||
MAF_EXPORT mat4 mat4_scale(mat4 m, float x, float y, float z);
|
MAF_EXPORT mat4 mat4_scale(mat4 m, float x, float y, float z);
|
||||||
MAF_EXPORT void mat4_getPose(mat4 m, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az);
|
|
||||||
MAF_EXPORT void mat4_getTransform(mat4 m, float* x, float* y, float* z, float* sx, float* sy, float* sz, float* angle, float* ax, float* ay, float* az);
|
MAF_EXPORT void mat4_getTransform(mat4 m, float* x, float* y, float* z, float* sx, float* sy, float* sz, float* angle, float* ax, float* ay, float* az);
|
||||||
MAF_EXPORT mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far);
|
MAF_EXPORT mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far);
|
||||||
MAF_EXPORT mat4 mat4_perspective(mat4 m, float near, float far, float fov, float aspect);
|
MAF_EXPORT mat4 mat4_perspective(mat4 m, float near, float far, float fov, float aspect);
|
||||||
|
|
Loading…
Reference in a new issue