Merge pull request #7503 from sethalves/lock-tree-before-moving-av-children

lock entity-tree before moving entity-children of avatars
This commit is contained in:
Seth Alves 2016-03-30 15:05:38 -07:00
commit 92981a6660

View file

@ -373,32 +373,34 @@ void MyAvatar::simulate(float deltaTime) {
EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); EntityTreeRenderer* entityTreeRenderer = qApp->getEntities();
EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr;
if (entityTree) { if (entityTree) {
auto now = usecTimestampNow(); entityTree->withWriteLock([&] {
EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); auto now = usecTimestampNow();
MovingEntitiesOperator moveOperator(entityTree); EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender();
forEachDescendant([&](SpatiallyNestablePointer object) { MovingEntitiesOperator moveOperator(entityTree);
// if the queryBox has changed, tell the entity-server forEachDescendant([&](SpatiallyNestablePointer object) {
if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { // if the queryBox has changed, tell the entity-server
EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object); if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) {
bool success; EntityItemPointer entity = std::static_pointer_cast<EntityItem>(object);
AACube newCube = entity->getQueryAACube(success); bool success;
if (success) { AACube newCube = entity->getQueryAACube(success);
moveOperator.addEntityToMoveList(entity, newCube); if (success) {
} moveOperator.addEntityToMoveList(entity, newCube);
if (packetSender) { }
EntityItemProperties properties = entity->getProperties(); if (packetSender) {
properties.setQueryAACubeDirty(); EntityItemProperties properties = entity->getProperties();
properties.setLastEdited(now); properties.setQueryAACubeDirty();
packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); properties.setLastEdited(now);
entity->setLastBroadcast(usecTimestampNow()); packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties);
entity->setLastBroadcast(usecTimestampNow());
}
} }
});
// also update the position of children in our local octree
if (moveOperator.hasMovingEntities()) {
PerformanceTimer perfTimer("recurseTreeWithOperator");
entityTree->recurseTreeWithOperator(&moveOperator);
} }
}); });
// also update the position of children in our local octree
if (moveOperator.hasMovingEntities()) {
PerformanceTimer perfTimer("recurseTreeWithOperator");
entityTree->recurseTreeWithOperator(&moveOperator);
}
} }
} }