diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4dd7b66d1c..99e3f5be12 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1983,6 +1983,9 @@ void Application::updateMouseRay() { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateMouseRay()"); + // make sure the frustum is up-to-date + loadViewFrustum(_myCamera, _viewFrustum); + // if the mouse pointer isn't visible, act like it's at the center of the screen float x = 0.5f, y = 0.5f; if (!_mouseHidden) { @@ -2030,11 +2033,12 @@ void Application::updateVisage() { _visage.update(); } -void Application::updateMyAvatarLookAtPosition(glm::vec3& lookAtSpot) { +void Application::updateMyAvatarLookAtPosition() { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateMyAvatarLookAtPosition()"); + glm::vec3 lookAtSpot; if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { lookAtSpot = _myCamera.getPosition(); @@ -2224,20 +2228,21 @@ void Application::updateMetavoxels(float deltaTime) { } void Application::cameraMenuChanged() { + float modeShiftPeriod = (_myCamera.getMode() == CAMERA_MODE_MIRROR) ? 0.0f : 1.0f; if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { _myCamera.setMode(CAMERA_MODE_MIRROR); - _myCamera.setModeShiftPeriod(0.00f); + _myCamera.setModeShiftPeriod(0.0f); } } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); - _myCamera.setModeShiftPeriod(1.0f); + _myCamera.setModeShiftPeriod(modeShiftPeriod); } } else { if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) { _myCamera.setMode(CAMERA_MODE_THIRD_PERSON); - _myCamera.setModeShiftPeriod(1.0f); + _myCamera.setModeShiftPeriod(modeShiftPeriod); } } } @@ -2315,13 +2320,10 @@ void Application::update(float deltaTime) { // check what's under the mouse and update the mouse voxel updateMouseRay(); - // Set where I am looking based on my mouse ray (so that other people can see) - glm::vec3 lookAtSpot; - updateFaceshift(); updateVisage(); - _myAvatar->updateLookAtTargetAvatar(lookAtSpot); - updateMyAvatarLookAtPosition(lookAtSpot); + _myAvatar->updateLookAtTargetAvatar(); + updateMyAvatarLookAtPosition(); // Find the voxel we are hovering over, and respond if clicked float distance; @@ -2898,8 +2900,8 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { } } - bool renderMyHead = (whichCamera.getInterpolatedMode() != CAMERA_MODE_FIRST_PERSON); - _avatarManager.renderAvatars(renderMyHead, selfAvatarOnly); + bool forceRenderMyHead = (whichCamera.getInterpolatedMode() == CAMERA_MODE_MIRROR); + _avatarManager.renderAvatars(forceRenderMyHead, selfAvatarOnly); if (!selfAvatarOnly) { // Render the world box diff --git a/interface/src/Application.h b/interface/src/Application.h index ddd8d16c56..f3f4f3dbb2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -307,7 +307,7 @@ private: void updateMouseRay(); void updateFaceshift(); void updateVisage(); - void updateMyAvatarLookAtPosition(glm::vec3& lookAtSpot); + void updateMyAvatarLookAtPosition(); void updateHoverVoxels(float deltaTime, float& distance, BoxFace& face); void updateMouseVoxels(float deltaTime, float& distance, BoxFace& face); void updateHandAndTouch(float deltaTime); diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 8729ef58b6..be7e7bac50 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -123,6 +123,11 @@ void Camera::setModeShiftPeriod (float period) { const float MIN_PERIOD = 0.001f; const float MAX_PERIOD = 3.0f; _modeShiftPeriod = glm::clamp(period, MIN_PERIOD, MAX_PERIOD); + + // if a zero period was requested, we clearly want to snap immediately to the target + if (period == 0.0f) { + update(MIN_PERIOD); + } } void Camera::setMode(CameraMode m) { diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 7b95ce97f1..b5bf6ea0b7 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -55,6 +55,7 @@ public: const glm::vec3& getPosition() const { return _position; } const glm::quat& getRotation() const { return _rotation; } CameraMode getMode() const { return _mode; } + float getModeShiftPeriod() const { return _modeShiftPeriod; } const glm::vec3& getTargetPosition() const { return _targetPosition; } const glm::quat& getTargetRotation() const { return _targetRotation; } float getFieldOfView() const { return _fieldOfView; } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index f0f950adc1..e2e364c616 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -187,7 +187,7 @@ static TextRenderer* textRenderer(TextRendererType type) { return displayNameRenderer; } -void Avatar::render(bool forceRenderHead) { +void Avatar::render() { glm::vec3 toTarget = _position - Application::getInstance()->getAvatar()->getPosition(); float lengthToTarget = glm::length(toTarget); @@ -205,7 +205,7 @@ void Avatar::render(bool forceRenderHead) { getHead()->getFaceModel().renderCollisionProxies(0.7f); } if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) { - renderBody(forceRenderHead); + renderBody(); } // render sphere when far away @@ -286,16 +286,14 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::renderBody(bool forceRenderHead) { +void Avatar::renderBody() { const float BILLBOARD_DISTANCE = 40.0f; if (!_billboard.isEmpty() && getLODDistance() >= BILLBOARD_DISTANCE) { renderBillboard(); return; } _skeletonModel.render(1.0f); - if (forceRenderHead) { - getHead()->render(1.0f); - } + getHead()->render(1.0f); getHand()->render(false); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index b9433f15dc..be98254696 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -74,7 +74,7 @@ public: void init(); void simulate(float deltaTime); - void render(bool forceRenderHead); + void render(); //setters void setDisplayingLookatVectors(bool displayingLookatVectors) { getHead()->setRenderLookatVectors(displayingLookatVectors); } @@ -176,7 +176,7 @@ private: bool _initialized; QScopedPointer _billboardTexture; - void renderBody(bool forceRenderHead); + void renderBody(); void renderBillboard(); void renderDisplayName(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index f65566fe14..fed6716ffa 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -69,7 +69,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { simulateAvatarFades(deltaTime); } -void AvatarManager::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) { +void AvatarManager::renderAvatars(bool forceRenderMyHead, bool selfAvatarOnly) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::renderAvatars()"); bool renderLookAtVectors = Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors); @@ -83,16 +83,16 @@ void AvatarManager::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) { avatar->init(); } if (avatar == static_cast(_myAvatar.data())) { - avatar->render(forceRenderHead); + _myAvatar->render(forceRenderMyHead); } else { - avatar->render(true); + avatar->render(); } avatar->setDisplayingLookatVectors(renderLookAtVectors); } renderAvatarFades(); } else { // just render myAvatar - _myAvatar->render(forceRenderHead); + _myAvatar->render(forceRenderMyHead); _myAvatar->setDisplayingLookatVectors(renderLookAtVectors); } } @@ -121,7 +121,7 @@ void AvatarManager::renderAvatarFades() { foreach(const AvatarSharedPointer& fadingAvatar, _avatarFades) { Avatar* avatar = static_cast(fadingAvatar.data()); - avatar->render(false); + avatar->render(); } } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 115423e618..24921f45dd 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -30,7 +30,7 @@ public: MyAvatar* getMyAvatar() { return _myAvatar.data(); } void updateOtherAvatars(float deltaTime); - void renderAvatars(bool forceRenderHead, bool selfAvatarOnly = false); + void renderAvatars(bool forceRenderMyHead, bool selfAvatarOnly = false); void clearOtherAvatars(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 3bb156edcf..50b182c20c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -669,7 +669,7 @@ void MyAvatar::orbit(const glm::vec3& position, int deltaX, int deltaY) { setPosition(position + rotation * (getPosition() - position)); } -void MyAvatar::updateLookAtTargetAvatar(glm::vec3 &eyePosition) { +void MyAvatar::updateLookAtTargetAvatar() { Application* applicationInstance = Application::getInstance(); if (!applicationInstance->isMousePressed()) { @@ -683,14 +683,9 @@ void MyAvatar::updateLookAtTargetAvatar(glm::vec3 &eyePosition) { } float distance; if (avatar->findRayIntersection(mouseOrigin, mouseDirection, distance)) { - // rescale to compensate for head embiggening - eyePosition = (avatar->getHead()->calculateAverageEyePosition() - avatar->getHead()->getScalePivot()) * - (avatar->getScale() / avatar->getHead()->getScale()) + avatar->getHead()->getScalePivot(); _lookAtTargetAvatar = avatarPointer; return; - } else { } - } _lookAtTargetAvatar.clear(); } @@ -724,9 +719,10 @@ void MyAvatar::renderBody(bool forceRenderHead) { _skeletonModel.render(1.0f); // Render head so long as the camera isn't inside it - const float RENDER_HEAD_CUTOFF_DISTANCE = 0.10f; + const float RENDER_HEAD_CUTOFF_DISTANCE = 0.40f; Camera* myCamera = Application::getInstance()->getCamera(); - if (forceRenderHead || (glm::length(myCamera->getPosition() - getHead()->calculateAverageEyePosition()) > RENDER_HEAD_CUTOFF_DISTANCE)) { + if (forceRenderHead || (glm::length(myCamera->getPosition() - getHead()->calculateAverageEyePosition()) > + RENDER_HEAD_CUTOFF_DISTANCE * _scale)) { getHead()->render(1.0f); } getHand()->render(true); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 2b5be47419..2e80a9408d 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -81,7 +81,7 @@ public: void orbit(const glm::vec3& position, int deltaX, int deltaY); AvatarData* getLookAtTargetAvatar() const { return _lookAtTargetAvatar.data(); } - void updateLookAtTargetAvatar(glm::vec3& eyePosition); + void updateLookAtTargetAvatar(); void clearLookAtTargetAvatar(); virtual void setFaceModelURL(const QUrl& faceModelURL);