From b1dc5be316914934549043f304d4f780981873eb Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 14 Apr 2017 11:48:06 -0700 Subject: [PATCH] make far-grab it's own action (which is just like spring) in order to avoid bootstrapping own avatar --- interface/src/InterfaceDynamicFactory.cpp | 3 + interface/src/avatar/AvatarActionFarGrab.cpp | 61 +++++++++++++++++++ interface/src/avatar/AvatarActionFarGrab.h | 27 ++++++++ .../entities/src/EntityDynamicInterface.cpp | 5 ++ .../entities/src/EntityDynamicInterface.h | 3 +- libraries/entities/src/EntityItem.cpp | 10 +++ libraries/physics/src/ObjectActionSpring.cpp | 58 ++++++++++-------- libraries/physics/src/ObjectActionSpring.h | 3 + 8 files changed, 144 insertions(+), 26 deletions(-) create mode 100644 interface/src/avatar/AvatarActionFarGrab.cpp create mode 100644 interface/src/avatar/AvatarActionFarGrab.h diff --git a/interface/src/InterfaceDynamicFactory.cpp b/interface/src/InterfaceDynamicFactory.cpp index ed6d35c69b..5951ccef9e 100644 --- a/interface/src/InterfaceDynamicFactory.cpp +++ b/interface/src/InterfaceDynamicFactory.cpp @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -35,6 +36,8 @@ EntityDynamicPointer interfaceDynamicFactory(EntityDynamicType type, const QUuid return std::make_shared(id, ownerEntity); case DYNAMIC_TYPE_HINGE: return std::make_shared(id, ownerEntity); + case DYNAMIC_TYPE_FAR_GRAB: + return std::make_shared(id, ownerEntity); } Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown entity dynamic type"); diff --git a/interface/src/avatar/AvatarActionFarGrab.cpp b/interface/src/avatar/AvatarActionFarGrab.cpp new file mode 100644 index 0000000000..bcc89c973a --- /dev/null +++ b/interface/src/avatar/AvatarActionFarGrab.cpp @@ -0,0 +1,61 @@ +// +// AvatarActionFarGrab.cpp +// interface/src/avatar/ +// +// Created by Seth Alves 2017-4-14 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "AvatarActionFarGrab.h" + +AvatarActionFarGrab::AvatarActionFarGrab(const QUuid& id, EntityItemPointer ownerEntity) : + ObjectActionSpring(id, ownerEntity) { + _type = DYNAMIC_TYPE_FAR_GRAB; +#if WANT_DEBUG + qCDebug(physics) << "AvatarActionFarGrab::AvatarActionFarGrab"; +#endif +} + +AvatarActionFarGrab::~AvatarActionFarGrab() { +#if WANT_DEBUG + qCDebug(physics) << "AvatarActionFarGrab::~AvatarActionFarGrab"; +#endif +} + + +QByteArray AvatarActionFarGrab::serialize() const { + QByteArray serializedActionArguments; + QDataStream dataStream(&serializedActionArguments, QIODevice::WriteOnly); + + dataStream << DYNAMIC_TYPE_FAR_GRAB; + dataStream << getID(); + dataStream << AvatarActionFarGrab::springVersion; + + serializeParameters(dataStream); + + return serializedActionArguments; +} + +void AvatarActionFarGrab::deserialize(QByteArray serializedArguments) { + QDataStream dataStream(serializedArguments); + + EntityDynamicType type; + dataStream >> type; + assert(type == getType()); + + QUuid id; + dataStream >> id; + assert(id == getID()); + + uint16_t serializationVersion; + dataStream >> serializationVersion; + if (serializationVersion != AvatarActionFarGrab::springVersion) { + assert(false); + return; + } + + deserializeParameters(serializedArguments, dataStream); +} diff --git a/interface/src/avatar/AvatarActionFarGrab.h b/interface/src/avatar/AvatarActionFarGrab.h new file mode 100644 index 0000000000..46c9f65dcf --- /dev/null +++ b/interface/src/avatar/AvatarActionFarGrab.h @@ -0,0 +1,27 @@ +// +// AvatarActionFarGrab.h +// interface/src/avatar/ +// +// Created by Seth Alves 2017-4-14 +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_AvatarActionFarGrab_h +#define hifi_AvatarActionFarGrab_h + +#include +#include + +class AvatarActionFarGrab : public ObjectActionSpring { +public: + AvatarActionFarGrab(const QUuid& id, EntityItemPointer ownerEntity); + virtual ~AvatarActionFarGrab(); + + QByteArray serialize() const override; + virtual void deserialize(QByteArray serializedArguments) override; +}; + +#endif // hifi_AvatarActionFarGrab_h diff --git a/libraries/entities/src/EntityDynamicInterface.cpp b/libraries/entities/src/EntityDynamicInterface.cpp index b7160bbcb6..bed3185b8f 100644 --- a/libraries/entities/src/EntityDynamicInterface.cpp +++ b/libraries/entities/src/EntityDynamicInterface.cpp @@ -114,6 +114,9 @@ EntityDynamicType EntityDynamicInterface::dynamicTypeFromString(QString dynamicT if (normalizedDynamicTypeString == "hinge") { return DYNAMIC_TYPE_HINGE; } + if (normalizedDynamicTypeString == "fargrab") { + return DYNAMIC_TYPE_FAR_GRAB; + } qCDebug(entities) << "Warning -- EntityDynamicInterface::dynamicTypeFromString got unknown dynamic-type name" << dynamicTypeString; @@ -134,6 +137,8 @@ QString EntityDynamicInterface::dynamicTypeToString(EntityDynamicType dynamicTyp return "travel-oriented"; case DYNAMIC_TYPE_HINGE: return "hinge"; + case DYNAMIC_TYPE_FAR_GRAB: + return "far-grab"; } assert(false); return "none"; diff --git a/libraries/entities/src/EntityDynamicInterface.h b/libraries/entities/src/EntityDynamicInterface.h index f4b7efc7a6..900c5554a4 100644 --- a/libraries/entities/src/EntityDynamicInterface.h +++ b/libraries/entities/src/EntityDynamicInterface.h @@ -30,7 +30,8 @@ enum EntityDynamicType { DYNAMIC_TYPE_SPRING = 2000, DYNAMIC_TYPE_HOLD = 3000, DYNAMIC_TYPE_TRAVEL_ORIENTED = 4000, - DYNAMIC_TYPE_HINGE = 5000 + DYNAMIC_TYPE_HINGE = 5000, + DYNAMIC_TYPE_FAR_GRAB = 6000 }; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index f5b2214273..a6de541958 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1882,6 +1882,16 @@ void EntityItem::computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask } i++; } + QList farGrabActions = getActionsOfType(DYNAMIC_TYPE_FAR_GRAB); + i = farGrabActions.begin(); + while (i != farGrabActions.end()) { + EntityDynamicPointer action = *i; + if (action->isMine()) { + iAmHoldingThis = true; + break; + } + i++; + } if (iAmHoldingThis) { userMask &= ~USER_COLLISION_GROUP_MY_AVATAR; diff --git a/libraries/physics/src/ObjectActionSpring.cpp b/libraries/physics/src/ObjectActionSpring.cpp index 2faa681c1d..b75d6a3c16 100644 --- a/libraries/physics/src/ObjectActionSpring.cpp +++ b/libraries/physics/src/ObjectActionSpring.cpp @@ -259,14 +259,7 @@ QVariantMap ObjectActionSpring::getArguments() { return arguments; } -QByteArray ObjectActionSpring::serialize() const { - QByteArray serializedActionArguments; - QDataStream dataStream(&serializedActionArguments, QIODevice::WriteOnly); - - dataStream << DYNAMIC_TYPE_SPRING; - dataStream << getID(); - dataStream << ObjectActionSpring::springVersion; - +QByteArray ObjectActionSpring::serializeParameters(QDataStream& dataStream) const { withReadLock([&] { dataStream << _desiredPositionalTarget; dataStream << _linearTimeScale; @@ -277,10 +270,41 @@ QByteArray ObjectActionSpring::serialize() const { dataStream << localTimeToServerTime(_expires); dataStream << _tag; }); +} + +QByteArray ObjectActionSpring::serialize() const { + QByteArray serializedActionArguments; + QDataStream dataStream(&serializedActionArguments, QIODevice::WriteOnly); + + dataStream << DYNAMIC_TYPE_SPRING; + dataStream << getID(); + dataStream << ObjectActionSpring::springVersion; + + serializeParameters(dataStream); return serializedActionArguments; } +void ObjectActionSpring::deserializeParameters(QByteArray serializedArguments, QDataStream& dataStream) { + withWriteLock([&] { + dataStream >> _desiredPositionalTarget; + dataStream >> _linearTimeScale; + dataStream >> _positionalTargetSet; + + dataStream >> _desiredRotationalTarget; + dataStream >> _angularTimeScale; + dataStream >> _rotationalTargetSet; + + quint64 serverExpires; + dataStream >> serverExpires; + _expires = serverTimeToLocalTime(serverExpires); + + dataStream >> _tag; + + _active = true; + }); +} + void ObjectActionSpring::deserialize(QByteArray serializedArguments) { QDataStream dataStream(serializedArguments); @@ -299,21 +323,5 @@ void ObjectActionSpring::deserialize(QByteArray serializedArguments) { return; } - withWriteLock([&] { - dataStream >> _desiredPositionalTarget; - dataStream >> _linearTimeScale; - dataStream >> _positionalTargetSet; - - dataStream >> _desiredRotationalTarget; - dataStream >> _angularTimeScale; - dataStream >> _rotationalTargetSet; - - quint64 serverExpires; - dataStream >> serverExpires; - _expires = serverTimeToLocalTime(serverExpires); - - dataStream >> _tag; - - _active = true; - }); + deserializeParameters(serializedArguments, dataStream); } diff --git a/libraries/physics/src/ObjectActionSpring.h b/libraries/physics/src/ObjectActionSpring.h index 498bb6c1f5..efc41a59a9 100644 --- a/libraries/physics/src/ObjectActionSpring.h +++ b/libraries/physics/src/ObjectActionSpring.h @@ -47,6 +47,9 @@ protected: glm::vec3 _angularVelocityTarget; virtual bool prepareForSpringUpdate(btScalar deltaTimeStep); + + QByteArray serializeParameters(QDataStream& dataStream) const; + void deserializeParameters(QByteArray serializedArguments, QDataStream& dataStream); }; #endif // hifi_ObjectActionSpring_h