From 809e986738066de9c7302f162def7ecb85c483d7 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 14 Sep 2017 15:49:09 -0700 Subject: [PATCH 1/6] Fixes for lasers on 2d HUD --- interface/src/Application.cpp | 13 ++----------- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5700bb6a72..8c64a626c2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2637,17 +2637,8 @@ void Application::paintGL() { PerformanceTimer perfTimer("postComposite"); renderArgs._batch = &postCompositeBatch; renderArgs._batch->setViewportTransform(ivec4(0, 0, finalFramebufferSize.width(), finalFramebufferSize.height())); - for_each_eye([&](Eye eye) { - - // apply eye offset and IPD scale to the view matrix - mat4 eyeToHead = displayPlugin->getEyeToHeadTransform(eye); - vec3 eyeOffset = glm::vec3(eyeToHead[3]); - mat4 eyeOffsetTransform = glm::translate(mat4(), eyeOffset * -1.0f * ipdScale); - renderArgs._batch->setViewTransform(renderArgs.getViewFrustum().getView() * eyeOffsetTransform); - - renderArgs._batch->setProjectionTransform(eyeProjections[eye]); - _overlays.render3DHUDOverlays(&renderArgs); - }); + renderArgs._batch->setViewTransform(renderArgs.getViewFrustum().getView()); + _overlays.render3DHUDOverlays(&renderArgs); } auto frame = _gpuContext->endFrame(); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index caeba37839..88ec94eefb 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -441,7 +441,7 @@ void HmdDisplayPlugin::OverlayRenderer::updatePipeline() { this->uniformsLocation = program->getUniformBuffers().findLocation("overlayBuffer"); gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setDepthTest(gpu::State::DepthTest(true, true, gpu::LESS_EQUAL)); + state->setDepthTest(gpu::State::DepthTest(false, false, gpu::LESS_EQUAL)); state->setBlendFunction(true, gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); From 0873b88347e4f26ce294344749bed38741ba6cde Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Thu, 14 Sep 2017 17:09:10 -0700 Subject: [PATCH 2/6] code review feedback --- interface/src/Application.cpp | 2 +- scripts/system/notifications.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8c64a626c2..f0a396672f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6676,7 +6676,7 @@ void Application::addAssetToWorldCheckModelSize() { if (dimensions != DEFAULT_DIMENSIONS) { // Scale model so that its maximum is exactly specific size. - const float MAXIMUM_DIMENSION = 1.0f * getMyAvatar()->getSensorToWorldScale(); + const float MAXIMUM_DIMENSION = getMyAvatar()->getSensorToWorldScale(); auto previousDimensions = dimensions; auto scale = std::min(MAXIMUM_DIMENSION / dimensions.x, std::min(MAXIMUM_DIMENSION / dimensions.y, MAXIMUM_DIMENSION / dimensions.z)); diff --git a/scripts/system/notifications.js b/scripts/system/notifications.js index 53cffa18d8..ffe93d13e8 100644 --- a/scripts/system/notifications.js +++ b/scripts/system/notifications.js @@ -249,7 +249,7 @@ noticeWidth = notice.width * NOTIFICATION_3D_SCALE + NOTIFICATION_3D_BUTTON_WIDTH; noticeHeight = notice.height * NOTIFICATION_3D_SCALE; - notice.size = { x: noticeWidth, y: noticeHeight}; + notice.size = { x: noticeWidth, y: noticeHeight }; positions = calculate3DOverlayPositions(noticeWidth, noticeHeight, notice.y); From 8144841258c7dfe29ea9fcfca4e16d54cf53618a Mon Sep 17 00:00:00 2001 From: Daniela Date: Fri, 15 Sep 2017 12:41:15 +0100 Subject: [PATCH 3/6] Add Edit.js Entities spawn up according to the orientation of the avatar. --- scripts/system/edit.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 569d4812dc..dca07a2fac 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -247,9 +247,12 @@ var toolBar = (function () { direction = MyAvatar.orientation; } direction = Vec3.multiplyQbyV(direction, Vec3.UNIT_Z); - + // Align entity with Avatar orientation. + properties.rotation = MyAvatar.orientation; + var PRE_ADJUST_ENTITY_TYPES = ["Box", "Sphere", "Shape", "Text", "Web"]; if (PRE_ADJUST_ENTITY_TYPES.indexOf(properties.type) !== -1) { + // Adjust position of entity per bounding box prior to creating it. var registration = properties.registration; if (registration === undefined) { @@ -259,7 +262,14 @@ var toolBar = (function () { var orientation = properties.orientation; if (orientation === undefined) { - var DEFAULT_ORIENTATION = Quat.fromPitchYawRollDegrees(0, 0, 0); + properties.orientation = MyAvatar.orientation; + var DEFAULT_ORIENTATION = properties.orientation; + orientation = DEFAULT_ORIENTATION; + } else { + // If the orientation is already defined, we perform the corresponding rotation assuming that + // our start referential is the avatar referential. + properties.orientation = Quat.multiply(MyAvatar.orientation, properties.orientation); + var DEFAULT_ORIENTATION = properties.orientation; orientation = DEFAULT_ORIENTATION; } From a8a5138c18d336d12a4a30ff50810e82c4576cea Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Sep 2017 13:30:34 -0700 Subject: [PATCH 4/6] remove USE_N_SCALE preprocessor check --- interface/src/ui/overlays/ModelOverlay.cpp | 2 -- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 -- interface/src/ui/overlays/Volume3DOverlay.cpp | 2 -- 3 files changed, 6 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index e2a7df7ae6..8ab44faaf9 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -47,9 +47,7 @@ void ModelOverlay::update(float deltatime) { _updateModel = false; _model->setSnapModelToCenter(true); Transform transform = getTransform(); -#ifndef USE_SN_SCALE transform.setScale(1.0f); // disable inherited scale -#endif if (_scaleToFit) { _model->setScaleToFit(true, transform.getScale() * getDimensions()); } else { diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 83dc4b0e2b..3b3fe9d2bc 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -41,9 +41,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { if (batch) { // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() Transform transform = getTransform(); -#ifndef USE_SN_SCALE transform.setScale(1.0f); // ignore inherited scale from SpatiallyNestable -#endif transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE); batch->setModelTransform(transform); diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index 5e3e4ccee7..3f94c1fa7b 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -57,9 +57,7 @@ bool Volume3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve // extents is the entity relative, scaled, centered extents of the entity glm::mat4 worldToEntityMatrix; Transform transform = getTransform(); -#ifndef USE_SN_SCALE transform.setScale(1.0f); // ignore any inherited scale from SpatiallyNestable -#endif transform.getInverseMatrix(worldToEntityMatrix); glm::vec3 overlayFrameOrigin = glm::vec3(worldToEntityMatrix * glm::vec4(origin, 1.0f)); From 09c61deda835ccb8e66ccd779ade9be4a33b0dd6 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Wed, 20 Sep 2017 15:41:49 -0700 Subject: [PATCH 5/6] Fixes for Vive puck calibration --- interface/src/avatar/MyAvatar.cpp | 40 ++++++------ libraries/shared/src/GLMHelpers.cpp | 8 +++ libraries/shared/src/GLMHelpers.h | 1 + plugins/openvr/src/ViveControllerManager.cpp | 66 ++++++++++++-------- plugins/openvr/src/ViveControllerManager.h | 4 +- 5 files changed, 70 insertions(+), 49 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f7116a60db..1bec40c35a 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3035,9 +3035,9 @@ glm::mat4 MyAvatar::getCenterEyeCalibrationMat() const { if (rightEyeIndex >= 0 && leftEyeIndex >= 0) { auto centerEyePos = (getAbsoluteDefaultJointTranslationInObjectFrame(rightEyeIndex) + getAbsoluteDefaultJointTranslationInObjectFrame(leftEyeIndex)) * 0.5f; auto centerEyeRot = Quaternions::Y_180; - return createMatFromQuatAndPos(centerEyeRot, centerEyePos); + return createMatFromQuatAndPos(centerEyeRot, centerEyePos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_MIDDLE_EYE_ROT, DEFAULT_AVATAR_MIDDLE_EYE_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_MIDDLE_EYE_ROT, DEFAULT_AVATAR_MIDDLE_EYE_POS / getSensorToWorldScale()); } } @@ -3047,9 +3047,9 @@ glm::mat4 MyAvatar::getHeadCalibrationMat() const { if (headIndex >= 0) { auto headPos = getAbsoluteDefaultJointTranslationInObjectFrame(headIndex); auto headRot = getAbsoluteDefaultJointRotationInObjectFrame(headIndex); - return createMatFromQuatAndPos(headRot, headPos); + return createMatFromQuatAndPos(headRot, headPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_HEAD_ROT, DEFAULT_AVATAR_HEAD_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_HEAD_ROT, DEFAULT_AVATAR_HEAD_POS / getSensorToWorldScale()); } } @@ -3059,9 +3059,9 @@ glm::mat4 MyAvatar::getSpine2CalibrationMat() const { if (spine2Index >= 0) { auto spine2Pos = getAbsoluteDefaultJointTranslationInObjectFrame(spine2Index); auto spine2Rot = getAbsoluteDefaultJointRotationInObjectFrame(spine2Index); - return createMatFromQuatAndPos(spine2Rot, spine2Pos); + return createMatFromQuatAndPos(spine2Rot, spine2Pos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_SPINE2_ROT, DEFAULT_AVATAR_SPINE2_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_SPINE2_ROT, DEFAULT_AVATAR_SPINE2_POS / getSensorToWorldScale()); } } @@ -3071,9 +3071,9 @@ glm::mat4 MyAvatar::getHipsCalibrationMat() const { if (hipsIndex >= 0) { auto hipsPos = getAbsoluteDefaultJointTranslationInObjectFrame(hipsIndex); auto hipsRot = getAbsoluteDefaultJointRotationInObjectFrame(hipsIndex); - return createMatFromQuatAndPos(hipsRot, hipsPos); + return createMatFromQuatAndPos(hipsRot, hipsPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_HIPS_ROT, DEFAULT_AVATAR_HIPS_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_HIPS_ROT, DEFAULT_AVATAR_HIPS_POS / getSensorToWorldScale()); } } @@ -3083,9 +3083,9 @@ glm::mat4 MyAvatar::getLeftFootCalibrationMat() const { if (leftFootIndex >= 0) { auto leftFootPos = getAbsoluteDefaultJointTranslationInObjectFrame(leftFootIndex); auto leftFootRot = getAbsoluteDefaultJointRotationInObjectFrame(leftFootIndex); - return createMatFromQuatAndPos(leftFootRot, leftFootPos); + return createMatFromQuatAndPos(leftFootRot, leftFootPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTFOOT_ROT, DEFAULT_AVATAR_LEFTFOOT_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTFOOT_ROT, DEFAULT_AVATAR_LEFTFOOT_POS / getSensorToWorldScale()); } } @@ -3095,9 +3095,9 @@ glm::mat4 MyAvatar::getRightFootCalibrationMat() const { if (rightFootIndex >= 0) { auto rightFootPos = getAbsoluteDefaultJointTranslationInObjectFrame(rightFootIndex); auto rightFootRot = getAbsoluteDefaultJointRotationInObjectFrame(rightFootIndex); - return createMatFromQuatAndPos(rightFootRot, rightFootPos); + return createMatFromQuatAndPos(rightFootRot, rightFootPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTFOOT_ROT, DEFAULT_AVATAR_RIGHTFOOT_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTFOOT_ROT, DEFAULT_AVATAR_RIGHTFOOT_POS / getSensorToWorldScale()); } } @@ -3107,9 +3107,9 @@ glm::mat4 MyAvatar::getRightArmCalibrationMat() const { if (rightArmIndex >= 0) { auto rightArmPos = getAbsoluteDefaultJointTranslationInObjectFrame(rightArmIndex); auto rightArmRot = getAbsoluteDefaultJointRotationInObjectFrame(rightArmIndex); - return createMatFromQuatAndPos(rightArmRot, rightArmPos); + return createMatFromQuatAndPos(rightArmRot, rightArmPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTARM_ROT, DEFAULT_AVATAR_RIGHTARM_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTARM_ROT, DEFAULT_AVATAR_RIGHTARM_POS / getSensorToWorldScale()); } } @@ -3118,9 +3118,9 @@ glm::mat4 MyAvatar::getLeftArmCalibrationMat() const { if (leftArmIndex >= 0) { auto leftArmPos = getAbsoluteDefaultJointTranslationInObjectFrame(leftArmIndex); auto leftArmRot = getAbsoluteDefaultJointRotationInObjectFrame(leftArmIndex); - return createMatFromQuatAndPos(leftArmRot, leftArmPos); + return createMatFromQuatAndPos(leftArmRot, leftArmPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTARM_ROT, DEFAULT_AVATAR_LEFTARM_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTARM_ROT, DEFAULT_AVATAR_LEFTARM_POS / getSensorToWorldScale()); } } @@ -3129,9 +3129,9 @@ glm::mat4 MyAvatar::getRightHandCalibrationMat() const { if (rightHandIndex >= 0) { auto rightHandPos = getAbsoluteDefaultJointTranslationInObjectFrame(rightHandIndex); auto rightHandRot = getAbsoluteDefaultJointRotationInObjectFrame(rightHandIndex); - return createMatFromQuatAndPos(rightHandRot, rightHandPos); + return createMatFromQuatAndPos(rightHandRot, rightHandPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTHAND_ROT, DEFAULT_AVATAR_RIGHTHAND_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_RIGHTHAND_ROT, DEFAULT_AVATAR_RIGHTHAND_POS / getSensorToWorldScale()); } } @@ -3140,9 +3140,9 @@ glm::mat4 MyAvatar::getLeftHandCalibrationMat() const { if (leftHandIndex >= 0) { auto leftHandPos = getAbsoluteDefaultJointTranslationInObjectFrame(leftHandIndex); auto leftHandRot = getAbsoluteDefaultJointRotationInObjectFrame(leftHandIndex); - return createMatFromQuatAndPos(leftHandRot, leftHandPos); + return createMatFromQuatAndPos(leftHandRot, leftHandPos / getSensorToWorldScale()); } else { - return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTHAND_ROT, DEFAULT_AVATAR_LEFTHAND_POS); + return createMatFromQuatAndPos(DEFAULT_AVATAR_LEFTHAND_ROT, DEFAULT_AVATAR_LEFTHAND_POS / getSensorToWorldScale()); } } diff --git a/libraries/shared/src/GLMHelpers.cpp b/libraries/shared/src/GLMHelpers.cpp index 394517aac4..39fec45d90 100644 --- a/libraries/shared/src/GLMHelpers.cpp +++ b/libraries/shared/src/GLMHelpers.cpp @@ -473,6 +473,14 @@ glm::mat4 createMatFromScaleQuatAndPos(const glm::vec3& scale, const glm::quat& glm::vec4(zAxis, 0.0f), glm::vec4(trans, 1.0f)); } +glm::mat4 createMatFromScale(const glm::vec3& scale) { + glm::vec3 xAxis = glm::vec3(scale.x, 0.0f, 0.0f); + glm::vec3 yAxis = glm::vec3(0.0f, scale.y, 0.0f); + glm::vec3 zAxis = glm::vec3(0.0f, 0.0f, scale.z); + return glm::mat4(glm::vec4(xAxis, 0.0f), glm::vec4(yAxis, 0.0f), + glm::vec4(zAxis, 0.0f), glm::vec4(Vectors::ZERO, 1.0f)); +} + // cancel out roll glm::quat cancelOutRoll(const glm::quat& q) { glm::vec3 forward = q * Vectors::FRONT; diff --git a/libraries/shared/src/GLMHelpers.h b/libraries/shared/src/GLMHelpers.h index 3386ea2c22..7248f4cb46 100644 --- a/libraries/shared/src/GLMHelpers.h +++ b/libraries/shared/src/GLMHelpers.h @@ -231,6 +231,7 @@ glm::tvec4 lerp(const glm::tvec4& x, const glm::tvec4& y, T a) glm::mat4 createMatFromQuatAndPos(const glm::quat& q, const glm::vec3& p); glm::mat4 createMatFromScaleQuatAndPos(const glm::vec3& scale, const glm::quat& rot, const glm::vec3& trans); +glm::mat4 createMatFromScale(const glm::vec3& scale); glm::quat cancelOutRoll(const glm::quat& q); glm::quat cancelOutRollAndPitch(const glm::quat& q); glm::mat4 cancelOutRollAndPitch(const glm::mat4& m); diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp index 5a1c23839e..81173722fb 100644 --- a/plugins/openvr/src/ViveControllerManager.cpp +++ b/plugins/openvr/src/ViveControllerManager.cpp @@ -375,7 +375,7 @@ void ViveControllerManager::InputDevice::update(float deltaTime, const controlle calibrateFromHandController(inputCalibrationData); calibrateFromUI(inputCalibrationData); - updateCalibratedLimbs(); + updateCalibratedLimbs(inputCalibrationData); _lastSimPoseData = _nextSimPoseData; } @@ -676,40 +676,55 @@ void ViveControllerManager::InputDevice::uncalibrate() { _overrideHands = false; } -void ViveControllerManager::InputDevice::updateCalibratedLimbs() { - _poseStateMap[controller::LEFT_FOOT] = addOffsetToPuckPose(controller::LEFT_FOOT); - _poseStateMap[controller::RIGHT_FOOT] = addOffsetToPuckPose(controller::RIGHT_FOOT); - _poseStateMap[controller::HIPS] = addOffsetToPuckPose(controller::HIPS); - _poseStateMap[controller::SPINE2] = addOffsetToPuckPose(controller::SPINE2); - _poseStateMap[controller::RIGHT_ARM] = addOffsetToPuckPose(controller::RIGHT_ARM); - _poseStateMap[controller::LEFT_ARM] = addOffsetToPuckPose(controller::LEFT_ARM); +void ViveControllerManager::InputDevice::updateCalibratedLimbs(const controller::InputCalibrationData& inputCalibration) { + _poseStateMap[controller::LEFT_FOOT] = addOffsetToPuckPose(inputCalibration, controller::LEFT_FOOT); + _poseStateMap[controller::RIGHT_FOOT] = addOffsetToPuckPose(inputCalibration, controller::RIGHT_FOOT); + _poseStateMap[controller::HIPS] = addOffsetToPuckPose(inputCalibration, controller::HIPS); + _poseStateMap[controller::SPINE2] = addOffsetToPuckPose(inputCalibration, controller::SPINE2); + _poseStateMap[controller::RIGHT_ARM] = addOffsetToPuckPose(inputCalibration, controller::RIGHT_ARM); + _poseStateMap[controller::LEFT_ARM] = addOffsetToPuckPose(inputCalibration, controller::LEFT_ARM); if (_overrideHead) { - _poseStateMap[controller::HEAD] = addOffsetToPuckPose(controller::HEAD); + _poseStateMap[controller::HEAD] = addOffsetToPuckPose(inputCalibration, controller::HEAD); } if (_overrideHands) { - _poseStateMap[controller::LEFT_HAND] = addOffsetToPuckPose(controller::LEFT_HAND); - _poseStateMap[controller::RIGHT_HAND] = addOffsetToPuckPose(controller::RIGHT_HAND); + _poseStateMap[controller::LEFT_HAND] = addOffsetToPuckPose(inputCalibration, controller::LEFT_HAND); + _poseStateMap[controller::RIGHT_HAND] = addOffsetToPuckPose(inputCalibration, controller::RIGHT_HAND); } } -controller::Pose ViveControllerManager::InputDevice::addOffsetToPuckPose(int joint) const { +controller::Pose ViveControllerManager::InputDevice::addOffsetToPuckPose(const controller::InputCalibrationData& inputCalibration, int joint) const { auto puck = _jointToPuckMap.find(joint); if (puck != _jointToPuckMap.end()) { uint32_t puckIndex = puck->second; - auto puckPose = _poseStateMap.find(puckIndex); - auto puckPostOffset = _pucksPostOffset.find(puckIndex); - auto puckPreOffset = _pucksPreOffset.find(puckIndex); - if (puckPose != _poseStateMap.end()) { - if (puckPreOffset != _pucksPreOffset.end() && puckPostOffset != _pucksPostOffset.end()) { - return puckPose->second.postTransform(puckPostOffset->second).transform(puckPreOffset->second); - } else if (puckPostOffset != _pucksPostOffset.end()) { - return puckPose->second.postTransform(puckPostOffset->second); - } else if (puckPreOffset != _pucksPreOffset.end()) { - return puckPose->second.transform(puckPreOffset->second); + // use sensor space pose. + auto puckPoseIter = _validTrackedObjects.begin(); + while (puckPoseIter != _validTrackedObjects.end()) { + if (puckPoseIter->first == puckIndex) { + break; } + puckPoseIter++; + } + + //auto puckPoseIter = _poseStateMap.find(puckIndex); + + if (puckPoseIter != _validTrackedObjects.end()) { + + glm::mat4 postMat; // identity + auto postIter = _pucksPostOffset.find(puckIndex); + if (postIter != _pucksPostOffset.end()) { + postMat = postIter->second; + } + + glm::mat4 preMat = glm::inverse(inputCalibration.avatarMat) * inputCalibration.sensorToWorldMat; + auto preIter = _pucksPreOffset.find(puckIndex); + if (preIter != _pucksPreOffset.end()) { + preMat = preMat * preIter->second; + } + + return puckPoseIter->second.postTransform(postMat).transform(preMat); } } return controller::Pose(); @@ -924,15 +939,12 @@ void ViveControllerManager::InputDevice::handleButtonEvent(float deltaTime, uint void ViveControllerManager::InputDevice::handleHeadPoseEvent(const controller::InputCalibrationData& inputCalibrationData, const mat4& mat, const vec3& linearVelocity, const vec3& angularVelocity) { - //perform a 180 flip to make the HMD face the +z instead of -z, beacuse the head faces +z glm::mat4 matYFlip = mat * Matrices::Y_180; controller::Pose pose(extractTranslation(matYFlip), glmExtractRotation(matYFlip), linearVelocity, angularVelocity); - - glm::mat4 sensorToAvatar = glm::inverse(inputCalibrationData.avatarMat) * inputCalibrationData.sensorToWorldMat; glm::mat4 defaultHeadOffset = glm::inverse(inputCalibrationData.defaultCenterEyeMat) * inputCalibrationData.defaultHeadMat; - controller::Pose hmdHeadPose = pose.transform(sensorToAvatar); - _poseStateMap[controller::HEAD] = hmdHeadPose.postTransform(defaultHeadOffset); + glm::mat4 sensorToAvatar = glm::inverse(inputCalibrationData.avatarMat) * inputCalibrationData.sensorToWorldMat; + _poseStateMap[controller::HEAD] = pose.postTransform(defaultHeadOffset).transform(sensorToAvatar); } void ViveControllerManager::InputDevice::handlePoseEvent(float deltaTime, const controller::InputCalibrationData& inputCalibrationData, diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index 9a7b2cbc93..4a7fcaf85e 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -79,10 +79,10 @@ private: void sendUserActivityData(QString activity); void configureCalibrationSettings(const QJsonObject configurationSettings); QJsonObject configurationSettings(); - controller::Pose addOffsetToPuckPose(int joint) const; + controller::Pose addOffsetToPuckPose(const controller::InputCalibrationData& inputCalibration, int joint) const; glm::mat4 calculateDefaultToReferenceForHeadPuck(const controller::InputCalibrationData& inputCalibration); glm::mat4 calculateDefaultToReferenceForHmd(const controller::InputCalibrationData& inputCalibration); - void updateCalibratedLimbs(); + void updateCalibratedLimbs(const controller::InputCalibrationData& inputCalibration); bool checkForCalibrationEvent(); void handleHandController(float deltaTime, uint32_t deviceIndex, const controller::InputCalibrationData& inputCalibrationData, bool isLeftHand); void handleHmd(uint32_t deviceIndex, const controller::InputCalibrationData& inputCalibrationData); From 5e93c13856ae0fa8eda25c68ffca55184bdfc305 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Wed, 20 Sep 2017 16:36:33 -0700 Subject: [PATCH 6/6] warning fix --- interface/src/Application.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f0a396672f..b5274f1d34 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2580,7 +2580,6 @@ void Application::paintGL() { // scale IPD by sensorToWorldScale, to make the world seem larger or smaller accordingly. ipdScale *= sensorToWorldScale; - mat4 eyeProjections[2]; { PROFILE_RANGE(render, "/mainRender"); PerformanceTimer perfTimer("mainRender");