diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index b56eb91..96afe8f 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -20,6 +20,7 @@ #include #include #include "logging.h" +#include "utils/Matrix.h" @@ -403,20 +404,11 @@ void OverlayController::RotateUniverseCenter(vr::ETrackingUniverseOrigin univers } else { vr::VRChaperoneSetup()->GetWorkingSeatedZeroPoseToRawTrackingPose(&curPos); } + + vr::HmdMatrix34_t rotMat; vr::HmdMatrix34_t newPos; - float yRot[3][3] = { - { std::cos(yAngle), 0, std::sin(yAngle) }, - { 0, 1, 0 }, - { -std::sin(yAngle), 0, std::cos(yAngle) } - }; - for (unsigned i = 0; i < 3; i++) { - for (unsigned j = 0; j < 3; j++) { - newPos.m[i][j] = 0.0f; - for (unsigned k = 0; k < 3; k++) { - newPos.m[i][j] += yRot[i][k] * curPos.m[k][j]; - } - } - } + utils::initRotationMatrix(rotMat, 0, yAngle); + utils::matMul33(newPos, rotMat, curPos); newPos.m[0][3] = curPos.m[0][3]; newPos.m[1][3] = curPos.m[1][3]; newPos.m[2][3] = curPos.m[2][3]; @@ -434,6 +426,7 @@ void OverlayController::RotateUniverseCenter(vr::ETrackingUniverseOrigin univers } } + void OverlayController::AddOffsetToCollisionBounds(unsigned axisId, float offset, bool commit) { // Apparently Valve sanity-checks the y-coordinates of the collision bounds (and only the y-coordinates) // I can move the bounds on the xz-plane, I can make the "ceiling" of the chaperone cage lower/higher, but when I @@ -469,21 +462,14 @@ void OverlayController::RotateCollisionBounds(float angle, bool commit) { if (collisionBoundsCount > 0) { vr::HmdQuad_t* collisionBounds = new vr::HmdQuad_t[collisionBoundsCount]; vr::VRChaperoneSetup()->GetWorkingCollisionBoundsInfo(collisionBounds, &collisionBoundsCount); - float yRot[3][3] = { - { std::cos(angle), 0, std::sin(angle) }, - { 0, 1, 0 }, - { -std::sin(angle), 0, std::cos(angle) } - }; + + vr::HmdMatrix34_t rotMat; + utils::initRotationMatrix(rotMat, 0, angle); for (unsigned b = 0; b < collisionBoundsCount; b++) { for (unsigned c = 0; c < 4; c++) { auto& corner = collisionBounds[b].vCorners[c]; vr::HmdVector3_t newVal; - for (unsigned i = 0; i < 3; i++) { - newVal.v[i] = 0.0f; - for (unsigned k = 0; k < 3; k++) { - newVal.v[i] += corner.v[k] * yRot[i][k]; - }; - } + utils::matMul33(newVal, rotMat, corner); corner = newVal; } } diff --git a/src/utils/Matrix.h b/src/utils/Matrix.h new file mode 100644 index 0000000..3da60d1 --- /dev/null +++ b/src/utils/Matrix.h @@ -0,0 +1,97 @@ +#pragma once + +#include +#include + + +namespace utils { + +inline vr::HmdMatrix34_t& initRotationMatrix(vr::HmdMatrix34_t& matrix, unsigned axisId, float angle) { + switch (axisId) { + case 0: // x-axis + matrix.m[0][0] = 1.0f; + matrix.m[0][1] = 0.0f; + matrix.m[0][2] = 0.0f; + matrix.m[0][3] = 0.0f; + matrix.m[1][0] = 0.0f; + matrix.m[1][1] = std::cos(angle); + matrix.m[1][2] = -std::sin(angle); + matrix.m[1][3] = 0.0f; + matrix.m[2][0] = 0.0f; + matrix.m[2][1] = std::sin(angle); + matrix.m[2][2] = std::cos(angle); + matrix.m[2][3] = 0.0f; + break; + case 1: // y-axis + matrix.m[0][0] = std::cos(angle); + matrix.m[0][1] = 0.0f; + matrix.m[0][2] = std::sin(angle); + matrix.m[0][3] = 0.0f; + matrix.m[1][0] = 0.0f; + matrix.m[1][1] = 1.0f; + matrix.m[1][2] = 0.0f; + matrix.m[1][3] = 0.0f; + matrix.m[2][0] = -std::sin(angle); + matrix.m[2][1] = 0.0f; + matrix.m[2][2] = std::cos(angle); + matrix.m[2][3] = 0.0f; + break; + case 2: // z-axis + matrix.m[0][0] = std::cos(angle); + matrix.m[0][1] = -std::sin(angle); + matrix.m[0][2] = 0.0f; + matrix.m[0][3] = 0.0f; + matrix.m[1][0] = std::sin(angle); + matrix.m[1][1] = std::cos(angle); + matrix.m[1][2] = 0.0f; + matrix.m[1][3] = 0.0f; + matrix.m[2][0] = 0.0f; + matrix.m[2][1] = 0.0f; + matrix.m[2][2] = 1.0f; + matrix.m[2][3] = 0.0f; + break; + default: + break; + } + return matrix; +} + + +inline vr::HmdMatrix34_t& matMul33(vr::HmdMatrix34_t& result, const vr::HmdMatrix34_t& a, const vr::HmdMatrix34_t& b) { + for (unsigned i = 0; i < 3; i++) { + for (unsigned j = 0; j < 3; j++) { + result.m[i][j] = 0.0f; + for (unsigned k = 0; k < 3; k++) { + result.m[i][j] += a.m[i][k] * b.m[k][j]; + } + } + } + return result; +} + + +inline vr::HmdVector3_t& matMul33(vr::HmdVector3_t& result, const vr::HmdMatrix34_t& a, const vr::HmdVector3_t& b) { + for (unsigned i = 0; i < 3; i++) { + result.v[i] = 0.0f; + for (unsigned k = 0; k < 3; k++) { + result.v[i] += a.m[i][k] * b.v[k]; + }; + } + return result; +} + + +inline vr::HmdVector3_t& matMul33(vr::HmdVector3_t& result, const vr::HmdVector3_t& a, const vr::HmdMatrix34_t& b) { + for (unsigned i = 0; i < 3; i++) { + result.v[i] = 0.0f; + for (unsigned k = 0; k < 3; k++) { + result.v[i] += a.v[k] * b.m[k][i]; + }; + } + return result; +} + + + +} // end namespace utils +