From 4dec1832627760a68357e54463c3e21a91d3ff6e Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 26 Sep 2013 12:07:13 -0700 Subject: [PATCH] Enlarge heads when they're moused over. --- interface/src/Application.cpp | 14 ++++++++++---- interface/src/Application.h | 5 +++++ interface/src/avatar/Avatar.cpp | 13 ++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 20b0f6e0af..47544e408a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1596,10 +1596,14 @@ const float MAX_AVATAR_EDIT_VELOCITY = 1.0f; const float MAX_VOXEL_EDIT_DISTANCE = 20.0f; const float HEAD_SPHERE_RADIUS = 0.07; - static uint16_t DEFAULT_NODE_ID_REF = 1; - +void Application::updateLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, + glm::vec3& eyePosition) { + + _lookatTargetAvatar = findLookatTargetAvatar(mouseRayOrigin, mouseRayDirection, eyePosition, DEFAULT_NODE_ID_REF); +} + Avatar* Application::findLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, glm::vec3& eyePosition, uint16_t& nodeID = DEFAULT_NODE_ID_REF) { @@ -1748,7 +1752,7 @@ void Application::update(float deltaTime) { _faceshift.getEstimatedEyePitch(), _faceshift.getEstimatedEyeYaw(), 0.0f))) * glm::vec3(0.0f, 0.0f, -1.0f); } - _lookatTargetAvatar = findLookatTargetAvatar(lookAtRayOrigin, lookAtRayDirection, lookAtSpot); + updateLookatTargetAvatar(lookAtRayOrigin, lookAtRayDirection, lookAtSpot); if (_lookatTargetAvatar) { // If the mouse is over another avatar's head... _myAvatar.getHead().setLookAtPosition(lookAtSpot); @@ -2070,7 +2074,7 @@ void Application::updateAvatar(float deltaTime) { _viewFrustum.computePickRay(MIDPOINT_OF_SCREEN, MIDPOINT_OF_SCREEN, screenCenterRayOrigin, screenCenterRayDirection); glm::vec3 eyePosition; - _lookatTargetAvatar = findLookatTargetAvatar(screenCenterRayOrigin, screenCenterRayDirection, eyePosition); + updateLookatTargetAvatar(screenCenterRayOrigin, screenCenterRayDirection, eyePosition); if (_lookatTargetAvatar) { glm::vec3 myLookAtFromMouse(eyePosition); _myAvatar.getHead().setLookAtPosition(myLookAtFromMouse); @@ -3415,6 +3419,8 @@ void Application::nodeKilled(Node* node) { fade.voxelDetails.s = fade.voxelDetails.s * slightly_smaller; _voxelFades.push_back(fade); } + } else if (node->getLinkedData() == _lookatTargetAvatar) { + _lookatTargetAvatar = NULL; } } diff --git a/interface/src/Application.h b/interface/src/Application.h index c14434edc8..5541f84573 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -130,6 +130,8 @@ public: TextureCache* getTextureCache() { return &_textureCache; } GlowEffect* getGlowEffect() { return &_glowEffect; } + Avatar* getLookatTargetAvatar() const { return _lookatTargetAvatar; } + static void controlledBroadcastToNodes(unsigned char* broadcastData, size_t dataBytes, const char* nodeTypes, int numNodeTypes); @@ -195,6 +197,9 @@ private: void init(); void update(float deltaTime); + + void updateLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, + glm::vec3& eyePosition); Avatar* findLookatTargetAvatar(const glm::vec3& mouseRayOrigin, const glm::vec3& mouseRayDirection, glm::vec3& eyePosition, uint16_t& nodeID); bool isLookingAtMyAvatar(Avatar* avatar); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 1d50416b73..8aba7f8b4d 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -388,9 +388,20 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter, float gyroCamer } } + // head scale grows when avatar is looked at + if (Application::getInstance()->getLookatTargetAvatar() == this) { + const float BASE_MAX_SCALE = 3.0f; + const float GROW_SPEED = 0.1f; + _head.setScale(min(BASE_MAX_SCALE * glm::distance(_position, Application::getInstance()->getCamera()->getPosition()), + _head.getScale() + deltaTime * GROW_SPEED)); + + } else { + const float SHRINK_SPEED = 100.0f; + _head.setScale(max(_scale, _head.getScale() - deltaTime * SHRINK_SPEED)); + } + _head.setBodyRotation(glm::vec3(_bodyPitch, _bodyYaw, _bodyRoll)); _head.setPosition(_bodyBall[ BODY_BALL_HEAD_BASE ].position); - _head.setScale(_scale); _head.setSkinColor(glm::vec3(SKIN_COLOR[0], SKIN_COLOR[1], SKIN_COLOR[2])); _head.simulate(deltaTime, false, gyroCameraSensitivity); _hand.simulate(deltaTime, false);