diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d0d071a141..24d31b9442 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2884,7 +2884,8 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) { } } - _avatarManager.renderAvatars(whichCamera.getMode() == CAMERA_MODE_MIRROR, selfAvatarOnly); + bool renderMyHead = (whichCamera.getInterpolatedMode() != CAMERA_MODE_FIRST_PERSON); + _avatarManager.renderAvatars(renderMyHead, selfAvatarOnly); if (!selfAvatarOnly) { // Render the world box diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 94bc693c2b..d3a126c38a 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -36,6 +36,7 @@ Camera::Camera() { _modeShiftRate = 1.0f; _linearModeShift = 0.0f; _mode = CAMERA_MODE_THIRD_PERSON; + _prevMode = CAMERA_MODE_THIRD_PERSON; _tightness = 10.0f; // default _fieldOfView = DEFAULT_FIELD_OF_VIEW_DEGREES; _aspectRatio = 16.f/9.f; @@ -123,6 +124,7 @@ void Camera::setModeShiftRate ( float rate ) { void Camera::setMode(CameraMode m) { + _prevMode = _mode; _mode = m; _modeShift = 0.0; _linearModeShift = 0.0; @@ -199,6 +201,17 @@ bool Camera::getFrustumNeedsReshape() const { return _frustumNeedsReshape; } +// call this when deciding whether to render the head or not +CameraMode Camera::getInterpolatedMode() const { + const float SHIFT_THRESHOLD_INTO_FIRST_PERSON = 0.7f; + const float SHIFT_THRESHOLD_OUT_OF_FIRST_PERSON = 0.6f; + if (_mode == CAMERA_MODE_FIRST_PERSON && _linearModeShift < SHIFT_THRESHOLD_INTO_FIRST_PERSON || + _prevMode == CAMERA_MODE_FIRST_PERSON && _linearModeShift < SHIFT_THRESHOLD_OUT_OF_FIRST_PERSON) { + return _prevMode; + } + return _mode; +} + // call this after reshaping the view frustum void Camera::setFrustumWasReshaped() { _frustumNeedsReshape = false; diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 615135bc80..7fc9b47634 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -61,6 +61,8 @@ public: const glm::quat& getEyeOffsetOrientation () const { return _eyeOffsetOrientation; } float getScale () const { return _scale; } + CameraMode getInterpolatedMode() const; + bool getFrustumNeedsReshape() const; // call to find out if the view frustum needs to be reshaped void setFrustumWasReshaped(); // call this after reshaping the view frustum. @@ -68,6 +70,7 @@ private: bool _needsToInitialize; CameraMode _mode; + CameraMode _prevMode; bool _frustumNeedsReshape; glm::vec3 _position; glm::vec3 _idealPosition; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4b4c189729..259bf994e0 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -242,7 +242,9 @@ void Avatar::renderBody(bool forceRenderHead) { glm::vec3 pos = getPosition(); //printf("Render other at %.3f, %.2f, %.2f\n", pos.x, pos.y, pos.z); _skeletonModel.render(1.0f); - _head.render(1.0f); + if (forceRenderHead) { + _head.render(1.0f); + } _hand.render(false); } diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index d98d30cf6a..a4a85f5770 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -75,7 +75,6 @@ void AvatarManager::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) { bool renderLookAtVectors = Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors); if (!selfAvatarOnly) { - // Render avatars of other nodes foreach (const AvatarSharedPointer& avatarPointer, _avatarHash) { Avatar* avatar = static_cast(avatarPointer.data()); if (!avatar->isInitialized()) { @@ -84,7 +83,7 @@ void AvatarManager::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) { if (avatar == static_cast(_myAvatar.data())) { avatar->render(forceRenderHead); } else { - avatar->render(false); + avatar->render(true); } avatar->setDisplayingLookatVectors(renderLookAtVectors); }