mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 11:45:36 +02:00
Add some locking
This commit is contained in:
parent
875407b3fe
commit
a8b9568c92
2 changed files with 24 additions and 29 deletions
|
@ -35,6 +35,7 @@ void SafeLanding::startEntitySequence(QSharedPointer<EntityTreeRenderer> entityT
|
|||
auto entityTree = entityTreeRenderer->getTree();
|
||||
|
||||
if (entityTree) {
|
||||
Locker lock(_lock);
|
||||
_entityTree = entityTree;
|
||||
connect(std::const_pointer_cast<EntityTree>(_entityTree).get(),
|
||||
&EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity);
|
||||
|
@ -47,6 +48,7 @@ void SafeLanding::startEntitySequence(QSharedPointer<EntityTreeRenderer> 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<ModelEntityItem>(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<ShapeType> 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<Resource*>(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()) {
|
||||
|
|
|
@ -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<std::mutex>;
|
||||
bool _trackingEntities { false };
|
||||
EntityTreePointer _entityTree;
|
||||
using EntityMap = std::map<EntityItemID, EntityItemPointer>;
|
||||
|
|
Loading…
Reference in a new issue