diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 352c83dad0..ab0ae784f8 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -35,6 +35,7 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT auto entityTree = entityTreeRenderer->getTree(); if (entityTree) { + Locker lock(_lock); _entityTree = entityTree; connect(std::const_pointer_cast(_entityTree).get(), &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); @@ -47,6 +48,7 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT } void SafeLanding::stopEntitySequence() { + Locker lock(_lock); _trackingEntities = false; _initialStart = INVALID_SEQUENCE; _initialEnd = INVALID_SEQUENCE; @@ -62,10 +64,11 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { const auto& entityType = entity->getType(); if (entityType == EntityTypes::Model) { ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); - auto shapeType = modelEntity->getShapeType(); - if (shapeType == SHAPE_TYPE_COMPOUND || shapeType == SHAPE_TYPE_STATIC_MESH || - shapeType == SHAPE_TYPE_SIMPLE_COMPOUND) { + static const std::set downloadedCollisionTypes + { SHAPE_TYPE_COMPOUND, SHAPE_TYPE_SIMPLE_COMPOUND, SHAPE_TYPE_STATIC_MESH, SHAPE_TYPE_SIMPLE_HULL }; + if (downloadedCollisionTypes.count(modelEntity->getShapeType()) != 0) { // Only track entities with downloaded collision bodies. + Locker lock(_lock); _trackedEntities.emplace(entityID, entity); qCDebug(interfaceapp) << "Safe Landing: Tracking entity " << entity->getItemName(); } @@ -75,27 +78,37 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { } void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { + Locker lock(_lock); _trackedEntities.erase(entityID); } void SafeLanding::setCompletionSequenceNumbers(int first, int last) { + Locker lock(_lock); _initialStart = first; _initialEnd = (last + 1) % SEQUENCE_MODULO; - auto firstIter = _sequenceNumbers.find(_initialStart); - if (firstIter != _sequenceNumbers.end()) { - _sequenceNumbers.erase(_sequenceNumbers.begin(), firstIter); - } - _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); } void SafeLanding::sequenceNumberReceived(int sequenceNumber) { if (_trackingEntities) { + Locker lock(_lock); _sequenceNumbers.insert(sequenceNumber); } } +bool SafeLanding::isLoadSequenceComplete() { + if (sequenceNumbersComplete() && entityPhysicsComplete()) { + Locker lock(_lock); + _trackingEntities = false; + _trackedEntities.clear(); + qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; + } + + return !_trackingEntities; +} + bool SafeLanding::sequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { + Locker lock(_lock); auto startIter = _sequenceNumbers.find(_initialStart); if (startIter != _sequenceNumbers.end()) { _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); @@ -109,27 +122,8 @@ bool SafeLanding::sequenceNumbersComplete() { return false; } -void SafeLanding::resourceLoaded() { - QObject * sender = QObject::sender(); - if (sender) { - Resource * resource = dynamic_cast(sender); - const QString resourceURL = resource->getURL().toString(); - _trackedURLs.erase(resourceURL); - qCDebug(interfaceapp) << "Safe Landing: Removed tracked URL" << resourceURL; - } -} - -bool SafeLanding::isLoadSequenceComplete() { - if (sequenceNumbersComplete() && entityPhysicsComplete()) { - _trackingEntities = false; - _trackedEntities.clear(); - qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; - } - - return !_trackingEntities; -} - bool SafeLanding::entityPhysicsComplete() { + Locker lock(_lock); for (auto entityMapIter = _trackedEntities.begin(); entityMapIter != _trackedEntities.end(); ++entityMapIter) { auto entity = entityMapIter->second; if (!entity->shouldBePhysical() || entity->isReadyToComputeShape()) { diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index e81746e077..a9146f58c7 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -33,13 +33,14 @@ public: private slots: void addTrackedEntity(const EntityItemID& entityID); void deleteTrackedEntity(const EntityItemID& entityID); - void resourceLoaded(); private: bool sequenceNumbersComplete(); void debugDumpSequenceIDs() const; bool entityPhysicsComplete(); + std::mutex _lock; + using Locker = std::lock_guard; bool _trackingEntities { false }; EntityTreePointer _entityTree; using EntityMap = std::map;