diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 8f780355db..794e56b262 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -355,11 +355,11 @@ bool EntityTree::updateEntity(EntityItemPointer entity, const EntityItemProperti } else if (submittedID == senderID) { // the sender is trying to take or continue ownership if (entity->getSimulatorID().isNull()) { - // the sender it taking ownership + // the sender is taking ownership properties.promoteSimulationPriority(RECRUIT_SIMULATION_PRIORITY); simulationBlocked = false; } else if (entity->getSimulatorID() == senderID) { - // the sender is asserting ownership + // the sender is asserting ownership, maybe changing priority simulationBlocked = false; } else { // the sender is trying to steal ownership from another simulator diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index a688d521d6..33ac887f4f 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -155,7 +155,7 @@ void EntityMotionState::handleEasyChanges(uint32_t& flags) { // (1) we own it but may need to change the priority OR... // (2) we don't own it but should bid (because a local script has been changing physics properties) uint8_t newPriority = isLocallyOwned() ? _entity->getSimulationOwner().getPriority() : _entity->getSimulationOwner().getPendingPriority(); - _outgoingPriority = glm::max(_outgoingPriority, newPriority); + upgradeOutgoingPriority(newPriority); // reset bid expiry so that we bid ASAP _nextOwnershipBid = 0; @@ -403,7 +403,8 @@ bool EntityMotionState::remoteSimulationOutOfSync(uint32_t simulationStep) { } if (_entity->dynamicDataNeedsTransmit()) { - _outgoingPriority = _entity->hasActions() ? SCRIPT_GRAB_SIMULATION_PRIORITY : SCRIPT_POKE_SIMULATION_PRIORITY; + uint8_t priority = _entity->hasActions() ? SCRIPT_GRAB_SIMULATION_PRIORITY : SCRIPT_POKE_SIMULATION_PRIORITY; + upgradeOutgoingPriority(priority); return true; } @@ -502,17 +503,21 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationStep) { // we don't own the simulation // NOTE: we do not volunteer to own kinematic or static objects - uint8_t insufficientPriority = _body->isStaticOrKinematicObject() ? VOLUNTEER_SIMULATION_PRIORITY : 0; + uint8_t volunteerPriority = _body->isStaticOrKinematicObject() ? VOLUNTEER_SIMULATION_PRIORITY : 0; - bool shouldBid = _outgoingPriority > insufficientPriority && // but we would like to own it AND + bool shouldBid = _outgoingPriority > volunteerPriority && // but we would like to own it AND usecTimestampNow() > _nextOwnershipBid; // it is time to bid again if (shouldBid && _outgoingPriority < _entity->getSimulationPriority()) { - // we are insufficiently interested so clear our interest + // we are insufficiently interested so clear _outgoingPriority // and reset the bid expiry _outgoingPriority = 0; _nextOwnershipBid = usecTimestampNow() + USECS_BETWEEN_OWNERSHIP_BIDS; } return shouldBid; + } else { + // When we own the simulation: make sure _outgoingPriority is not less than current owned priority + // because: an _outgoingPriority of zero indicates that we should drop ownership when we have it. + upgradeOutgoingPriority(_entity->getSimulationPriority()); } return remoteSimulationOutOfSync(simulationStep); @@ -618,8 +623,10 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_ _entity->setPendingOwnershipPriority(_outgoingPriority, now); // don't forget to remember that we have made a bid _entity->rememberHasSimulationOwnershipBid(); - // ...then reset _outgoingPriority in preparation for the next frame + // ...then reset _outgoingPriority _outgoingPriority = 0; + // _outgoingPrioriuty will be re-computed before next bid, + // or will be set to agree with ownership priority should we win the bid } else if (_outgoingPriority != _entity->getSimulationPriority()) { // we own the simulation but our desired priority has changed if (_outgoingPriority == 0) {