From 3ccbd0bc7b7f77f45e8cd7c98a78acd05d838eeb Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 18 Dec 2018 14:09:20 -0800 Subject: [PATCH] disable positionand velocity script edits on grabbed entities --- libraries/entities/src/EntityItemProperties.cpp | 12 ++++++++++++ libraries/entities/src/EntityItemProperties.h | 1 + libraries/entities/src/EntityScriptingInterface.cpp | 4 ++++ libraries/shared/src/SpatiallyNestable.cpp | 8 ++++++++ libraries/shared/src/SpatiallyNestable.h | 1 + 5 files changed, 26 insertions(+) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 7eb2e1c765..2963187d75 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -3595,6 +3595,18 @@ bool EntityItemProperties::hasTransformOrVelocityChanges() const { || _accelerationChanged; } +void EntityItemProperties::clearTransformOrVelocityChanges() { + _positionChanged = false; + _localPositionChanged = false; + _rotationChanged = false; + _localRotationChanged = false; + _velocityChanged = false; + _localVelocityChanged = false; + _angularVelocityChanged = false; + _localAngularVelocityChanged = false; + _accelerationChanged = false; +} + bool EntityItemProperties::hasMiscPhysicsChanges() const { return _gravityChanged || _dimensionsChanged || _densityChanged || _frictionChanged || _restitutionChanged || _dampingChanged || _angularDampingChanged || _registrationPointChanged || diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index a025288f95..05235f20ef 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -390,6 +390,7 @@ public: void setCreated(QDateTime& v); bool hasTransformOrVelocityChanges() const; + void clearTransformOrVelocityChanges(); bool hasMiscPhysicsChanges() const; bool hasSimulationRestrictedChanges() const; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 956ba12560..cdeaf120ce 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -816,6 +816,10 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& QString previousUserdata; if (entity) { + if (properties.hasTransformOrVelocityChanges() && entity->hasGrabs()) { + // if an entity is grabbed, the grab will override any position changes + properties.clearTransformOrVelocityChanges(); + } if (properties.hasSimulationRestrictedChanges()) { if (_bidOnSimulationOwnership) { // flag for simulation ownership, or upgrade existing ownership priority diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index c100e46ccc..8805205361 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -1386,6 +1386,14 @@ void SpatiallyNestable::removeGrab(GrabPointer grab) { }); } +bool SpatiallyNestable::hasGrabs() { + bool result { false }; + _grabsLock.withReadLock([&] { + result = !_grabs.isEmpty(); + }); + return result; +} + QUuid SpatiallyNestable::getEditSenderID() { // if more than one avatar is grabbing something, decide which one should tell the enity-server about it QUuid editSenderID; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 0c6bada85b..a55f32896b 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -216,6 +216,7 @@ public: virtual void addGrab(GrabPointer grab); virtual void removeGrab(GrabPointer grab); + bool hasGrabs(); virtual QUuid getEditSenderID(); protected: