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);