From 8177512432c7442036f48d641eb72543ee6df0ed Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 29 May 2015 11:35:50 -0700 Subject: [PATCH] send all TerseUpdate properties when one changes --- libraries/entities/src/EntityItem.cpp | 15 +++++++++++++++ libraries/entities/src/EntityItem.h | 2 ++ libraries/entities/src/EntityItemProperties.cpp | 5 ++++- libraries/entities/src/EntityItemProperties.h | 3 +++ .../entities/src/EntityScriptingInterface.cpp | 12 +++++++++++- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 4a9b64d1ca..cc951ac16b 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -925,6 +925,21 @@ EntityItemProperties EntityItem::getProperties() const { return properties; } +void EntityItem::getAllTerseUpdateProperties(EntityItemProperties& properties) const { + // a TerseUpdate includes the transform and its derivatives + properties._position = _position; + properties._velocity = _velocity; + properties._rotation = _rotation; + properties._angularVelocity = _angularVelocity; + properties._acceleration = _acceleration; + + properties._positionChanged = true; + properties._velocityChanged = true; + properties._rotationChanged = true; + properties._angularVelocityChanged = true; + properties._accelerationChanged = true; +} + bool EntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChanged = false; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 4f2132bef4..6f9dc54e7a 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -347,6 +347,8 @@ public: quint64 getLastEditedFromRemote() { return _lastEditedFromRemote; } + void getAllTerseUpdateProperties(EntityItemProperties& properties) const; + protected: static bool _sendPhysicsUpdates; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 856c1a1cb4..583cf15b9c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1156,4 +1156,7 @@ AABox EntityItemProperties::getAABox() const { return AABox(rotatedExtentsRelativeToRegistrationPoint); } - +bool EntityItemProperties::hasTerseUpdateChanges() const { + // a TerseUpdate includes the transform and its derivatives + return _positionChanged || _velocityChanged || _rotationChanged || _angularVelocityChanged || _accelerationChanged; +} diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 26c26bd474..dbe2e926c9 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -195,6 +195,8 @@ public: void setVoxelDataDirty() { _voxelDataChanged = true; } + bool hasTerseUpdateChanges() const; + private: QUuid _id; bool _idSet; @@ -215,6 +217,7 @@ private: QStringList _textureNames; glm::vec3 _naturalDimensions; }; + Q_DECLARE_METATYPE(EntityItemProperties); QScriptValue EntityItemPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties); QScriptValue EntityItemNonDefaultPropertiesToScriptValue(QScriptEngine* engine, const EntityItemProperties& properties); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 54d2ea705e..d684fbf2fc 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -146,7 +146,17 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& EntityItemProperties modifiedProperties = properties; entity->setLastBroadcast(usecTimestampNow()); modifiedProperties.setType(entity->getType()); - bidForSimulationOwnership(modifiedProperties); + if (modifiedProperties.hasTerseUpdateChanges()) { + // we make a bid for (or assert) our simulation ownership + auto nodeList = DependencyManager::get(); + const QUuid myNodeID = nodeList->getSessionUUID(); + modifiedProperties.setSimulatorID(myNodeID); + + if (entity->getSimulatorID() == myNodeID) { + // we think we already own simulation, so make sure we send ALL TerseUpdate properties + entity->getAllTerseUpdateProperties(modifiedProperties); + } + } queueEntityMessage(PacketTypeEntityEdit, entityID, modifiedProperties); return id; }