From 88fc74374be9d2d0e5f3ad8b5d05f7a879ecf098 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 29 Jun 2015 19:27:10 -0700 Subject: [PATCH] if a hold action is edited by a local script, mark it as 'mine'. if it's not 'mine', let the spring action handle the wire protocol --- interface/src/avatar/AvatarActionHold.cpp | 74 ++++++-------------- interface/src/avatar/AvatarActionHold.h | 6 +- libraries/physics/src/ObjectActionSpring.cpp | 7 ++ 3 files changed, 32 insertions(+), 55 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index a5283f82ef..d7a0ed3b2a 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -18,7 +18,12 @@ const uint16_t AvatarActionHold::holdVersion = 1; AvatarActionHold::AvatarActionHold(EntityActionType type, QUuid id, EntityItemPointer ownerEntity) : - ObjectActionSpring(type, id, ownerEntity) { + ObjectActionSpring(type, id, ownerEntity), + _relativePosition(glm::vec3(0.0f)), + _relativeRotation(glm::quat()), + _hand("right"), + _mine(false) +{ #if WANT_DEBUG qDebug() << "AvatarActionHold::AvatarActionHold"; #endif @@ -31,6 +36,13 @@ AvatarActionHold::~AvatarActionHold() { } void AvatarActionHold::updateActionWorker(float deltaTimeStep) { + if (!_mine) { + // if a local script isn't updating this, then we are just getting spring-action data over the wire. + // let the super-class handle it. + ObjectActionSpring::updateActionWorker(deltaTimeStep); + return; + } + auto myAvatar = DependencyManager::get()->getMyAvatar(); if (!tryLockForRead()) { @@ -95,20 +107,20 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { lockForWrite(); if (rPOk) { _relativePosition = relativePosition; - } else if (!_parametersSet) { + } else { _relativePosition = glm::vec3(0.0f, 0.0f, 1.0f); } if (rROk) { _relativeRotation = relativeRotation; - } else if (!_parametersSet) { + } else { _relativeRotation = glm::quat(0.0f, 0.0f, 0.0f, 1.0f); } if (tSOk) { _linearTimeScale = timeScale; _angularTimeScale = timeScale; - } else if (!_parametersSet) { + } else { _linearTimeScale = 0.2f; _angularTimeScale = 0.2f; } @@ -123,11 +135,11 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { qDebug() << "hold action -- invalid hand argument:" << hand; _hand = "right"; } - } else if (!_parametersSet) { + } else { _hand = "right"; } - _parametersSet = true; + _mine = true; _positionalTargetSet = true; _rotationalTargetSet = true; _active = true; @@ -139,57 +151,15 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { QVariantMap AvatarActionHold::getArguments() { QVariantMap arguments; lockForRead(); - if (_parametersSet) { + if (_mine) { arguments["relativePosition"] = glmToQMap(_relativePosition); arguments["relativeRotation"] = glmToQMap(_relativeRotation); arguments["timeScale"] = _linearTimeScale; arguments["hand"] = _hand; + } else { + unlock(); + return ObjectActionSpring::getArguments(); } unlock(); return arguments; } - - -QByteArray AvatarActionHold::serialize() { - QByteArray ba; - QDataStream dataStream(&ba, QIODevice::WriteOnly); - - dataStream << getType(); - dataStream << getID(); - dataStream << AvatarActionHold::holdVersion; - - dataStream << _relativePosition; - dataStream << _relativeRotation; - dataStream << _hand; - dataStream << _linearTimeScale; - - return ba; -} - -void AvatarActionHold::deserialize(QByteArray serializedArguments) { - QDataStream dataStream(serializedArguments); - - EntityActionType type; - QUuid id; - uint16_t serializationVersion; - - dataStream >> type; - assert(type == getType()); - dataStream >> id; - assert(id == getID()); - dataStream >> serializationVersion; - if (serializationVersion != AvatarActionHold::holdVersion) { - return; - } - - dataStream >> _relativePosition; - dataStream >> _relativeRotation; - dataStream >> _hand; - dataStream >> _linearTimeScale; - _angularTimeScale = _linearTimeScale; - - _parametersSet = true; - - // XXX don't enable hold actions from remote nodes - // _active = true; -} diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index fd92944302..83bef84b3c 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -29,8 +29,8 @@ public: virtual void updateActionWorker(float deltaTimeStep); - virtual QByteArray serialize(); - virtual void deserialize(QByteArray serializedArguments); + // virtual QByteArray serialize(); + // virtual void deserialize(QByteArray serializedArguments); private: static const uint16_t holdVersion; @@ -38,7 +38,7 @@ private: glm::vec3 _relativePosition; glm::quat _relativeRotation; QString _hand; - bool _parametersSet = false; + bool _mine = false; }; #endif // hifi_AvatarActionHold_h diff --git a/libraries/physics/src/ObjectActionSpring.cpp b/libraries/physics/src/ObjectActionSpring.cpp index 715c0bc4e4..9a20572b8c 100644 --- a/libraries/physics/src/ObjectActionSpring.cpp +++ b/libraries/physics/src/ObjectActionSpring.cpp @@ -13,6 +13,8 @@ #include "ObjectActionSpring.h" +const float SPRING_MAX_SPEED = 10.0f; + const uint16_t ObjectActionSpring::springVersion = 1; ObjectActionSpring::ObjectActionSpring(EntityActionType type, QUuid id, EntityItemPointer ownerEntity) : @@ -70,6 +72,11 @@ void ObjectActionSpring::updateActionWorker(btScalar deltaTimeStep) { float offsetLength = glm::length(offset); float speed = offsetLength / _linearTimeScale; + // cap speed + if (speed > SPRING_MAX_SPEED) { + speed = SPRING_MAX_SPEED; + } + if (offsetLength > IGNORE_POSITION_DELTA) { glm::vec3 newVelocity = glm::normalize(offset) * speed; rigidBody->setLinearVelocity(glmToBullet(newVelocity));