From 2e1727610ef061167db5bae3743e590ebc8104d5 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 21 Jan 2016 15:52:59 -0800 Subject: [PATCH 1/4] MyAvatar updates the entity-server about queryAACubes of children entities --- interface/src/avatar/MyAvatar.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b1688b8f9e..b6dcc96c22 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -50,6 +50,7 @@ #include "Util.h" #include "InterfaceLogging.h" #include "DebugDraw.h" +#include "EntityEditPacketSender.h" using namespace std; @@ -352,6 +353,21 @@ void MyAvatar::simulate(float deltaTime) { // consider updating our billboard maybeUpdateBillboard(); + + locationChanged(); + // if a entity-child of this avatar has moved outside of its queryAACube, update the cube and tell the entity server. + forEachDescendant([&](SpatiallyNestablePointer object) { + if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); + if (packetSender) { + EntityItemProperties properties = entity->getProperties(); + properties.setQueryAACubeDirty(); + packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); + entity->setLastBroadcast(usecTimestampNow()); + } + } + }); } glm::mat4 MyAvatar::getSensorToWorldMatrix() const { From cbed54268212265943f4ccebf57f370001c92704 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 21 Jan 2016 15:53:19 -0800 Subject: [PATCH 2/4] MyAvatar updates the entity-server about queryAACubes of children entities --- libraries/entities/src/EntityItemProperties.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 0f0bab5fdd..8a2431eb9e 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -254,6 +254,8 @@ public: void setLinePointsDirty() {_linePointsChanged = true; } + void setQueryAACubeDirty() { _queryAACubeChanged = true; } + void setCreated(QDateTime& v); bool hasTerseUpdateChanges() const; From 872a00d518d8cc1636cd857f824343cad4c870dd Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 21 Jan 2016 15:53:47 -0800 Subject: [PATCH 3/4] entities that are children shouldn't (at this point) be dynamic. --- libraries/physics/src/EntityMotionState.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 4e5f942265..9982b4d107 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -144,7 +144,12 @@ PhysicsMotionType EntityMotionState::computePhysicsMotionType() const { return MOTION_TYPE_STATIC; } assert(entityTreeIsLocked()); + if (_entity->getDynamic()) { + if (!_entity->getParentID().isNull()) { + // if something would have been dynamic but is a child of something else, force it to be kinematic, instead. + return MOTION_TYPE_KINEMATIC; + } return MOTION_TYPE_DYNAMIC; } return (_entity->isMoving() || _entity->hasActions()) ? MOTION_TYPE_KINEMATIC : MOTION_TYPE_STATIC; From 1fefe0fa0e48de2a3b0e042c0ae39ad347e3d0f8 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 26 Jan 2016 13:30:55 -0800 Subject: [PATCH 4/4] when an avatar moves a child entity around, it has to invoke MovingEntitiesOperator to keep the local octree up-to-date --- interface/src/avatar/MyAvatar.cpp | 37 ++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 7180d8ec2c..04205d6a65 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -50,6 +50,7 @@ #include "InterfaceLogging.h" #include "DebugDraw.h" #include "EntityEditPacketSender.h" +#include "MovingEntitiesOperator.h" using namespace std; @@ -355,18 +356,34 @@ void MyAvatar::simulate(float deltaTime) { locationChanged(); // if a entity-child of this avatar has moved outside of its queryAACube, update the cube and tell the entity server. - forEachDescendant([&](SpatiallyNestablePointer object) { - if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { - EntityItemPointer entity = std::static_pointer_cast(object); - EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); - if (packetSender) { - EntityItemProperties properties = entity->getProperties(); - properties.setQueryAACubeDirty(); - packetSender->queueEditEntityMessage(PacketType::EntityEdit, entity->getID(), properties); - entity->setLastBroadcast(usecTimestampNow()); + EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); + EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; + if (entityTree) { + EntityEditPacketSender* packetSender = qApp->getEntityEditPacketSender(); + MovingEntitiesOperator moveOperator(entityTree); + forEachDescendant([&](SpatiallyNestablePointer object) { + // if the queryBox has changed, tell the entity-server + if (object->computePuffedQueryAACube() && object->getNestableType() == NestableType::Entity) { + EntityItemPointer entity = std::static_pointer_cast(object); + bool success; + AACube newCube = entity->getQueryAACube(success); + if (success) { + moveOperator.addEntityToMoveList(entity, newCube); + } + if (packetSender) { + EntityItemProperties properties = entity->getProperties(); + properties.setQueryAACubeDirty(); + 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); } - }); + } } glm::mat4 MyAvatar::getSensorToWorldMatrix() const {