diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d9973bee02..edcbaa3b7b 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include "Application.h" #include "InterfaceConfig.h" @@ -1689,6 +1690,22 @@ void Application::init() { const float MAX_AVATAR_EDIT_VELOCITY = 1.0f; const float MAX_VOXEL_EDIT_DISTANCE = 20.0f; +bool Application::isLookingAtOtherAvatar(glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection, glm::vec3 &eyePosition) { + NodeList* nodeList = NodeList::getInstance(); + for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { + if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) { + Avatar *avatar = (Avatar *)node->getLinkedData(); + glm::vec3 headPosition = avatar->getHead().getPosition(); + glm::vec3 intersectionPosition, intersectionNormal; + if (glm::intersectRaySphere(mouseRayOrigin, mouseRayDirection, headPosition, 1, intersectionPosition, intersectionNormal)) { + eyePosition = avatar->getHead().getEyeLevelPosition(); + return true; + } + } + } + return false; +} + void Application::update(float deltaTime) { // Use Transmitter Hand to move hand if connected, else use mouse if (_myTransmitter.isConnected()) { @@ -1715,8 +1732,15 @@ void Application::update(float deltaTime) { _myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection); // Set where I am looking based on my mouse ray (so that other people can see) - glm::vec3 myLookAtFromMouse(mouseRayOrigin + mouseRayDirection); - _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + glm::vec3 eyePosition; + if (isLookingAtOtherAvatar(mouseRayOrigin, mouseRayDirection, eyePosition)) { + // If the mouse is over another avatar's head... + glm::vec3 myLookAtFromMouse(eyePosition); + _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + } else { + glm::vec3 myLookAtFromMouse(mouseRayOrigin + mouseRayDirection); + _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); + } // If we are dragging on a voxel, add thrust according to the amount the mouse is dragging const float VOXEL_GRAB_THRUST = 0.0f; diff --git a/interface/src/Application.h b/interface/src/Application.h index 2b4bd27a3d..7649cfab6a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -168,6 +168,7 @@ private: void init(); void update(float deltaTime); + bool isLookingAtOtherAvatar(glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection, glm::vec3 &eyePosition); void updateAvatar(float deltaTime); void loadViewFrustum(Camera& camera, ViewFrustum& viewFrustum); diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 6ad44e1078..35b9dabba5 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -54,6 +54,7 @@ Head::Head(Avatar* owningAvatar) : _rotation(0.0f, 0.0f, 0.0f), _leftEyePosition(0.0f, 0.0f, 0.0f), _rightEyePosition(0.0f, 0.0f, 0.0f), + _eyeLevelPosition(0.0f, 0.0f, 0.0f), _leftEyeBrowPosition(0.0f, 0.0f, 0.0f), _rightEyeBrowPosition(0.0f, 0.0f, 0.0f), _leftEarPosition(0.0f, 0.0f, 0.0f), @@ -269,6 +270,8 @@ void Head::calculateGeometry() { + up * _scale * EYE_UP_OFFSET + front * _scale * EYE_FRONT_OFFSET; + _eyeLevelPosition = _position + up * _scale * EYE_UP_OFFSET; + //calculate the eyebrow positions _leftEyeBrowPosition = _leftEyePosition; _rightEyeBrowPosition = _rightEyePosition; diff --git a/interface/src/Head.h b/interface/src/Head.h index e8bcfb5277..f6c872cb99 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -54,6 +54,7 @@ public: glm::quat getCameraOrientation () const; glm::vec3 getPosition() const { return _position; } + glm::vec3 getEyeLevelPosition() const { return _eyeLevelPosition; } glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; } glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; } glm::vec3 getFrontDirection() const { return getOrientation() * IDENTITY_FRONT; } @@ -88,7 +89,8 @@ private: glm::vec3 _position; glm::vec3 _rotation; glm::vec3 _leftEyePosition; - glm::vec3 _rightEyePosition; + glm::vec3 _rightEyePosition; + glm::vec3 _eyeLevelPosition; glm::vec3 _leftEyeBrowPosition; glm::vec3 _rightEyeBrowPosition; glm::vec3 _leftEarPosition;