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 | else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { | 2790 | else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { |
| 2791 | _thirdPersonHMDCameraBoomValid= false; | 2791 | _thirdPersonHMDCameraBoomValid= false; |
| 2792 | auto userInputMapper = DependencyManager::get<UserInputMapper>(); | 2792 | |
| 2793 | const float YAW_SPEED = 70.0f; | 2793 | if (isHMDMode()) { |
| 2794 | float targetSpeed = userInputMapper->getActionState(controller::Action::YAW) * YAW_SPEED; | 2794 | auto mirrorBodyOrientation = myAvatar->getWorldOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)); |
| 2795 | if (targetSpeed != 0.0f) { | 2795 | |
| 2796 | const float ROTATION_TIMESCALE = 20.0f; | 2796 | glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix()); |
| 2797 | float blend = deltaTime / ROTATION_TIMESCALE; | 2797 | // Mirror HMD yaw and roll |
| 2798 | if (blend > 1.0f) { | 2798 | glm::vec3 mirrorHmdEulers = glm::eulerAngles(hmdRotation); |
| 2799 | blend = 1.0f; | 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 | renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; | 2834 | renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; |
| 2809 | } | 2835 | } |
| 2810 | else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { | 2836 | else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { |