diff --git a/libraries/physics/src/PhysicalEntitySimulation.cpp b/libraries/physics/src/PhysicalEntitySimulation.cpp index ddfd079362..5b63a82ee2 100644 --- a/libraries/physics/src/PhysicalEntitySimulation.cpp +++ b/libraries/physics/src/PhysicalEntitySimulation.cpp @@ -79,20 +79,14 @@ void PhysicalEntitySimulation::removeOwnershipData(EntityMotionState* motionStat for (uint32_t i = 0; i < _owned.size(); ++i) { if (_owned[i] == motionState) { _owned[i]->clearOwnershipState(); - if (i < _owned.size() - 1) { - _owned[i] = _owned.back(); - } - _owned.pop_back(); + _owned.remove(i); } } } else if (motionState->getOwnershipState() == EntityMotionState::OwnershipState::PendingBid) { for (uint32_t i = 0; i < _bids.size(); ++i) { if (_bids[i] == motionState) { _bids[i]->clearOwnershipState(); - if (i < _bids.size() - 1) { - _bids[i] = _bids.back(); - } - _bids.pop_back(); + _bids.remove(i); } } } @@ -368,10 +362,7 @@ void PhysicalEntitySimulation::sendOwnershipBids(uint32_t numSubsteps) { _bids[i]->clearOwnershipState(); } if (removeBid) { - if (i < _bids.size() - 1) { - _bids[i] = _bids.back(); - } - _bids.pop_back(); + _bids.remove(i); } else { if (now > _bids[i]->getNextBidExpiry()) { _bids[i]->sendBid(_entityPacketSender, numSubsteps); @@ -393,10 +384,7 @@ void PhysicalEntitySimulation::sendOwnedUpdates(uint32_t numSubsteps) { } else { _owned[i]->clearOwnershipState(); } - if (i < _owned.size() - 1) { - _owned[i] = _owned.back(); - } - _owned.pop_back(); + _owned.remove(i); } else { if (_owned[i]->shouldSendUpdate(numSubsteps)) { _owned[i]->sendUpdate(_entityPacketSender, numSubsteps); diff --git a/libraries/physics/src/PhysicalEntitySimulation.h b/libraries/physics/src/PhysicalEntitySimulation.h index 72107fa278..bfb151bf23 100644 --- a/libraries/physics/src/PhysicalEntitySimulation.h +++ b/libraries/physics/src/PhysicalEntitySimulation.h @@ -27,6 +27,17 @@ class PhysicalEntitySimulation; using PhysicalEntitySimulationPointer = std::shared_ptr; using SetOfEntityMotionStates = QSet; +class VectorOfEntityMotionStates: public std::vector { +public: + void remove(uint32_t index) { + assert(index < size()); + if (index < size() - 1) { + (*this)[index] = back(); + } + pop_back(); + } +}; + class PhysicalEntitySimulation : public EntitySimulation { Q_OBJECT public: @@ -89,8 +100,8 @@ private: PhysicsEnginePointer _physicsEngine = nullptr; EntityEditPacketSender* _entityPacketSender = nullptr; - std::vector _owned; - std::vector _bids; + VectorOfEntityMotionStates _owned; + VectorOfEntityMotionStates _bids; uint64_t _nextBidExpiry; uint32_t _lastStepSendPackets { 0 }; };