From 9645cd98310651fb163cf8c4897ae0d38843b9f7 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sat, 28 Sep 2013 15:18:59 -0700 Subject: [PATCH] Click on voxels as way of moving around --- interface/src/Application.cpp | 11 +++++++++++ interface/src/avatar/MyAvatar.cpp | 29 ++++++++++++++++++++++++++--- interface/src/avatar/MyAvatar.h | 3 +++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f10f98c3b3..ed1e513b91 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1001,6 +1001,17 @@ void Application::mousePressEvent(QMouseEvent* event) { _audio.startCollisionSound(1.0, frequency, 0.0, HOVER_VOXEL_DECAY); _isHoverVoxelSounding = true; + + const float PERCENTAGE_TO_MOVE_TOWARD = 0.90f; + glm::vec3 newTarget = getMouseVoxelWorldCoordinates(_hoverVoxel); + glm::vec3 myPosition = _myAvatar.getPosition(); + + // If there is not an action tool set (add, delete, color), move to this voxel + if (!(Menu::getInstance()->isOptionChecked(MenuOption::VoxelAddMode) || + Menu::getInstance()->isOptionChecked(MenuOption::VoxelDeleteMode) || + Menu::getInstance()->isOptionChecked(MenuOption::VoxelColorMode))) { + _myAvatar.setMoveTarget(myPosition + (newTarget - myPosition) * PERCENTAGE_TO_MOVE_TOWARD); + } } } else if (event->button() == Qt::RightButton && Menu::getInstance()->isVoxelModeActionChecked()) { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4f7535318a..96b9877ede 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -50,7 +50,9 @@ MyAvatar::MyAvatar(Node* owningNode) : _lastCollisionPosition(0, 0, 0), _speedBrakes(false), _isThrustOn(false), - _thrustMultiplier(1.0f) + _thrustMultiplier(1.0f), + _moveTarget(0,0,0), + _moveTargetStepCounter(0) { for (int i = 0; i < MAX_DRIVE_KEYS; i++) { _driveKeys[i] = false; @@ -64,6 +66,11 @@ void MyAvatar::reset() { _hand.reset(); } +void MyAvatar::setMoveTarget(const glm::vec3 moveTarget) { + _moveTarget = moveTarget; + _moveTargetStepCounter = 0; +} + void MyAvatar::simulate(float deltaTime, Transmitter* transmitter) { glm::quat orientation = getOrientation(); @@ -165,8 +172,10 @@ void MyAvatar::simulate(float deltaTime, Transmitter* transmitter) { if (glm::length(_position - _lastCollisionPosition) > MIN_DISTANCE_AFTER_COLLISION_FOR_GRAVITY) { _velocity += _scale * _gravity * (GRAVITY_EARTH * deltaTime); } + + // Only collide if we are not moving to a target + if (_isCollisionsOn && (glm::length(_moveTarget) < EPSILON)) { - if (_isCollisionsOn) { Camera* myCamera = Application::getInstance()->getCamera(); if (myCamera->getMode() == CAMERA_MODE_FIRST_PERSON && !OculusManager::isConnected()) { @@ -324,7 +333,21 @@ void MyAvatar::simulate(float deltaTime, Transmitter* transmitter) { const float MOVING_SPEED_THRESHOLD = 0.01f; _moving = _speed > MOVING_SPEED_THRESHOLD; - // update position by velocity, and subtract the change added earlier for gravity + // If a move target is set, update position explicitly + const float MOVE_FINISHED_TOLERANCE = 0.1f; + const float MOVE_SPEED_FACTOR = 2.f; + const int MOVE_TARGET_MAX_STEPS = 250; + if ((glm::length(_moveTarget) > EPSILON) && (_moveTargetStepCounter < MOVE_TARGET_MAX_STEPS)) { + if (glm::length(_position - _moveTarget) > MOVE_FINISHED_TOLERANCE) { + _position += (_moveTarget - _position) * (deltaTime * MOVE_SPEED_FACTOR); + _moveTargetStepCounter++; + } else { + // Move completed + _moveTarget = glm::vec3(0,0,0); + _moveTargetStepCounter = 0; + } + } + _position += _velocity * deltaTime; // Zero thrust out now that we've added it to velocity in this frame diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d0f7d74bf4..95c1efd5a8 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -31,6 +31,7 @@ public: void setOrientation(const glm::quat& orientation); void setNewScale(const float scale); void setWantCollisionsOn(bool wantCollisionsOn) { _isCollisionsOn = wantCollisionsOn; } + void setMoveTarget(const glm::vec3 moveTarget); // getters float getNewScale() const { return _newScale; } @@ -73,6 +74,8 @@ public: bool _isThrustOn; float _thrustMultiplier; float _collisionRadius; + glm::vec3 _moveTarget; + int _moveTargetStepCounter; // private methods float getBallRenderAlpha(int ball, bool lookingInMirror) const;