Showing the changes to interface/src/Application.cpp (1 of 2 files). Show all
Unified · Split
| @@ -2789,22 +2789,48 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { · 2788 unmodified lines | ||
| 2789 | 2789 | } |
| 2790 | 2790 | else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { |
| 2791 | 2791 | _thirdPersonHMDCameraBoomValid= false; |
| 2792 | − auto userInputMapper = DependencyManager::get<UserInputMapper>(); | |
| 2793 | − const float YAW_SPEED = 70.0f; | |
| 2794 | − float targetSpeed = userInputMapper->getActionState(controller::Action::YAW) * YAW_SPEED; | |
| 2795 | − if (targetSpeed != 0.0f) { | |
| 2796 | − const float ROTATION_TIMESCALE = 20.0f; | |
| 2797 | − float blend = deltaTime / ROTATION_TIMESCALE; | |
| 2798 | − if (blend > 1.0f) { | |
| 2799 | − blend = 1.0f; | |
| 2792 | + | |
| 2793 | + if (isHMDMode()) { | |
| 2794 | + auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)); | |
| 2795 | + | |
| 2796 | + glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix()); | |
| 2797 | + // Mirror HMD yaw and roll | |
| 2798 | + glm::vec3 mirrorHmdEulers = glm::eulerAngles(hmdRotation); | |
| 2799 | + mirrorHmdEulers.y = -mirrorHmdEulers.y; | |
| 2800 | + mirrorHmdEulers.z = -mirrorHmdEulers.z; | |
| 2801 | + glm::quat mirrorHmdRotation = glm::quat(mirrorHmdEulers); | |
| 2802 | + | |
| 2803 | + glm::quat worldMirrorRotation = mirrorBodyOrientation * mirrorHmdRotation; | |
| 2804 | + | |
| 2805 | + _myCamera.setOrientation(worldMirrorRotation); | |
| 2806 | + | |
| 2807 | + glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix()); | |
| 2808 | + // Mirror HMD lateral offsets | |
| 2809 | + hmdOffset.x = -hmdOffset.x; | |
| 2810 | + | |
| 2811 | + _myCamera.setPosition(myAvatar->getDefaultEyePosition() | |
| 2812 | + + glm::vec3(0, _raiseMirror * myAvatar->getModelScale(), 0) | |
| 2813 | + + mirrorBodyOrientation * glm::vec3(0.0f, 0.0f, 1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror | |
| 2814 | + + mirrorBodyOrientation * hmdOffset); | |
| 2815 | + } | |
| 2816 | + else { | |
| 2817 | + auto userInputMapper = DependencyManager::get<UserInputMapper>(); | |
| 2818 | + const float YAW_SPEED = 70.0f; | |
| 2819 | + float targetSpeed = userInputMapper->getActionState(controller::Action::YAW) * YAW_SPEED; | |
| 2820 | + if (targetSpeed != 0.0f) { | |
| 2821 | + const float ROTATION_TIMESCALE = 20.0f; | |
| 2822 | + float blend = deltaTime / ROTATION_TIMESCALE; | |
| 2823 | + if (blend > 1.0f) { | |
| 2824 | + blend = 1.0f; | |
| 2825 | + } | |
| 2826 | + _rotateMirror = (1.0f - blend) * _rotateMirror + blend * targetSpeed; | |
| 2800 | 2827 | } |
| 2801 | − _rotateMirror = (1.0f - blend) * _rotateMirror + blend * targetSpeed; | |
| 2828 | + _myCamera.setOrientation(glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); | |
| 2829 | + _myCamera.setPosition(myAvatar->getDefaultEyePosition() | |
| 2830 | + + glm::vec3(0, _raiseMirror * myAvatar->getModelScale(), 0) | |
| 2831 | + + (glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) * | |
| 2832 | + glm::vec3(0.0f, 0.0f, -1.0f) * myAvatar->getBoomLength() * _scaleMirror); | |
| 2802 | 2833 | } |
| 2803 | − _myCamera.setOrientation(glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); | |
| 2804 | − _myCamera.setPosition(myAvatar->getDefaultEyePosition() | |
| 2805 | − + glm::vec3(0, _raiseMirror * myAvatar->getModelScale(), 0) | |
| 2806 | − + (glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) * | |
| 2807 | − glm::vec3(0.0f, 0.0f, -1.0f) * myAvatar->getBoomLength() * _scaleMirror); | |
| 2808 | 2834 | renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; |
| 2809 | 2835 | } |
| 2810 | 2836 | else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { |