explicit insert/erase into _simpleKinematicEntities

This commit is contained in:
Andrew Meadows 2018-07-10 11:17:13 -07:00
parent 0b87df45b5
commit 9171fcbe8b

View file

@ -59,7 +59,10 @@ void PhysicalEntitySimulation::addEntityInternal(EntityItemPointer entity) {
_entitiesToAddToPhysics.insert(entity); _entitiesToAddToPhysics.insert(entity);
} }
} else if (canBeKinematic && entity->isMovingRelativeToParent()) { } else if (canBeKinematic && entity->isMovingRelativeToParent()) {
_simpleKinematicEntities.insert(entity); SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr == _simpleKinematicEntities.end()) {
_simpleKinematicEntities.insert(entity);
}
} }
} }
@ -150,7 +153,10 @@ void PhysicalEntitySimulation::changeEntityInternal(EntityItemPointer entity) {
removeOwnershipData(motionState); removeOwnershipData(motionState);
_entitiesToRemoveFromPhysics.insert(entity); _entitiesToRemoveFromPhysics.insert(entity);
if (canBeKinematic && entity->isMovingRelativeToParent()) { if (canBeKinematic && entity->isMovingRelativeToParent()) {
_simpleKinematicEntities.insert(entity); SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr == _simpleKinematicEntities.end()) {
_simpleKinematicEntities.insert(entity);
}
} }
} else { } else {
_incomingChanges.insert(motionState); _incomingChanges.insert(motionState);
@ -160,11 +166,20 @@ void PhysicalEntitySimulation::changeEntityInternal(EntityItemPointer entity) {
// The intent is for this object to be in the PhysicsEngine, but it has no MotionState yet. // The intent is for this object to be in the PhysicsEngine, but it has no MotionState yet.
// Perhaps it's shape has changed and it can now be added? // Perhaps it's shape has changed and it can now be added?
_entitiesToAddToPhysics.insert(entity); _entitiesToAddToPhysics.insert(entity);
_simpleKinematicEntities.remove(entity); // just in case it's non-physical-kinematic SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr != _simpleKinematicEntities.end()) {
_simpleKinematicEntities.erase(itr);
}
} else if (canBeKinematic && entity->isMovingRelativeToParent()) { } else if (canBeKinematic && entity->isMovingRelativeToParent()) {
_simpleKinematicEntities.insert(entity); SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr == _simpleKinematicEntities.end()) {
_simpleKinematicEntities.insert(entity);
}
} else { } else {
_simpleKinematicEntities.remove(entity); // just in case it's non-physical-kinematic SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr != _simpleKinematicEntities.end()) {
_simpleKinematicEntities.erase(itr);
}
} }
} }
@ -212,7 +227,6 @@ const VectorOfMotionStates& PhysicalEntitySimulation::getObjectsToRemoveFromPhys
assert(motionState); assert(motionState);
// TODO CLEan this, just a n extra check to avoid the crash that shouldn;t happen // TODO CLEan this, just a n extra check to avoid the crash that shouldn;t happen
if (motionState) { if (motionState) {
_entitiesToAddToPhysics.remove(entity); _entitiesToAddToPhysics.remove(entity);
if (entity->isDead() && entity->getElement()) { if (entity->isDead() && entity->getElement()) {
_deadEntities.insert(entity); _deadEntities.insert(entity);
@ -255,7 +269,10 @@ void PhysicalEntitySimulation::getObjectsToAddToPhysics(VectorOfMotionStates& re
// this entity should no longer be on the internal _entitiesToAddToPhysics // this entity should no longer be on the internal _entitiesToAddToPhysics
entityItr = _entitiesToAddToPhysics.erase(entityItr); entityItr = _entitiesToAddToPhysics.erase(entityItr);
if (entity->isMovingRelativeToParent()) { if (entity->isMovingRelativeToParent()) {
_simpleKinematicEntities.insert(entity); SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr == _simpleKinematicEntities.end()) {
_simpleKinematicEntities.insert(entity);
}
} }
} else if (entity->isReadyToComputeShape()) { } else if (entity->isReadyToComputeShape()) {
ShapeInfo shapeInfo; ShapeInfo shapeInfo;
@ -375,19 +392,21 @@ void PhysicalEntitySimulation::handleChangedMotionStates(const VectorOfMotionSta
} }
void PhysicalEntitySimulation::addOwnershipBid(EntityMotionState* motionState) { void PhysicalEntitySimulation::addOwnershipBid(EntityMotionState* motionState) {
if (!getEntityTree()->isServerlessMode()) { if (getEntityTree()->isServerlessMode()) {
motionState->initForBid(); return;
motionState->sendBid(_entityPacketSender, _physicsEngine->getNumSubsteps());
_bids.push_back(motionState);
_nextBidExpiry = glm::min(_nextBidExpiry, motionState->getNextBidExpiry());
} }
motionState->initForBid();
motionState->sendBid(_entityPacketSender, _physicsEngine->getNumSubsteps());
_bids.push_back(motionState);
_nextBidExpiry = glm::min(_nextBidExpiry, motionState->getNextBidExpiry());
} }
void PhysicalEntitySimulation::addOwnership(EntityMotionState* motionState) { void PhysicalEntitySimulation::addOwnership(EntityMotionState* motionState) {
if (!getEntityTree()->isServerlessMode()) { if (getEntityTree()->isServerlessMode()) {
motionState->initForOwned(); return;
_owned.push_back(motionState);
} }
motionState->initForOwned();
_owned.push_back(motionState);
} }
void PhysicalEntitySimulation::sendOwnershipBids(uint32_t numSubsteps) { void PhysicalEntitySimulation::sendOwnershipBids(uint32_t numSubsteps) {
@ -426,7 +445,9 @@ void PhysicalEntitySimulation::sendOwnershipBids(uint32_t numSubsteps) {
} }
void PhysicalEntitySimulation::sendOwnedUpdates(uint32_t numSubsteps) { void PhysicalEntitySimulation::sendOwnedUpdates(uint32_t numSubsteps) {
bool serverlessMode = getEntityTree()->isServerlessMode(); if (getEntityTree()->isServerlessMode()) {
return;
}
PROFILE_RANGE_EX(simulation_physics, "Update", 0x00000000, (uint64_t)_owned.size()); PROFILE_RANGE_EX(simulation_physics, "Update", 0x00000000, (uint64_t)_owned.size());
uint32_t i = 0; uint32_t i = 0;
while (i < _owned.size()) { while (i < _owned.size()) {
@ -438,7 +459,7 @@ void PhysicalEntitySimulation::sendOwnedUpdates(uint32_t numSubsteps) {
} }
_owned.remove(i); _owned.remove(i);
} else { } else {
if (!serverlessMode && _owned[i]->shouldSendUpdate(numSubsteps)) { if (_owned[i]->shouldSendUpdate(numSubsteps)) {
_owned[i]->sendUpdate(_entityPacketSender, numSubsteps); _owned[i]->sendUpdate(_entityPacketSender, numSubsteps);
} }
++i; ++i;