From f3948d5e623c7d69388d3525a142462708e1ae82 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 2 May 2014 15:02:40 -0700 Subject: [PATCH] If "collide with avatars" is off, don't attempt camera pushback. --- interface/src/Application.cpp | 65 ++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c6308193d0..7fc241daf8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -555,41 +555,42 @@ void Application::paintGL() { _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition()); _myCamera.setTargetRotation(_myAvatar->getHead()->getCameraOrientation()); - glm::vec3 planeNormal = _myCamera.getTargetRotation() * IDENTITY_FRONT; - const float BASE_PUSHBACK_RADIUS = 0.25f; - float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS; - glm::vec4 plane(planeNormal, -glm::dot(planeNormal, _myCamera.getTargetPosition()) - pushbackRadius); + if (Menu::getInstance()->isOptionChecked(MenuOption::CollideWithAvatars)) { + glm::vec3 planeNormal = _myCamera.getTargetRotation() * IDENTITY_FRONT; + const float BASE_PUSHBACK_RADIUS = 0.25f; + float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS; + glm::vec4 plane(planeNormal, -glm::dot(planeNormal, _myCamera.getTargetPosition()) - pushbackRadius); - // push camera out of any intersecting avatars - foreach (const AvatarSharedPointer& avatarData, _avatarManager.getAvatarHash()) { - Avatar* avatar = static_cast(avatarData.data()); - if (avatar->isMyAvatar()) { - continue; - } - if (glm::distance(avatar->getPosition(), _myCamera.getTargetPosition()) > - avatar->getBoundingRadius() + pushbackRadius) { - continue; - } - float angle = angleBetween(avatar->getPosition() - _myCamera.getTargetPosition(), planeNormal); - if (angle > PI_OVER_TWO) { - continue; - } - float scale = 1.0f - angle / PI_OVER_TWO; - scale = qMin(1.0f, scale * 2.5f); - static CollisionList collisions(64); - collisions.clear(); - if (!avatar->findPlaneCollisions(plane, collisions)) { - continue; - } - for (int i = 0; i < collisions.size(); i++) { - pushback = qMax(pushback, glm::length(collisions.getCollision(i)->_penetration) * scale); + // push camera out of any intersecting avatars + foreach (const AvatarSharedPointer& avatarData, _avatarManager.getAvatarHash()) { + Avatar* avatar = static_cast(avatarData.data()); + if (avatar->isMyAvatar()) { + continue; + } + if (glm::distance(avatar->getPosition(), _myCamera.getTargetPosition()) > + avatar->getBoundingRadius() + pushbackRadius) { + continue; + } + float angle = angleBetween(avatar->getPosition() - _myCamera.getTargetPosition(), planeNormal); + if (angle > PI_OVER_TWO) { + continue; + } + float scale = 1.0f - angle / PI_OVER_TWO; + scale = qMin(1.0f, scale * 2.5f); + static CollisionList collisions(64); + collisions.clear(); + if (!avatar->findPlaneCollisions(plane, collisions)) { + continue; + } + for (int i = 0; i < collisions.size(); i++) { + pushback = qMax(pushback, glm::length(collisions.getCollision(i)->_penetration) * scale); + } } + const float MAX_PUSHBACK = 0.35f; + pushback = qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()); + const float BASE_PUSHBACK_FOCAL_LENGTH = 0.5f; + pushbackFocalLength = BASE_PUSHBACK_FOCAL_LENGTH * _myAvatar->getScale(); } - const float MAX_PUSHBACK = 0.35f; - pushback = qMin(pushback, MAX_PUSHBACK * _myAvatar->getScale()); - const float BASE_PUSHBACK_FOCAL_LENGTH = 0.5f; - pushbackFocalLength = BASE_PUSHBACK_FOCAL_LENGTH * _myAvatar->getScale(); - } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing _myCamera.setTargetPosition(_myAvatar->getUprightHeadPosition());