diff --git a/CMakeLists.txt b/CMakeLists.txt index c757b43e..b57efead 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ if(EMSCRIPTEN) "-s FULL_ES3=1 " "-s FORCE_FILESYSTEM=1 " "-s ALLOW_MEMORY_GROWTH=1 " - "-s \"EXPORTED_FUNCTIONS=['_main','_mat4_rotateQuat','_mat4_set','_mat4_transform','_quat_fromMat4','_quat_getAngleAxis']\" " + "-s \"EXPORTED_FUNCTIONS=['_main','_mat4_rotateQuat','_mat4_set','_mat4_transform','_mat4_transformDirection','_quat_fromMat4','_quat_getAngleAxis']\" " "-s \"EXTRA_EXPORTED_RUNTIME_METHODS=['getValue','setValue']\" " "--js-library \"${CMAKE_CURRENT_SOURCE_DIR}/src/resources/lovr.js\"" ) diff --git a/src/headset/fake.c b/src/headset/fake.c index a342a8e2..e90cb18e 100644 --- a/src/headset/fake.c +++ b/src/headset/fake.c @@ -362,8 +362,7 @@ static void fakeUpdate(float dt) { } // move - float quat[4]; - quat_rotate(quat_fromMat4(quat, state.transform), v); + mat4_transformDirection(state.transform, &v[0], &v[1], &v[2]); vec3_add(state.pos, v); // update transform diff --git a/src/headset/webvr.c b/src/headset/webvr.c index e433923f..f2121c9e 100644 --- a/src/headset/webvr.c +++ b/src/headset/webvr.c @@ -14,6 +14,7 @@ extern void webvrSetClipDistance(float near, float far); extern void webvrGetBoundsDimensions(float* width, float* depth); extern void webvrGetPose(float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az); extern void webvrGetVelocity(float* x, float* y, float* z); +extern void webvrGetAngularVelocity(float* x, float* y, float* z); extern void webvrRenderTo(void (*callback)(void*), void* userdata); typedef struct { @@ -48,7 +49,7 @@ HeadsetInterface lovrHeadsetWebVRDriver = { webvrGetPose, NULL, //void (*getEyePose)(HeadsetEye eye, float* x, float* y, float* z, float* angle, float* ax, float* ay, float* az); webvrGetVelocity, - NULL, //void (*getAngularVelocity)(float* x, float* y, float* z); + webvrGetAngularVelocity, NULL, //vec_controller_t* (*getControllers)(); NULL, //bool (*controllerIsConnected)(Controller* controller); NULL, //ControllerHand (*controllerGetHand)(Controller* controller); diff --git a/src/math/mat4.c b/src/math/mat4.c index 708cc453..d21b804e 100644 --- a/src/math/mat4.c +++ b/src/math/mat4.c @@ -335,3 +335,10 @@ void mat4_transform(mat4 m, float* x, float* y, float* z) { *y = tx * m[1] + ty * m[5] + tz * m[9] + m[13]; *z = tx * m[2] + ty * m[6] + tz * m[10] + m[14]; } + +void mat4_transformDirection(mat4 m, float* dx, float* dy, float* dz) { + float x = *dx, y = *dy, z = *dz; + *dx = x * m[0] + y * m[4] + z * m[8]; + *dy = x * m[1] + y * m[5] + z * m[9]; + *dz = x * m[2] + y * m[6] + z * m[10]; +} diff --git a/src/math/mat4.h b/src/math/mat4.h index b5addacd..7f0ed28e 100644 --- a/src/math/mat4.h +++ b/src/math/mat4.h @@ -20,3 +20,4 @@ mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, mat4 mat4_perspective(mat4 m, float near, float far, float fov, float aspect); mat4 mat4_lookAt(mat4 m, vec3 from, vec3 to, vec3 up); void mat4_transform(mat4 m, float* x, float* y, float* z); +void mat4_transformDirection(mat4 m, float* x, float* y, float* z); diff --git a/src/resources/lovr.js b/src/resources/lovr.js index b6dc40b3..fcf830c2 100644 --- a/src/resources/lovr.js +++ b/src/resources/lovr.js @@ -163,13 +163,34 @@ var LibraryLOVR = { }, webvrGetVelocity: function(x, y, z) { - var stage = lovr.WebVR.display && lovr.WebVR.display.stageParameters; + var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform; var pose = lovr.WebVR.frameData.pose; if (pose.linearVelocity) { HEAPF32[x >> 2] = pose.linearVelocity[0]; HEAPF32[y >> 2] = pose.linearVelocity[1]; HEAPF32[z >> 2] = pose.linearVelocity[2]; + + if (sittingToStanding) { + Module._mat4_transformDirection(sittingToStanding, x, y, z); + } + } else { + HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0; + } + }, + + webvrGetAngularVelocity: function(x, y, z) { + var sittingToStanding = lovr.WebVR.display && lovr.WebVR.display.stageParameters && lovr.WebVR.display.stageParameters.sittingToStandingTransform; + var pose = lovr.WebVR.frameData.pose; + + if (pose.angularVelocity) { + HEAPF32[x >> 2] = pose.angularVelocity[0]; + HEAPF32[y >> 2] = pose.angularVelocity[1]; + HEAPF32[z >> 2] = pose.angularVelocity[2]; + + if (sittingToStanding) { + Module._mat4_transformDirection(sittingToStanding, x, y, z); + } } else { HEAPF32[x >> 2] = HEAPF32[y >> 2] = HEAPF32[z >> 2] = 0; }