From 177471e83ba0ac310c8b7d73b4a9a58576932e1d Mon Sep 17 00:00:00 2001 From: atlante45 Date: Wed, 24 Jul 2013 11:24:28 -0700 Subject: [PATCH 1/3] First step toward follow mode --- interface/src/Application.cpp | 14 +++++++++++++- interface/src/Application.h | 4 ++++ interface/src/avatar/Avatar.cpp | 6 ++++++ interface/src/avatar/Avatar.h | 24 ++++++++++++------------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ed47262942..9edfeafcbf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1982,7 +1982,14 @@ void Application::init() { _palette.addTool(&_swatch); _palette.addAction(_colorVoxelMode, 0, 2); _palette.addAction(_eyedropperMode, 0, 3); - _palette.addAction(_selectVoxelMode, 0, 4); + _palette.addAction(_selectVoxelMode, 0, 4); + + _pieMenu.init("./resources/images/hifi-interface-tools-v2-pie.svg", + _glWidget->width(), + _glWidget->height()); + _followMode = new QAction(this); + connect(_followMode, SIGNAL(triggered()), this, SLOT(toggleFollowMode())); + _pieMenu.addAction(_followMode); } @@ -3400,6 +3407,11 @@ void Application::goHome() { _myAvatar.setPosition(START_LOCATION); } + +void Application::toggleFollowMode() { + +} + void Application::resetSensors() { _headMouseX = _mouseX = _glWidget->width() / 2; _headMouseY = _mouseY = _glWidget->height() / 2; diff --git a/interface/src/Application.h b/interface/src/Application.h index 66f17dd9cb..6bc9c2acc2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -189,6 +189,8 @@ private slots: glm::vec2 getScaledScreenPoint(glm::vec2 projectedPoint); void goHome(); + void toggleFollowMode(); + private: static void controlledBroadcastToNodes(unsigned char* broadcastData, size_t dataBytes, @@ -292,6 +294,8 @@ private: QAction* _simulateLeapHand; // When there's no Leap, use this to pretend there is one and feed fake hand data QAction* _testRaveGlove; // Test fancy sparkle-rave-glove mode + + QAction* _followMode; BandwidthMeter _bandwidthMeter; BandwidthDialog* _bandwidthDialog; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c2a2d5aadd..a23c082cca 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -446,6 +446,12 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { _isThrustOn = (glm::length(_thrust) > EPSILON); } +void Avatar::follow(Avatar* leadingAvatar) { + _leadingAvatar = leadingAvatar; + + +} + void Avatar::simulate(float deltaTime, Transmitter* transmitter) { glm::quat orientation = getOrientation(); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index ec0d5a2ce5..ddec983d97 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -114,6 +114,7 @@ public: void reset(); void simulate(float deltaTime, Transmitter* transmitter); void updateThrust(float deltaTime, Transmitter * transmitter); + void follow(Avatar* leadingAvatar); void updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyAngle, float yawFromTouch, @@ -157,18 +158,16 @@ public: float getElapsedTimeMoving () const { return _elapsedTimeMoving;} float getElapsedTimeSinceCollision() const { return _elapsedTimeSinceCollision;} const glm::vec3& getLastCollisionPosition () const { return _lastCollisionPosition;} - float getAbsoluteHeadYaw () const; - float getAbsoluteHeadPitch () const; - Head& getHead () {return _head; } - Hand& getHand () {return _hand; } - glm::quat getOrientation () const; - glm::quat getWorldAlignedOrientation() const; - - const glm::vec3& getMouseRayOrigin() const { return _mouseRayOrigin; } - const glm::vec3& getMouseRayDirection() const { return _mouseRayDirection; } - - - glm::vec3 getGravity () const { return _gravity; } + float getAbsoluteHeadYaw () const; + float getAbsoluteHeadPitch () const; + Head& getHead () {return _head; } + Hand& getHand () {return _hand; } + glm::quat getOrientation () const; + glm::quat getWorldAlignedOrientation() const; + const glm::vec3& getMouseRayOrigin () const { return _mouseRayOrigin; } + const glm::vec3& getMouseRayDirection () const { return _mouseRayDirection; } + Avatar* getLeadingAvatar () const {return _leadingAvatar; } + glm::vec3 getGravity () const { return _gravity; } glm::vec3 getUprightHeadPosition() const; @@ -254,6 +253,7 @@ private: glm::vec3 _lastCollisionPosition; bool _speedBrakes; bool _isThrustOn; + Avatar* _leadingAvatar; AvatarVoxelSystem _voxels; From f3c87b81ec0363a42b977df1d3fa5956cfbd32bb Mon Sep 17 00:00:00 2001 From: atlante45 Date: Thu, 25 Jul 2013 16:14:47 -0700 Subject: [PATCH 2/3] Avatar can follow but don't look at the same point for the moment --- interface/src/Application.cpp | 1 - interface/src/avatar/Avatar.cpp | 47 ++++++++++++++++++++++++++++++--- interface/src/avatar/Avatar.h | 4 ++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f3b1f4a304..c7be8c014a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3421,7 +3421,6 @@ void Application::toggleFollowMode() { eyePositionIgnored, nodeIDIgnored); - qDebug("[DEBUG] toggleFollowMode() %d\n", leadingAvatar); _myAvatar.follow(leadingAvatar); } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index a613822fbf..bf9b4bb732 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -404,6 +404,32 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { _thrust += _scale * THRUST_JUMP * up; _shouldJump = false; } + + // Add thrusts from leading avatar + if (_leadingAvatar != NULL) { + glm::vec3 toTarget = _leadingAvatar->getPosition() - _position; + + if (.5f < up.x * toTarget.x + up.y * toTarget.y + up.z * toTarget.z) { + _thrust += _scale * THRUST_MAG_UP * deltaTime * up; + } else if (up.x * toTarget.x + up.y * toTarget.y + up.z * toTarget.z < -.5f) { + _thrust -= _scale * THRUST_MAG_UP * deltaTime * up; + } + + if (glm::length(_position - _leadingAvatar->getPosition()) > _scale * _stringLength) { + _thrust += _scale * THRUST_MAG_FWD * deltaTime * front; + } else { + toTarget = _leadingAvatar->getHead().getLookAtPosition(); + } + + float yawAngle = angleBetween(front, glm::vec3(toTarget.x, 0.f, toTarget.z)); + if (yawAngle < -10.f || 10.f < yawAngle){ + if (right.x * toTarget.x + right.y * toTarget.y + right.z * toTarget.z > 0) { + _bodyYawDelta -= YAW_MAG * deltaTime; + } else { + _bodyYawDelta += YAW_MAG * deltaTime; + } + } + } // Add thrusts from Transmitter if (transmitter) { @@ -448,9 +474,15 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { } void Avatar::follow(Avatar* leadingAvatar) { - _leadingAvatar = leadingAvatar; + const float MAX_STRING_LENGTH = 2; - qDebug("[DEBUG] %d\n", _leadingAvatar); + _leadingAvatar = leadingAvatar; + if (_leadingAvatar != NULL) { + _stringLength = glm::length(_position - _leadingAvatar->getPosition()) / _scale; + if (_stringLength > MAX_STRING_LENGTH) { + _stringLength = MAX_STRING_LENGTH; + } + } } void Avatar::simulate(float deltaTime, Transmitter* transmitter) { @@ -481,6 +513,13 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { if (isMyAvatar()) { updateThrust(deltaTime, transmitter); } + + // Ajust, scale, thrust and lookAt position when following an other avatar + if (isMyAvatar() && _leadingAvatar && _scale != _leadingAvatar->getScale()) { + float scale = 0.95f * _scale + 0.05f * _leadingAvatar->getScale(); + setScale(scale); + Application::getInstance()->getCamera()->setScale(scale); + } // copy velocity so we can use it later for acceleration glm::vec3 oldVelocity = getVelocity(); @@ -687,7 +726,9 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { _head.setScale(_scale); _head.setSkinColor(glm::vec3(SKIN_COLOR[0], SKIN_COLOR[1], SKIN_COLOR[2])); _head.simulate(deltaTime, isMyAvatar()); - + + + // use speed and angular velocity to determine walking vs. standing if (_speed + fabs(_bodyYawDelta) > 0.2) { _mode = AVATAR_MODE_WALKING; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 02f360f83f..c69cbbadbf 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -253,8 +253,10 @@ private: glm::vec3 _lastCollisionPosition; bool _speedBrakes; bool _isThrustOn; + Avatar* _leadingAvatar; - + float _stringLength; + AvatarVoxelSystem _voxels; // private methods... From 1b2f236d42d009e9b71eb2500fdcf9f557785c6d Mon Sep 17 00:00:00 2001 From: atlante45 Date: Tue, 30 Jul 2013 12:30:15 -0700 Subject: [PATCH 3/3] Follow mode operationnal --- interface/src/avatar/Avatar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index bf9b4bb732..f832b9276f 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -418,7 +418,8 @@ void Avatar::updateThrust(float deltaTime, Transmitter * transmitter) { if (glm::length(_position - _leadingAvatar->getPosition()) > _scale * _stringLength) { _thrust += _scale * THRUST_MAG_FWD * deltaTime * front; } else { - toTarget = _leadingAvatar->getHead().getLookAtPosition(); + toTarget = _leadingAvatar->getHead().getLookAtPosition() - _position; + getHead().setLookAtPosition(_leadingAvatar->getHead().getLookAtPosition()); } float yawAngle = angleBetween(front, glm::vec3(toTarget.x, 0.f, toTarget.z));