From f75e59c0a6f8146f207e0fba48a424e82463652c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Oct 2017 11:33:42 -0700 Subject: [PATCH 1/8] keep grabbed and worn entities from spamming entity-server --- libraries/entities/src/EntityItem.cpp | 149 +++++++++++--------- libraries/entities/src/EntityItem.h | 2 + libraries/physics/src/EntityMotionState.cpp | 6 +- libraries/shared/src/SpatiallyNestable.cpp | 14 +- libraries/shared/src/SpatiallyNestable.h | 2 +- 5 files changed, 98 insertions(+), 75 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 58b8dd22bf..cdba87ff69 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -43,7 +43,7 @@ int EntityItem::_maxActionsDataSize = 800; quint64 EntityItem::_rememberDeletedActionTime = 20 * USECS_PER_SECOND; EntityItem::EntityItem(const EntityItemID& entityItemID) : - SpatiallyNestable(NestableType::Entity, entityItemID) + SpatiallyNestable(NestableType::Entity, entityItemID) { setLocalVelocity(ENTITY_ITEM_DEFAULT_VELOCITY); setLocalAngularVelocity(ENTITY_ITEM_DEFAULT_ANGULAR_VELOCITY); @@ -719,7 +719,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } { // When we own the simulation we don't accept updates to the entity's transform/velocities // we also want to ignore any duplicate packets that have the same "recently updated" values - // as a packet we've already recieved. This is because we want multiple edits of the same + // as a packet we've already recieved. This is because we want multiple edits of the same // information to be idempotent, but if we applied new physics properties we'd resimulation // with small differences in results. @@ -727,7 +727,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // made these lambdas that can access other details about the previous updates to suppress // any duplicates. - // Note: duplicate packets are expected and not wrong. They may be sent for any number of + // Note: duplicate packets are expected and not wrong. They may be sent for any number of // reasons and the contract is that the client handles them in an idempotent manner. auto lastEdited = lastEditedFromBufferAdjusted; bool otherOverwrites = overwriteLocalData && !weOwnSimulation; @@ -1659,7 +1659,7 @@ bool EntityItem::verifyStaticCertificateProperties() { const auto hash = getStaticCertificateHash(); const auto text = reinterpret_cast(hash.constData()); const unsigned int textLength = hash.length(); - + // After DEBUG_CERT ends, we will get/cache this once from the marketplace when needed, and it likely won't be RSA. const char publicKey[] = "-----BEGIN PUBLIC KEY-----\n\ MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALCoBiDAZOClO26tC5pd7JikBL61WIgp\n\ @@ -2016,9 +2016,7 @@ void EntityItem::computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask // if this entity is a descendant of MyAvatar, don't collide with MyAvatar. This avoids the // "bootstrapping" problem where you can shoot yourself across the room by grabbing something // and holding it against your own avatar. - QUuid ancestorID = findAncestorOfType(NestableType::Avatar); - if (!ancestorID.isNull() && - (ancestorID == Physics::getSessionUUID() || ancestorID == AVATAR_SELF_ID)) { + if (isChildOfMyAvatar()) { iAmHoldingThis = true; } // also, don't bootstrap our own avatar with a hold action @@ -2425,6 +2423,7 @@ QVariantMap EntityItem::getActionArguments(const QUuid& actionID) const { } bool EntityItem::shouldSuppressLocationEdits() const { + // if any of the actions indicate they'd like suppression, suppress QHash::const_iterator i = _objectActions.begin(); while (i != _objectActions.end()) { if (i.value()->shouldSuppressLocationEdits()) { @@ -2433,6 +2432,11 @@ bool EntityItem::shouldSuppressLocationEdits() const { i++; } + // if any of the ancestors are MyAvatar, suppress + if (isChildOfMyAvatar()) { + return true; + } + return false; } @@ -2495,16 +2499,16 @@ void EntityItem::globalizeProperties(EntityItemProperties& properties, const QSt bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const { - + // The intention for the query JSON filter and this method is to be flexible to handle a variety of filters for // ALL entity properties. Some work will need to be done to the property system so that it can be more flexible // (to grab the value and default value of a property given the string representation of that property, for example) - + // currently the only property filter we handle is '+' for serverScripts // which means that we only handle a filtered query asking for entities where the serverScripts property is non-default - + static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts"; - + foreach(const auto& property, jsonFilters.keys()) { if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) { // check if this entity has a non-default value for serverScripts @@ -2515,7 +2519,7 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const { } } } - + // the json filter syntax did not match what we expected, return a match return true; } @@ -2528,7 +2532,7 @@ quint64 EntityItem::getLastSimulated() const { return result; } -void EntityItem::setLastSimulated(quint64 now) { +void EntityItem::setLastSimulated(quint64 now) { withWriteLock([&] { _lastSimulated = now; }); @@ -2549,7 +2553,7 @@ void EntityItem::setLastEdited(quint64 lastEdited) { }); } -quint64 EntityItem::getLastBroadcast() const { +quint64 EntityItem::getLastBroadcast() const { quint64 result; withReadLock([&] { result = _lastBroadcast; @@ -2557,19 +2561,19 @@ quint64 EntityItem::getLastBroadcast() const { return result; } -void EntityItem::setLastBroadcast(quint64 lastBroadcast) { +void EntityItem::setLastBroadcast(quint64 lastBroadcast) { withWriteLock([&] { _lastBroadcast = lastBroadcast; }); } -void EntityItem::markAsChangedOnServer() { +void EntityItem::markAsChangedOnServer() { withWriteLock([&] { _changedOnServer = usecTimestampNow(); }); } -quint64 EntityItem::getLastChangedOnServer() const { +quint64 EntityItem::getLastChangedOnServer() const { quint64 result; withReadLock([&] { result = _changedOnServer; @@ -2577,13 +2581,13 @@ quint64 EntityItem::getLastChangedOnServer() const { return result; } -void EntityItem::update(const quint64& now) { +void EntityItem::update(const quint64& now) { withWriteLock([&] { - _lastUpdated = now; + _lastUpdated = now; }); } -quint64 EntityItem::getLastUpdated() const { +quint64 EntityItem::getLastUpdated() const { quint64 result; withReadLock([&] { result = _lastUpdated; @@ -2591,10 +2595,10 @@ quint64 EntityItem::getLastUpdated() const { return result; } -void EntityItem::requiresRecalcBoxes() { +void EntityItem::requiresRecalcBoxes() { withWriteLock([&] { - _recalcAABox = true; - _recalcMinAACube = true; + _recalcAABox = true; + _recalcMinAACube = true; _recalcMaxAACube = true; }); } @@ -2607,7 +2611,7 @@ QString EntityItem::getHref() const { return result; } -QString EntityItem::getDescription() const { +QString EntityItem::getDescription() const { QString result; withReadLock([&] { result = _description; @@ -2629,54 +2633,54 @@ float EntityItem::getLocalRenderAlpha() const { return result; } -void EntityItem::setLocalRenderAlpha(float localRenderAlpha) { +void EntityItem::setLocalRenderAlpha(float localRenderAlpha) { withWriteLock([&] { _localRenderAlpha = localRenderAlpha; }); } -glm::vec3 EntityItem::getGravity() const { +glm::vec3 EntityItem::getGravity() const { glm::vec3 result; withReadLock([&] { result = _gravity; }); return result; -} +} -void EntityItem::setGravity(const glm::vec3& value) { +void EntityItem::setGravity(const glm::vec3& value) { withWriteLock([&] { _gravity = value; }); } -glm::vec3 EntityItem::getAcceleration() const { +glm::vec3 EntityItem::getAcceleration() const { glm::vec3 result; withReadLock([&] { result = _acceleration; }); return result; -} +} -void EntityItem::setAcceleration(const glm::vec3& value) { +void EntityItem::setAcceleration(const glm::vec3& value) { withWriteLock([&] { _acceleration = value; }); } -float EntityItem::getDamping() const { +float EntityItem::getDamping() const { float result; withReadLock([&] { result = _damping; }); return result; } -void EntityItem::setDamping(float value) { +void EntityItem::setDamping(float value) { withWriteLock([&] { _damping = value; }); } -float EntityItem::getRestitution() const { +float EntityItem::getRestitution() const { float result; withReadLock([&] { result = _restitution; @@ -2684,7 +2688,7 @@ float EntityItem::getRestitution() const { return result; } -float EntityItem::getFriction() const { +float EntityItem::getFriction() const { float result; withReadLock([&] { result = _friction; @@ -2693,35 +2697,35 @@ float EntityItem::getFriction() const { } // lifetime related properties. -float EntityItem::getLifetime() const { +float EntityItem::getLifetime() const { float result; withReadLock([&] { result = _lifetime; }); return result; -} +} -void EntityItem::setLifetime(float value) { +void EntityItem::setLifetime(float value) { withWriteLock([&] { _lifetime = value; }); } -quint64 EntityItem::getCreated() const { +quint64 EntityItem::getCreated() const { quint64 result; withReadLock([&] { result = _created; }); return result; -} +} -void EntityItem::setCreated(quint64 value) { +void EntityItem::setCreated(quint64 value) { withWriteLock([&] { _created = value; }); } -QString EntityItem::getScript() const { +QString EntityItem::getScript() const { QString result; withReadLock([&] { result = _script; @@ -2729,13 +2733,13 @@ QString EntityItem::getScript() const { return result; } -void EntityItem::setScript(const QString& value) { +void EntityItem::setScript(const QString& value) { withWriteLock([&] { _script = value; }); } -quint64 EntityItem::getScriptTimestamp() const { +quint64 EntityItem::getScriptTimestamp() const { quint64 result; withReadLock([&] { result = _scriptTimestamp; @@ -2743,13 +2747,13 @@ quint64 EntityItem::getScriptTimestamp() const { return result; } -void EntityItem::setScriptTimestamp(const quint64 value) { +void EntityItem::setScriptTimestamp(const quint64 value) { withWriteLock([&] { _scriptTimestamp = value; }); } -QString EntityItem::getServerScripts() const { +QString EntityItem::getServerScripts() const { QString result; withReadLock([&] { result = _serverScripts; @@ -2759,12 +2763,12 @@ QString EntityItem::getServerScripts() const { void EntityItem::setServerScripts(const QString& serverScripts) { withWriteLock([&] { - _serverScripts = serverScripts; + _serverScripts = serverScripts; _serverScriptsChangedTimestamp = usecTimestampNow(); }); } -QString EntityItem::getCollisionSoundURL() const { +QString EntityItem::getCollisionSoundURL() const { QString result; withReadLock([&] { result = _collisionSoundURL; @@ -2772,22 +2776,22 @@ QString EntityItem::getCollisionSoundURL() const { return result; } -glm::vec3 EntityItem::getRegistrationPoint() const { +glm::vec3 EntityItem::getRegistrationPoint() const { glm::vec3 result; withReadLock([&] { result = _registrationPoint; }); return result; -} +} void EntityItem::setRegistrationPoint(const glm::vec3& value) { withWriteLock([&] { - _registrationPoint = glm::clamp(value, 0.0f, 1.0f); + _registrationPoint = glm::clamp(value, 0.0f, 1.0f); }); dimensionsChanged(); // Registration Point affects the bounding box } -float EntityItem::getAngularDamping() const { +float EntityItem::getAngularDamping() const { float result; withReadLock([&] { result = _angularDamping; @@ -2795,13 +2799,13 @@ float EntityItem::getAngularDamping() const { return result; } -void EntityItem::setAngularDamping(float value) { +void EntityItem::setAngularDamping(float value) { withWriteLock([&] { _angularDamping = value; }); } -QString EntityItem::getName() const { +QString EntityItem::getName() const { QString result; withReadLock([&] { result = _name; @@ -2809,13 +2813,13 @@ QString EntityItem::getName() const { return result; } -void EntityItem::setName(const QString& value) { +void EntityItem::setName(const QString& value) { withWriteLock([&] { _name = value; }); } -QString EntityItem::getDebugName() { +QString EntityItem::getDebugName() { QString result = getName(); if (result.isEmpty()) { result = getID().toString(); @@ -2823,7 +2827,7 @@ QString EntityItem::getDebugName() { return result; } -bool EntityItem::getVisible() const { +bool EntityItem::getVisible() const { bool result; withReadLock([&] { result = _visible; @@ -2831,13 +2835,18 @@ bool EntityItem::getVisible() const { return result; } -void EntityItem::setVisible(bool value) { +void EntityItem::setVisible(bool value) { withWriteLock([&] { _visible = value; }); } -bool EntityItem::getCollisionless() const { +bool EntityItem::isChildOfMyAvatar() const { + QUuid ancestorID = findAncestorOfType(NestableType::Avatar); + return !ancestorID.isNull() && (ancestorID == Physics::getSessionUUID() || ancestorID == AVATAR_SELF_ID); +} + +bool EntityItem::getCollisionless() const { bool result; withReadLock([&] { result = _collisionless; @@ -2845,13 +2854,13 @@ bool EntityItem::getCollisionless() const { return result; } -void EntityItem::setCollisionless(bool value) { +void EntityItem::setCollisionless(bool value) { withWriteLock([&] { _collisionless = value; }); } -uint8_t EntityItem::getCollisionMask() const { +uint8_t EntityItem::getCollisionMask() const { uint8_t result; withReadLock([&] { result = _collisionMask; @@ -2859,13 +2868,13 @@ uint8_t EntityItem::getCollisionMask() const { return result; } -void EntityItem::setCollisionMask(uint8_t value) { +void EntityItem::setCollisionMask(uint8_t value) { withWriteLock([&] { _collisionMask = value; }); } -bool EntityItem::getDynamic() const { +bool EntityItem::getDynamic() const { if (SHAPE_TYPE_STATIC_MESH == getShapeType()) { return false; } @@ -2876,13 +2885,13 @@ bool EntityItem::getDynamic() const { return result; } -void EntityItem::setDynamic(bool value) { +void EntityItem::setDynamic(bool value) { withWriteLock([&] { _dynamic = value; }); } -bool EntityItem::getLocked() const { +bool EntityItem::getLocked() const { bool result; withReadLock([&] { result = _locked; @@ -2890,7 +2899,7 @@ bool EntityItem::getLocked() const { return result; } -void EntityItem::setLocked(bool value) { +void EntityItem::setLocked(bool value) { withWriteLock([&] { _locked = value; }); @@ -2913,7 +2922,7 @@ void EntityItem::updateLocked(bool value) { } } -QString EntityItem::getUserData() const { +QString EntityItem::getUserData() const { QString result; withReadLock([&] { result = _userData; @@ -2921,7 +2930,7 @@ QString EntityItem::getUserData() const { return result; } -void EntityItem::setUserData(const QString& value) { +void EntityItem::setUserData(const QString& value) { withWriteLock([&] { _userData = value; }); @@ -2955,7 +2964,7 @@ DEFINE_PROPERTY_ACCESSOR(quint32, EditionNumber, editionNumber) DEFINE_PROPERTY_ACCESSOR(quint32, EntityInstanceNumber, entityInstanceNumber) DEFINE_PROPERTY_ACCESSOR(QString, CertificateID, certificateID) -uint32_t EntityItem::getDirtyFlags() const { +uint32_t EntityItem::getDirtyFlags() const { uint32_t result; withReadLock([&] { result = _dirtyFlags; @@ -2970,7 +2979,7 @@ void EntityItem::markDirtyFlags(uint32_t mask) { }); } -void EntityItem::clearDirtyFlags(uint32_t mask) { +void EntityItem::clearDirtyFlags(uint32_t mask) { withWriteLock([&] { _dirtyFlags &= ~mask; }); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index c26f1694a9..d1f34217fa 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -273,6 +273,8 @@ public: inline bool isVisible() const { return getVisible(); } inline bool isInvisible() const { return !getVisible(); } + bool isChildOfMyAvatar() const; + bool getCollisionless() const; void setCollisionless(bool value); diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 7c84017758..df46f7ada7 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -491,6 +491,10 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationStep) { return true; } + if (_entity->shouldSuppressLocationEdits()) { + return false; + } + if (!isLocallyOwned()) { // we don't own the simulation @@ -577,7 +581,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_ } if (properties.transformChanged()) { - if (_entity->checkAndMaybeUpdateQueryAACube()) { + if (_entity->checkAndMaybeUpdateQueryAACube(true)) { // due to parenting, the server may not know where something is in world-space, so include the bounding cube. properties.setQueryAACube(_entity->getQueryAACube()); } diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 8c43632456..e76e3dfe27 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -963,19 +963,21 @@ AACube SpatiallyNestable::getMaximumAACube(bool& success) const { const float PARENTED_EXPANSION_FACTOR = 3.0f; -bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube() { +bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube(bool forcePuffed) { + bool updated = false; bool success = false; AACube maxAACube = getMaximumAACube(success); if (success) { // maybe update _queryAACube if (!_queryAACubeSet || (_parentID.isNull() && _children.size() == 0) || !_queryAACube.contains(maxAACube)) { - if (_parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) { + if (forcePuffed || _parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) { // make an expanded AACube centered on the object float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); } else { _queryAACube = maxAACube; } + updated = true; forEachDescendant([&](const SpatiallyNestablePointer& descendant) { bool childSuccess; @@ -991,7 +993,7 @@ bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube() { _queryAACubeSet = true; } } - return success; + return updated; } void SpatiallyNestable::setQueryAACube(const AACube& queryAACube) { @@ -1008,6 +1010,12 @@ bool SpatiallyNestable::queryAACubeNeedsUpdate() const { return true; } + bool success; + AACube maxAACube = getMaximumAACube(success); + if (success && !_queryAACube.contains(maxAACube)) { + return true; + } + // make sure children are still in their boxes, also. bool childNeedsUpdate = false; forEachDescendantTest([&](const SpatiallyNestablePointer& descendant) { diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index b6be4dc056..9be6dc14ef 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -106,7 +106,7 @@ public: virtual glm::vec3 getParentAngularVelocity(bool& success) const; virtual AACube getMaximumAACube(bool& success) const; - bool checkAndMaybeUpdateQueryAACube(); + bool checkAndMaybeUpdateQueryAACube(bool forcePuffed = false); void updateQueryAACube(); virtual void setQueryAACube(const AACube& queryAACube); From ae70f091c3b681c215a7dfb36e9d414123badb76 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 12 Oct 2017 14:04:50 -0700 Subject: [PATCH 2/8] don't accept updates to queryAACube if this interface is simulation owner --- libraries/entities/src/EntityItem.cpp | 36 ++++++++++++++++++++------- libraries/entities/src/EntityItem.h | 3 +++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index cdba87ff69..9e48876cfb 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -717,6 +717,14 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef weOwnSimulation = _simulationOwner.matchesValidID(myNodeID); } } + + auto lastEdited = lastEditedFromBufferAdjusted; + bool otherOverwrites = overwriteLocalData && !weOwnSimulation; + auto shouldUpdate = [lastEdited, otherOverwrites, filterRejection](quint64 updatedTimestamp, bool valueChanged) { + bool simulationChanged = lastEdited > updatedTimestamp; + return otherOverwrites && simulationChanged && (valueChanged || filterRejection); + }; + { // When we own the simulation we don't accept updates to the entity's transform/velocities // we also want to ignore any duplicate packets that have the same "recently updated" values // as a packet we've already recieved. This is because we want multiple edits of the same @@ -729,12 +737,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // Note: duplicate packets are expected and not wrong. They may be sent for any number of // reasons and the contract is that the client handles them in an idempotent manner. - auto lastEdited = lastEditedFromBufferAdjusted; - bool otherOverwrites = overwriteLocalData && !weOwnSimulation; - auto shouldUpdate = [lastEdited, otherOverwrites, filterRejection](quint64 updatedTimestamp, bool valueChanged) { - bool simulationChanged = lastEdited > updatedTimestamp; - return otherOverwrites && simulationChanged && (valueChanged || filterRejection); - }; auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) { updatePositionFromNetwork(value); @@ -780,8 +782,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef READ_ENTITY_PROPERTY(PROP_VELOCITY, glm::vec3, customUpdateVelocityFromNetwork); READ_ENTITY_PROPERTY(PROP_ANGULAR_VELOCITY, glm::vec3, customUpdateAngularVelocityFromNetwork); READ_ENTITY_PROPERTY(PROP_ACCELERATION, glm::vec3, customSetAcceleration); - - } READ_ENTITY_PROPERTY(PROP_DIMENSIONS, glm::vec3, updateDimensions); @@ -846,7 +846,18 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef overwriteLocalData = oldOverwrite; } - READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, setQueryAACube); + + { + auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value){ + if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) { + updateQueryAACubeFromNetwork(value); + _lastUpdatedQueryAACubeTimestamp = lastEdited; + _lastUpdatedQueryAACubeValue = value; + } + }; + READ_ENTITY_PROPERTY(PROP_QUERY_AA_CUBE, AACube, customUpdateQueryAACubeFromNetwork); + } + READ_ENTITY_PROPERTY(PROP_LAST_EDITED_BY, QUuid, setLastEditedBy); bytesRead += readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, @@ -1846,6 +1857,13 @@ void EntityItem::updateVelocityFromNetwork(const glm::vec3& value) { updateVelocity(value); } +void EntityItem::updateQueryAACubeFromNetwork(const AACube& value) { + if (shouldSuppressLocationEdits()) { + return; + } + setQueryAACube(value); +} + void EntityItem::updateDamping(float value) { auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); if (_damping != clampedDamping) { diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index d1f34217fa..01a4f67b2c 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -364,6 +364,7 @@ public: void updateMass(float value); void updateVelocity(const glm::vec3& value); void updateVelocityFromNetwork(const glm::vec3& value); + void updateQueryAACubeFromNetwork(const AACube& value); void updateDamping(float value); void updateRestitution(float value); void updateFriction(float value); @@ -631,12 +632,14 @@ protected: glm::vec3 _lastUpdatedVelocityValue; glm::vec3 _lastUpdatedAngularVelocityValue; glm::vec3 _lastUpdatedAccelerationValue; + AACube _lastUpdatedQueryAACubeValue; quint64 _lastUpdatedPositionTimestamp { 0 }; quint64 _lastUpdatedRotationTimestamp { 0 }; quint64 _lastUpdatedVelocityTimestamp { 0 }; quint64 _lastUpdatedAngularVelocityTimestamp { 0 }; quint64 _lastUpdatedAccelerationTimestamp { 0 }; + quint64 _lastUpdatedQueryAACubeTimestamp { 0 }; }; From cf960dc44b925a4370fac17ee98b101d11fc1112 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 Oct 2017 09:29:50 -0700 Subject: [PATCH 3/8] not a parent or child doesn't mean always recompute queryAACube --- libraries/shared/src/SpatiallyNestable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index e76e3dfe27..58456f7e9a 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -969,7 +969,7 @@ bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube(bool forcePuffed) { AACube maxAACube = getMaximumAACube(success); if (success) { // maybe update _queryAACube - if (!_queryAACubeSet || (_parentID.isNull() && _children.size() == 0) || !_queryAACube.contains(maxAACube)) { + if (!_queryAACubeSet || !_queryAACube.contains(maxAACube)) { if (forcePuffed || _parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) { // make an expanded AACube centered on the object float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); From f2cb5d4aff1c36847f483c8ade1ce65974d1749c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 Oct 2017 11:26:58 -0700 Subject: [PATCH 4/8] clean-up concept of puffed queryAACube --- interface/src/avatar/MyAvatar.cpp | 2 +- .../RenderableParticleEffectEntityItem.cpp | 4 +- libraries/entities/src/EntityItem.cpp | 6 +- libraries/entities/src/EntityItem.h | 1 + .../entities/src/EntityScriptingInterface.cpp | 4 +- libraries/entities/src/EntityTree.cpp | 2 +- .../entities/src/SimpleEntitySimulation.cpp | 2 +- libraries/physics/src/EntityMotionState.cpp | 4 +- libraries/shared/src/SpatiallyNestable.cpp | 85 +++++++------------ libraries/shared/src/SpatiallyNestable.h | 5 +- 10 files changed, 50 insertions(+), 65 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index cccc13711d..3189ad3c77 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -587,7 +587,7 @@ void MyAvatar::simulate(float deltaTime) { MovingEntitiesOperator moveOperator; forEachDescendant([&](SpatiallyNestablePointer object) { // if the queryBox has changed, tell the entity-server - if (object->getNestableType() == NestableType::Entity && object->checkAndMaybeUpdateQueryAACube()) { + if (object->getNestableType() == NestableType::Entity && object->updateQueryAACube()) { EntityItemPointer entity = std::static_pointer_cast(object); bool success; AACube newCube = entity->getQueryAACube(success); diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index 3328076911..047217b6aa 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -69,8 +69,8 @@ ParticleEffectEntityRenderer::ParticleEffectEntityRenderer(const EntityItemPoint } bool ParticleEffectEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointer& entity) const { - entity->checkAndMaybeUpdateQueryAACube(); - + entity->updateQueryAACube(); + if (_emitting != entity->getIsEmitting()) { return true; } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 9e48876cfb..421efac687 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1392,8 +1392,7 @@ bool EntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(lastEditedBy, setLastEditedBy); - AACube saveQueryAACube = _queryAACube; - if (checkAndMaybeUpdateQueryAACube() && saveQueryAACube != _queryAACube) { + if (updateQueryAACube()) { somethingChanged = true; } @@ -1557,6 +1556,9 @@ AACube EntityItem::getQueryAACube(bool& success) const { return result; } +bool EntityItem::shouldPuffQueryAACube() const { + return hasActions() || isChildOfMyAvatar(); +} // NOTE: This should only be used in cases of old bitstreams which only contain radius data // 0,0,0 --> maxDimension,maxDimension,maxDimension diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 01a4f67b2c..764ff34f99 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -240,6 +240,7 @@ public: using SpatiallyNestable::getQueryAACube; virtual AACube getQueryAACube(bool& success) const override; + virtual bool shouldPuffQueryAACube() const override; QString getScript() const; void setScript(const QString& value); diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f5117dddc0..66bb24825f 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -457,7 +457,7 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& // if they've changed. entity->forEachDescendant([&](SpatiallyNestablePointer descendant) { if (descendant->getNestableType() == NestableType::Entity) { - if (descendant->checkAndMaybeUpdateQueryAACube()) { + if (descendant->updateQueryAACube()) { EntityItemPointer entityDescendant = std::static_pointer_cast(descendant); EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); @@ -1792,4 +1792,4 @@ QString EntityScriptingInterface::computeCertificateID(const QUuid& entityID) { } return result; } -#endif \ No newline at end of file +#endif diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index d16aeaa6e1..e4de39a799 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1804,7 +1804,7 @@ QVector EntityTree::sendEntities(EntityEditPacketSender* packetSen addToNeedsParentFixupList(entity); } entity->forceQueryAACubeUpdate(); - entity->checkAndMaybeUpdateQueryAACube(); + entity->updateQueryAACube(); moveOperator.addEntityToMoveList(entity, entity->getQueryAACube()); i++; } else { diff --git a/libraries/entities/src/SimpleEntitySimulation.cpp b/libraries/entities/src/SimpleEntitySimulation.cpp index d41b22137e..3203c2968c 100644 --- a/libraries/entities/src/SimpleEntitySimulation.cpp +++ b/libraries/entities/src/SimpleEntitySimulation.cpp @@ -136,7 +136,7 @@ void SimpleEntitySimulation::sortEntitiesThatMoved() { SetOfEntities::iterator itemItr = _entitiesToSort.begin(); while (itemItr != _entitiesToSort.end()) { EntityItemPointer entity = *itemItr; - entity->checkAndMaybeUpdateQueryAACube(); + entity->updateQueryAACube(); ++itemItr; } EntitySimulation::sortEntitiesThatMoved(); diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index df46f7ada7..6884482074 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -581,7 +581,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_ } if (properties.transformChanged()) { - if (_entity->checkAndMaybeUpdateQueryAACube(true)) { + if (_entity->updateQueryAACube()) { // due to parenting, the server may not know where something is in world-space, so include the bounding cube. properties.setQueryAACube(_entity->getQueryAACube()); } @@ -648,7 +648,7 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_ _entity->forEachDescendant([&](SpatiallyNestablePointer descendant) { if (descendant->getNestableType() == NestableType::Entity) { EntityItemPointer entityDescendant = std::static_pointer_cast(descendant); - if (descendant->checkAndMaybeUpdateQueryAACube()) { + if (descendant->updateQueryAACube()) { EntityItemProperties newQueryCubeProperties; newQueryCubeProperties.setQueryAACube(descendant->getQueryAACube()); newQueryCubeProperties.setLastEdited(properties.getLastEdited()); diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 58456f7e9a..baa289095d 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -963,37 +963,39 @@ AACube SpatiallyNestable::getMaximumAACube(bool& success) const { const float PARENTED_EXPANSION_FACTOR = 3.0f; -bool SpatiallyNestable::checkAndMaybeUpdateQueryAACube(bool forcePuffed) { - bool updated = false; - bool success = false; +bool SpatiallyNestable::updateQueryAACube() { + if (!queryAACubeNeedsUpdate()) { + return false; + } + + bool success; AACube maxAACube = getMaximumAACube(success); if (success) { - // maybe update _queryAACube - if (!_queryAACubeSet || !_queryAACube.contains(maxAACube)) { - if (forcePuffed || _parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) { - // make an expanded AACube centered on the object - float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); - _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); - } else { - _queryAACube = maxAACube; - } - updated = true; - - forEachDescendant([&](const SpatiallyNestablePointer& descendant) { - bool childSuccess; - AACube descendantAACube = descendant->getQueryAACube(childSuccess); - if (childSuccess) { - if (_queryAACube.contains(descendantAACube)) { - return ; - } - _queryAACube += descendantAACube.getMinimumPoint(); - _queryAACube += descendantAACube.getMaximumPoint(); - } - }); - _queryAACubeSet = true; + if (shouldPuffQueryAACube()) { + // make an expanded AACube centered on the object + float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); + _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); + _queryAACubeIsPuffed = true; + } else { + _queryAACube = maxAACube; + _queryAACubeIsPuffed = false; } + + forEachDescendant([&](const SpatiallyNestablePointer& descendant) { + bool childSuccess; + AACube descendantAACube = descendant->getQueryAACube(childSuccess); + if (childSuccess) { + if (_queryAACube.contains(descendantAACube)) { + return; // from lambda + } + _queryAACube += descendantAACube.getMinimumPoint(); + _queryAACube += descendantAACube.getMaximumPoint(); + } + }); + + _queryAACubeSet = true; } - return updated; + return true; } void SpatiallyNestable::setQueryAACube(const AACube& queryAACube) { @@ -1016,6 +1018,10 @@ bool SpatiallyNestable::queryAACubeNeedsUpdate() const { return true; } + if (shouldPuffQueryAACube() != _queryAACubeIsPuffed) { + return true; + } + // make sure children are still in their boxes, also. bool childNeedsUpdate = false; forEachDescendantTest([&](const SpatiallyNestablePointer& descendant) { @@ -1029,31 +1035,6 @@ bool SpatiallyNestable::queryAACubeNeedsUpdate() const { return childNeedsUpdate; } -void SpatiallyNestable::updateQueryAACube() { - bool success; - AACube maxAACube = getMaximumAACube(success); - if (_parentJointIndex != INVALID_JOINT_INDEX || _children.size() > 0 ) { - // make an expanded AACube centered on the object - float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); - _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); - } else { - _queryAACube = maxAACube; - } - - forEachDescendant([&](const SpatiallyNestablePointer& descendant) { - bool success; - AACube descendantAACube = descendant->getQueryAACube(success); - if (success) { - if (_queryAACube.contains(descendantAACube)) { - return; - } - _queryAACube += descendantAACube.getMinimumPoint(); - _queryAACube += descendantAACube.getMaximumPoint(); - } - }); - _queryAACubeSet = true; -} - AACube SpatiallyNestable::getQueryAACube(bool& success) const { if (_queryAACubeSet) { success = true; diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index 9be6dc14ef..37f6cfdfd9 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -106,11 +106,11 @@ public: virtual glm::vec3 getParentAngularVelocity(bool& success) const; virtual AACube getMaximumAACube(bool& success) const; - bool checkAndMaybeUpdateQueryAACube(bool forcePuffed = false); - void updateQueryAACube(); virtual void setQueryAACube(const AACube& queryAACube); virtual bool queryAACubeNeedsUpdate() const; + virtual bool shouldPuffQueryAACube() const { return false; } + bool updateQueryAACube(); void forceQueryAACubeUpdate() { _queryAACubeSet = false; } virtual AACube getQueryAACube(bool& success) const; virtual AACube getQueryAACube() const; @@ -234,6 +234,7 @@ private: glm::vec3 _angularVelocity; mutable bool _parentKnowsMe { false }; bool _isDead { false }; + bool _queryAACubeIsPuffed { false }; }; From 633f63df54041b6f53e2a0c47fa7fcdcd2ad7189 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 Oct 2017 13:11:18 -0700 Subject: [PATCH 5/8] fix updateQueryAACube return-value --- libraries/shared/src/SpatiallyNestable.cpp | 50 +++++++++++----------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index baa289095d..8dbd2dd5e0 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -970,31 +970,33 @@ bool SpatiallyNestable::updateQueryAACube() { bool success; AACube maxAACube = getMaximumAACube(success); - if (success) { - if (shouldPuffQueryAACube()) { - // make an expanded AACube centered on the object - float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); - _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); - _queryAACubeIsPuffed = true; - } else { - _queryAACube = maxAACube; - _queryAACubeIsPuffed = false; - } - - forEachDescendant([&](const SpatiallyNestablePointer& descendant) { - bool childSuccess; - AACube descendantAACube = descendant->getQueryAACube(childSuccess); - if (childSuccess) { - if (_queryAACube.contains(descendantAACube)) { - return; // from lambda - } - _queryAACube += descendantAACube.getMinimumPoint(); - _queryAACube += descendantAACube.getMaximumPoint(); - } - }); - - _queryAACubeSet = true; + if (!success) { + return false; } + + if (shouldPuffQueryAACube()) { + // make an expanded AACube centered on the object + float scale = PARENTED_EXPANSION_FACTOR * maxAACube.getScale(); + _queryAACube = AACube(maxAACube.calcCenter() - glm::vec3(0.5f * scale), scale); + _queryAACubeIsPuffed = true; + } else { + _queryAACube = maxAACube; + _queryAACubeIsPuffed = false; + } + + forEachDescendant([&](const SpatiallyNestablePointer& descendant) { + bool childSuccess; + AACube descendantAACube = descendant->getQueryAACube(childSuccess); + if (childSuccess) { + if (_queryAACube.contains(descendantAACube)) { + return; // from lambda + } + _queryAACube += descendantAACube.getMinimumPoint(); + _queryAACube += descendantAACube.getMaximumPoint(); + } + }); + + _queryAACubeSet = true; return true; } From c1e8d5144c14dce5912bce3e0f7ee21d04047316 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 Oct 2017 14:53:36 -0700 Subject: [PATCH 6/8] remove code which is no longer needed because of custom physics setters --- libraries/entities/src/EntityItem.cpp | 15 --------------- libraries/entities/src/EntityTree.cpp | 3 ++- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 421efac687..705867c8d9 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1767,9 +1767,6 @@ void EntityItem::updateParentID(const QUuid& value) { } void EntityItem::updatePositionFromNetwork(const glm::vec3& value) { - if (shouldSuppressLocationEdits()) { - return; - } updatePosition(value); } @@ -1796,9 +1793,6 @@ void EntityItem::updateRotation(const glm::quat& rotation) { } void EntityItem::updateRotationFromNetwork(const glm::quat& rotation) { - if (shouldSuppressLocationEdits()) { - return; - } updateRotation(rotation); } @@ -1853,16 +1847,10 @@ void EntityItem::updateVelocity(const glm::vec3& value) { } void EntityItem::updateVelocityFromNetwork(const glm::vec3& value) { - if (shouldSuppressLocationEdits()) { - return; - } updateVelocity(value); } void EntityItem::updateQueryAACubeFromNetwork(const AACube& value) { - if (shouldSuppressLocationEdits()) { - return; - } setQueryAACube(value); } @@ -1918,9 +1906,6 @@ void EntityItem::updateAngularVelocity(const glm::vec3& value) { } void EntityItem::updateAngularVelocityFromNetwork(const glm::vec3& value) { - if (shouldSuppressLocationEdits()) { - return; - } updateAngularVelocity(value); } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index e4de39a799..b58d10ce24 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1028,7 +1028,8 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList Date: Fri, 13 Oct 2017 15:40:08 -0700 Subject: [PATCH 7/8] cleanups + call updateQueryAACube when parent changes or action is deleted --- libraries/entities/src/EntityItem.cpp | 32 ++++++--------------------- libraries/entities/src/EntityItem.h | 5 ----- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 705867c8d9..79e78f9dc7 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -739,7 +739,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef // reasons and the contract is that the client handles them in an idempotent manner. auto customUpdatePositionFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedPositionTimestamp, value != _lastUpdatedPositionValue)) { - updatePositionFromNetwork(value); + updatePosition(value); _lastUpdatedPositionTimestamp = lastEdited; _lastUpdatedPositionValue = value; } @@ -747,7 +747,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef auto customUpdateRotationFromNetwork = [this, shouldUpdate, lastEdited](glm::quat value){ if (shouldUpdate(_lastUpdatedRotationTimestamp, value != _lastUpdatedRotationValue)) { - updateRotationFromNetwork(value); + updateRotation(value); _lastUpdatedRotationTimestamp = lastEdited; _lastUpdatedRotationValue = value; } @@ -755,7 +755,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef auto customUpdateVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedVelocityTimestamp, value != _lastUpdatedVelocityValue)) { - updateVelocityFromNetwork(value); + updateVelocity(value); _lastUpdatedVelocityTimestamp = lastEdited; _lastUpdatedVelocityValue = value; } @@ -763,7 +763,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef auto customUpdateAngularVelocityFromNetwork = [this, shouldUpdate, lastEdited](glm::vec3 value){ if (shouldUpdate(_lastUpdatedAngularVelocityTimestamp, value != _lastUpdatedAngularVelocityValue)) { - updateAngularVelocityFromNetwork(value); + updateAngularVelocity(value); _lastUpdatedAngularVelocityTimestamp = lastEdited; _lastUpdatedAngularVelocityValue = value; } @@ -850,7 +850,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef { auto customUpdateQueryAACubeFromNetwork = [this, shouldUpdate, lastEdited](AACube value){ if (shouldUpdate(_lastUpdatedQueryAACubeTimestamp, value != _lastUpdatedQueryAACubeValue)) { - updateQueryAACubeFromNetwork(value); + setQueryAACube(value); _lastUpdatedQueryAACubeTimestamp = lastEdited; _lastUpdatedQueryAACubeValue = value; } @@ -1763,13 +1763,10 @@ void EntityItem::updateParentID(const QUuid& value) { if (tree) { tree->addToNeedsParentFixupList(getThisPointer()); } + updateQueryAACube(); } } -void EntityItem::updatePositionFromNetwork(const glm::vec3& value) { - updatePosition(value); -} - void EntityItem::updateDimensions(const glm::vec3& value) { if (getDimensions() != value) { setDimensions(value); @@ -1792,10 +1789,6 @@ void EntityItem::updateRotation(const glm::quat& rotation) { } } -void EntityItem::updateRotationFromNetwork(const glm::quat& rotation) { - updateRotation(rotation); -} - void EntityItem::updateMass(float mass) { // Setting the mass actually changes the _density (at fixed volume), however // we must protect the density range to help maintain stability of physics simulation @@ -1846,14 +1839,6 @@ void EntityItem::updateVelocity(const glm::vec3& value) { } } -void EntityItem::updateVelocityFromNetwork(const glm::vec3& value) { - updateVelocity(value); -} - -void EntityItem::updateQueryAACubeFromNetwork(const AACube& value) { - setQueryAACube(value); -} - void EntityItem::updateDamping(float value) { auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); if (_damping != clampedDamping) { @@ -1905,10 +1890,6 @@ void EntityItem::updateAngularVelocity(const glm::vec3& value) { } } -void EntityItem::updateAngularVelocityFromNetwork(const glm::vec3& value) { - updateAngularVelocity(value); -} - void EntityItem::updateAngularDamping(float value) { auto clampedDamping = glm::clamp(value, 0.0f, 1.0f); if (_angularDamping != clampedDamping) { @@ -2213,6 +2194,7 @@ bool EntityItem::removeActionInternal(const QUuid& actionID, EntitySimulationPoi _dirtyFlags |= Simulation::DIRTY_PHYSICS_ACTIVATION; _dirtyFlags |= Simulation::DIRTY_COLLISION_GROUP; // may need to not collide with own avatar setDynamicDataNeedsTransmit(true); + updateQueryAACube(); return success; } return false; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 764ff34f99..ce4bf13896 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -357,21 +357,16 @@ public: virtual void updateRegistrationPoint(const glm::vec3& value); void updatePosition(const glm::vec3& value); void updateParentID(const QUuid& value); - void updatePositionFromNetwork(const glm::vec3& value); void updateDimensions(const glm::vec3& value); void updateRotation(const glm::quat& rotation); - void updateRotationFromNetwork(const glm::quat& rotation); void updateDensity(float value); void updateMass(float value); void updateVelocity(const glm::vec3& value); - void updateVelocityFromNetwork(const glm::vec3& value); - void updateQueryAACubeFromNetwork(const AACube& value); void updateDamping(float value); void updateRestitution(float value); void updateFriction(float value); void updateGravity(const glm::vec3& value); void updateAngularVelocity(const glm::vec3& value); - void updateAngularVelocityFromNetwork(const glm::vec3& value); void updateAngularDamping(float value); void updateCollisionless(bool value); void updateCollisionMask(uint8_t value); From 2c8c5e214cec55ba95f5ae52f192d88d1a24e78a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 13 Oct 2017 16:10:58 -0700 Subject: [PATCH 8/8] puff querybox if entity is in motion --- libraries/entities/src/EntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 79e78f9dc7..9af39254ed 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1557,7 +1557,7 @@ AACube EntityItem::getQueryAACube(bool& success) const { } bool EntityItem::shouldPuffQueryAACube() const { - return hasActions() || isChildOfMyAvatar(); + return hasActions() || isChildOfMyAvatar() || isMovingRelativeToParent(); } // NOTE: This should only be used in cases of old bitstreams which only contain radius data