From 44ddfb8039a1f9e6a327bedf4c0338d7ca04a402 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:08:58 -0800 Subject: [PATCH 01/10] set last-edited when updating a child's queryAACube --- libraries/entities/src/EntityScriptingInterface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3d252abc11..3bf76c445a 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -345,6 +345,9 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& EntityItemPointer entityDescendant = std::static_pointer_cast(descendant); EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); + auto now = usecTimestampNow(); + entity->setLastEdited(now); + newQueryCubeProperties.setLastEdited(now); queueEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); } From 3030944ca1de0c56c199bc9dc6fb43d8e6cb2e09 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:09:11 -0800 Subject: [PATCH 02/10] set last-edited when updating a child's queryAACube --- interface/src/avatar/MyAvatar.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index a2c74603ed..5c707ea245 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -397,6 +397,9 @@ void MyAvatar::simulate(float deltaTime) { if (packetSender) { EntityItemProperties properties = entity->getProperties(); properties.setQueryAACubeDirty(); + auto now = usecTimestampNow(); + entity->setLastEdited(now); + properties.setLastEdited(now); packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); entity->setLastBroadcast(usecTimestampNow()); } From 92d016f03ae660d2952a1805946f3f8f426ab7b4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:09:34 -0800 Subject: [PATCH 03/10] debugging prints for queryAACube --- libraries/entities/src/EntityTree.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index d7a079f0ce..4c3412edd3 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -815,6 +815,14 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList Date: Mon, 8 Feb 2016 15:09:51 -0800 Subject: [PATCH 04/10] set last-edited when updating a child's queryAACube --- libraries/physics/src/EntityMotionState.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 155186e891..73548b73f2 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -527,6 +527,9 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, const Q if (descendant->computePuffedQueryAACube()) { EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); + auto now = usecTimestampNow(); + entityDescendant->setLastEdited(now); + newQueryCubeProperties.setLastEdited(now); entityPacketSender->queueEditEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); } From 7f2b822796f427e06c16dd739a9ac36d9b4b6bde Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:15:49 -0800 Subject: [PATCH 05/10] only setLastEdited on properties to be sent --- interface/src/avatar/MyAvatar.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5c707ea245..6d5fab2ebc 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -398,7 +398,6 @@ void MyAvatar::simulate(float deltaTime) { EntityItemProperties properties = entity->getProperties(); properties.setQueryAACubeDirty(); auto now = usecTimestampNow(); - entity->setLastEdited(now); properties.setLastEdited(now); packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); entity->setLastBroadcast(usecTimestampNow()); From eb1c159c7eb8aede81ea8d4b0f840cd66022cc0f Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:16:04 -0800 Subject: [PATCH 06/10] only setLastEdited on properties to be sent --- libraries/physics/src/EntityMotionState.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 73548b73f2..acd9ccd0c9 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -528,7 +528,6 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, const Q EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); auto now = usecTimestampNow(); - entityDescendant->setLastEdited(now); newQueryCubeProperties.setLastEdited(now); entityPacketSender->queueEditEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); From e2098038f1c5f2d525588678cee597d8c90d6597 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:16:15 -0800 Subject: [PATCH 07/10] only setLastEdited on properties to be sent --- libraries/entities/src/EntityScriptingInterface.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 3bf76c445a..5279a205c4 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -346,7 +346,6 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); auto now = usecTimestampNow(); - entity->setLastEdited(now); newQueryCubeProperties.setLastEdited(now); queueEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); From 82fcfc1d640ed242abe6fc52b7edc8d6577bbba6 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:31:32 -0800 Subject: [PATCH 08/10] don't apply clock-skew to a lastEdited of 0 --- libraries/entities/src/EntityItem.cpp | 2 +- libraries/entities/src/EntityTreeElement.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index a4a646f532..bb6d5308c9 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -470,7 +470,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef Q_ASSERT(parser.offset() == (unsigned int) bytesRead); } #endif - quint64 lastEditedFromBufferAdjusted = lastEditedFromBuffer - clockSkew; + quint64 lastEditedFromBufferAdjusted = lastEditedFromBuffer == 0 ? 0 : lastEditedFromBuffer - clockSkew; if (lastEditedFromBufferAdjusted > now) { lastEditedFromBufferAdjusted = now; } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 36f29c1a05..b1ab175278 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -459,6 +459,7 @@ bool EntityTreeElement::bestFitEntityBounds(EntityItemPointer entity) const { bool success; auto queryCube = entity->getQueryAACube(success); if (!success) { + qDebug() << "EntityTreeElement::bestFitEntityBounds couldn't get queryCube for" << entity->getName() << entity->getID(); return false; } return bestFitBounds(queryCube); @@ -904,6 +905,8 @@ int EntityTreeElement::readElementDataFromBuffer(const unsigned char* data, int _myTree->entityChanged(entityItem); } bool bestFitAfter = bestFitEntityBounds(entityItem); + qDebug() << "got update for" << entityItem->getName() << bestFitBefore << bestFitAfter << + entityItem->getQueryAACube(); if (bestFitBefore != bestFitAfter) { // This is the case where the entity existed, and is in some element in our tree... From 4f8a7a080f0da4811d3482cace20378b3e1a374c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 15:33:03 -0800 Subject: [PATCH 09/10] remove debugging print --- libraries/entities/src/EntityTreeElement.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index b1ab175278..1e798f2e0c 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -905,8 +905,6 @@ int EntityTreeElement::readElementDataFromBuffer(const unsigned char* data, int _myTree->entityChanged(entityItem); } bool bestFitAfter = bestFitEntityBounds(entityItem); - qDebug() << "got update for" << entityItem->getName() << bestFitBefore << bestFitAfter << - entityItem->getQueryAACube(); if (bestFitBefore != bestFitAfter) { // This is the case where the entity existed, and is in some element in our tree... From d5f3447fbc1e60fe91e7f175df3fd547316babb8 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 8 Feb 2016 16:22:41 -0800 Subject: [PATCH 10/10] when updating queryAACubes for children, use the lastEdited from the parent's properties --- interface/src/avatar/MyAvatar.cpp | 2 +- libraries/entities/src/EntityEditPacketSender.cpp | 2 ++ libraries/entities/src/EntityScriptingInterface.cpp | 3 +-- libraries/physics/src/EntityMotionState.cpp | 3 +-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6d5fab2ebc..b3cfc10bd3 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -383,6 +383,7 @@ void MyAvatar::simulate(float deltaTime) { EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; if (entityTree) { + auto now = usecTimestampNow(); EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); MovingEntitiesOperator moveOperator(entityTree); forEachDescendant([&](SpatiallyNestablePointer object) { @@ -397,7 +398,6 @@ void MyAvatar::simulate(float deltaTime) { if (packetSender) { EntityItemProperties properties = entity->getProperties(); properties.setQueryAACubeDirty(); - auto now = usecTimestampNow(); properties.setLastEdited(now); packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); entity->setLastBroadcast(usecTimestampNow()); diff --git a/libraries/entities/src/EntityEditPacketSender.cpp b/libraries/entities/src/EntityEditPacketSender.cpp index 91f21659ec..e28dc1e4fa 100644 --- a/libraries/entities/src/EntityEditPacketSender.cpp +++ b/libraries/entities/src/EntityEditPacketSender.cpp @@ -41,6 +41,8 @@ void EntityEditPacketSender::queueEditEntityMessage(PacketType type, EntityItemI return; // bail early } + assert(properties.getLastEdited() > 0); + QByteArray bufferOut(NLPacket::maxPayloadSize(type), 0); if (EntityItemProperties::encodeEntityEditPacket(type, modelID, properties, bufferOut)) { diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 5279a205c4..802b21a23b 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -345,8 +345,7 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& EntityItemPointer entityDescendant = std::static_pointer_cast(descendant); EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); - auto now = usecTimestampNow(); - newQueryCubeProperties.setLastEdited(now); + newQueryCubeProperties.setLastEdited(properties.getLastEdited()); queueEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); } diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index acd9ccd0c9..c798e07d52 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -527,8 +527,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, const Q if (descendant->computePuffedQueryAACube()) { EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); - auto now = usecTimestampNow(); - newQueryCubeProperties.setLastEdited(now); + newQueryCubeProperties.setLastEdited(properties.getLastEdited()); entityPacketSender->queueEditEntityMessage(PacketType::EntityEdit, descendant->getID(), newQueryCubeProperties); entityDescendant->setLastBroadcast(usecTimestampNow()); }