From 3ab2db96b6ecd0d43d15dad43143f81a52c93218 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 30 Jan 2019 14:42:47 -0800 Subject: [PATCH] deactivate grab action when grab is released --- interface/src/avatar/MyAvatar.cpp | 5 ++++- .../avatars-renderer/src/avatars-renderer/Avatar.cpp | 2 +- libraries/entities/src/EntityDynamicInterface.h | 1 + libraries/entities/src/EntityItem.cpp | 10 ++++++++++ libraries/entities/src/EntityItem.h | 1 + libraries/shared/src/Grab.h | 10 +++++----- libraries/shared/src/SpatiallyNestable.cpp | 2 +- libraries/shared/src/SpatiallyNestable.h | 1 + 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index a0dd817742..0530ba8eb2 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -5306,7 +5306,10 @@ void MyAvatar::releaseGrab(const QUuid& grabID) { if (itr != _avatarGrabs.end()) { GrabPointer grab = itr->second; if (grab) { - grab->setDeleted(true); + grab->setReleased(true); + bool success; + SpatiallyNestablePointer target = SpatiallyNestable::findByID(grab->getTargetID(), success); + target->disableGrab(grab); } } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 4bfaea0617..b8626c813e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -412,7 +412,7 @@ void Avatar::accumulateGrabPositions(std::map& g if (!grab || !grab->getActionID().isNull()) { continue; // the accumulated value isn't used, in this case. } - if (grab->getDeleted()) { + if (grab->getReleased()) { continue; } diff --git a/libraries/entities/src/EntityDynamicInterface.h b/libraries/entities/src/EntityDynamicInterface.h index 836dae2057..c911eda471 100644 --- a/libraries/entities/src/EntityDynamicInterface.h +++ b/libraries/entities/src/EntityDynamicInterface.h @@ -59,6 +59,7 @@ public: virtual bool isReadyForAdd() const { return true; } bool isActive() { return _active; } + void deactivate() { _active = false; } virtual void removeFromSimulation(EntitySimulationPointer simulation) const = 0; virtual EntityItemWeakPointer getOwnerEntity() const = 0; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 41e4f43a5d..1640e97ff4 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -3506,3 +3506,13 @@ void EntityItem::removeGrab(GrabPointer grab) { } disableNoBootstrap(); } + +void EntityItem::disableGrab(GrabPointer grab) { + QUuid actionID = grab->getActionID(); + if (!actionID.isNull()) { + EntityDynamicPointer action = _grabActions.value(actionID); + if (action) { + action->deactivate(); + } + } +} diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index ec7ad78313..27b207b6f3 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -561,6 +561,7 @@ public: virtual void addGrab(GrabPointer grab) override; virtual void removeGrab(GrabPointer grab) override; + virtual void disableGrab(GrabPointer grab) override; signals: void requestRenderUpdate(); diff --git a/libraries/shared/src/Grab.h b/libraries/shared/src/Grab.h index 59602439f7..f16a80befa 100644 --- a/libraries/shared/src/Grab.h +++ b/libraries/shared/src/Grab.h @@ -49,7 +49,7 @@ public: _hand(newHand), _positionalOffset(newPositionalOffset), _rotationalOffset(newRotationalOffset), - _deleted(false) {} + _released(false) {} QByteArray toByteArray(); bool fromByteArray(const QByteArray& grabData); @@ -62,7 +62,7 @@ public: _positionalOffset = other->_positionalOffset; _rotationalOffset = other->_rotationalOffset; _actionID = other->_actionID; - _deleted = other->_deleted; + _released = other->_released; return *this; } @@ -87,8 +87,8 @@ public: glm::quat getRotationalOffset() const { return _rotationalOffset; } void setRotationalOffset(glm::quat rotationalOffset) { _rotationalOffset = rotationalOffset; } - bool getDeleted() const { return _deleted; } - void setDeleted(bool value) { _deleted = value; } + bool getReleased() const { return _released; } + void setReleased(bool value) { _released = value; } protected: QUuid _actionID; // if an action is created in bullet for this grab, this is the ID @@ -98,7 +98,7 @@ protected: QString _hand; // "left" or "right" glm::vec3 _positionalOffset; // relative to joint glm::quat _rotationalOffset; // relative to joint - bool _deleted { false }; // scheduled for deletion + bool _released { false }; // released and scheduled for deletion }; diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index dd0d749919..d3ed79faf4 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -1391,7 +1391,7 @@ bool SpatiallyNestable::hasGrabs() { bool result { false }; _grabsLock.withReadLock([&] { foreach (const GrabPointer &grab, _grabs) { - if (grab && !grab->getDeleted()) { + if (grab && !grab->getReleased()) { result = true; break; } diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index ed432647fd..e7a449f73f 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -218,6 +218,7 @@ public: virtual void addGrab(GrabPointer grab); virtual void removeGrab(GrabPointer grab); + virtual void disableGrab(GrabPointer grab) {}; bool hasGrabs(); virtual QUuid getEditSenderID();