From c87e7c99ce4e4a15ad655e02cd37063bb7c22f6d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 16 Jun 2015 17:49:44 -0700 Subject: [PATCH] bid for ownership on script-change phys properties --- libraries/entities/src/EntityItem.h | 2 +- .../entities/src/EntityItemProperties.cpp | 6 ++++++ libraries/entities/src/EntityItemProperties.h | 1 + .../entities/src/EntityScriptingInterface.cpp | 20 +++++++++++++++---- libraries/shared/src/PhysicsHelpers.h | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 0dc7d2febf..77531c59cf 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -367,7 +367,7 @@ public: virtual void updateShapeType(ShapeType type) { /* do nothing */ } uint32_t getDirtyFlags() const { return _dirtyFlags; } - void clearDirtyFlags(uint32_t mask = 0xffff) { _dirtyFlags &= ~mask; } + void clearDirtyFlags(uint32_t mask = 0xffffffff) { _dirtyFlags &= ~mask; } bool isMoving() const; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 7b2fdf1098..4003288700 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -1235,6 +1235,12 @@ bool EntityItemProperties::hasTerseUpdateChanges() const { return _positionChanged || _velocityChanged || _rotationChanged || _angularVelocityChanged || _accelerationChanged; } +bool EntityItemProperties::hasMiscPhysicsChanges() const { + return _gravityChanged || _dimensionsChanged || _densityChanged || _frictionChanged + || _restitutionChanged || _dampingChanged || _angularDampingChanged || _registrationPointChanged || + _compoundShapeURLChanged || _collisionsWillMoveChanged || _ignoreForCollisionsChanged; +} + void EntityItemProperties::clearSimulatorOwnership() { _simulatorID = QUuid(); _simulatorPriority = 0; diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 230cd5c122..4210b342f2 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -206,6 +206,7 @@ public: void setCreated(QDateTime& v); bool hasTerseUpdateChanges() const; + bool hasMiscPhysicsChanges() const; void clearSimulatorOwnership(); void setSimulatorOwnership(const QUuid& id, uint8_t priority); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3751f85821..6786763a83 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -140,13 +140,17 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, EntityItemProperties proper if (entity) { // make sure the properties has a type, so that the encode can know which properties to include properties.setType(entity->getType()); - if (properties.hasTerseUpdateChanges()) { + bool hasTerseUpdateChanges = properties.hasTerseUpdateChanges(); + bool hasPhysicsChanges = properties.hasMiscPhysicsChanges() || hasTerseUpdateChanges; + if (hasPhysicsChanges) { auto nodeList = DependencyManager::get(); const QUuid myNodeID = nodeList->getSessionUUID(); if (entity->getSimulatorID() == myNodeID) { // we think we already own the simulation, so make sure to send ALL TerseUpdate properties - entity->getAllTerseUpdateProperties(properties); + if (hasTerseUpdateChanges) { + entity->getAllTerseUpdateProperties(properties); + } // TODO: if we knew that ONLY TerseUpdate properties have changed in properties AND the object // is dynamic AND it is active in the physics simulation then we could chose to NOT queue an update // and instead let the physics simulation decide when to send a terse update. This would remove @@ -558,7 +562,11 @@ QUuid EntityScriptingInterface::addAction(const QString& actionTypeString, return false; } if (actionFactory->factory(simulation, actionType, actionID, entity, arguments)) { - entity->flagForOwnership(); + auto nodeList = DependencyManager::get(); + const QUuid myNodeID = nodeList->getSessionUUID(); + if (entity->getSimulatorID() != myNodeID) { + entity->flagForOwnership(); + } return true; } return false; @@ -574,7 +582,11 @@ bool EntityScriptingInterface::updateAction(const QUuid& entityID, const QUuid& return actionWorker(entityID, [&](EntitySimulation* simulation, EntityItemPointer entity) { bool success = entity->updateAction(simulation, actionID, arguments); if (success) { - entity->flagForOwnership(); + auto nodeList = DependencyManager::get(); + const QUuid myNodeID = nodeList->getSessionUUID(); + if (entity->getSimulatorID() != myNodeID) { + entity->flagForOwnership(); + } } return success; }); diff --git a/libraries/shared/src/PhysicsHelpers.h b/libraries/shared/src/PhysicsHelpers.h index 0e58ae99f0..7ceafea915 100644 --- a/libraries/shared/src/PhysicsHelpers.h +++ b/libraries/shared/src/PhysicsHelpers.h @@ -15,7 +15,7 @@ #include #include -const int PHYSICS_ENGINE_MAX_NUM_SUBSTEPS = 4; +const int PHYSICS_ENGINE_MAX_NUM_SUBSTEPS = 6; // Bullet will start to "lose time" at 10 FPS. const float PHYSICS_ENGINE_FIXED_SUBSTEP = 1.0f / 60.0f; // return incremental rotation (Bullet-style) caused by angularVelocity over timeStep