From a263091c94e9a02d4e252df318b514854bf4732e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 14 Apr 2016 13:48:24 -0700 Subject: [PATCH] fix entity-server crash for out of bounds --- libraries/entities/src/EntityItem.cpp | 11 ++++++----- libraries/entities/src/EntitySimulation.cpp | 3 +-- libraries/entities/src/EntitySimulation.h | 2 +- libraries/entities/src/SimpleEntitySimulation.cpp | 9 +++++++++ libraries/entities/src/SimpleEntitySimulation.h | 2 ++ libraries/shared/src/SpatiallyNestable.cpp | 4 ++-- libraries/shared/src/SpatiallyNestable.h | 2 +- 7 files changed, 22 insertions(+), 11 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 1f5db65089..65811c5c57 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -926,7 +926,8 @@ void EntityItem::simulateKinematicMotion(float timeElapsed, bool setFlags) { glm::quat dQ = computeBulletRotationStep(localAngularVelocity, dt); rotation = glm::normalize(dQ * rotation); - setRotation(rotation); + bool success; + setOrientation(rotation, success, false); } setLocalAngularVelocity(localAngularVelocity); @@ -1983,10 +1984,10 @@ void EntityItem::locationChanged(bool tellPhysics) { requiresRecalcBoxes(); if (tellPhysics) { _dirtyFlags |= Simulation::DIRTY_TRANSFORM; - } - EntityTreePointer tree = getTree(); - if (tree) { - tree->entityChanged(getThisPointer()); + EntityTreePointer tree = getTree(); + if (tree) { + tree->entityChanged(getThisPointer()); + } } SpatiallyNestable::locationChanged(tellPhysics); // tell all the children, also } diff --git a/libraries/entities/src/EntitySimulation.cpp b/libraries/entities/src/EntitySimulation.cpp index 14bfc5ac7a..7eed6d1c1a 100644 --- a/libraries/entities/src/EntitySimulation.cpp +++ b/libraries/entities/src/EntitySimulation.cpp @@ -35,6 +35,7 @@ void EntitySimulation::updateEntities() { callUpdateOnEntitiesThatNeedIt(now); moveSimpleKinematics(now); updateEntitiesInternal(now); + PerformanceTimer perfTimer("sortingEntities"); sortEntitiesThatMoved(); } @@ -133,10 +134,8 @@ void EntitySimulation::callUpdateOnEntitiesThatNeedIt(const quint64& now) { // protected void EntitySimulation::sortEntitiesThatMoved() { - QMutexLocker lock(&_mutex); // NOTE: this is only for entities that have been moved by THIS EntitySimulation. // External changes to entity position/shape are expected to be sorted outside of the EntitySimulation. - PerformanceTimer perfTimer("sortingEntities"); MovingEntitiesOperator moveOperator(_entityTree); AACube domainBounds(glm::vec3((float)-HALF_TREE_SCALE), (float)TREE_SCALE); SetOfEntities::iterator itemItr = _entitiesToSort.begin(); diff --git a/libraries/entities/src/EntitySimulation.h b/libraries/entities/src/EntitySimulation.h index 442ff4a74b..cbedbbd868 100644 --- a/libraries/entities/src/EntitySimulation.h +++ b/libraries/entities/src/EntitySimulation.h @@ -92,7 +92,7 @@ protected: void expireMortalEntities(const quint64& now); void callUpdateOnEntitiesThatNeedIt(const quint64& now); - void sortEntitiesThatMoved(); + virtual void sortEntitiesThatMoved(); QMutex _mutex{ QMutex::Recursive }; diff --git a/libraries/entities/src/SimpleEntitySimulation.cpp b/libraries/entities/src/SimpleEntitySimulation.cpp index 6bf25f767d..e406926141 100644 --- a/libraries/entities/src/SimpleEntitySimulation.cpp +++ b/libraries/entities/src/SimpleEntitySimulation.cpp @@ -132,3 +132,12 @@ void SimpleEntitySimulation::clearEntitiesInternal() { _entitiesThatNeedSimulationOwner.clear(); } +void SimpleEntitySimulation::sortEntitiesThatMoved() { + SetOfEntities::iterator itemItr = _entitiesToSort.begin(); + while (itemItr != _entitiesToSort.end()) { + EntityItemPointer entity = *itemItr; + entity->computePuffedQueryAACube(); + ++itemItr; + } + EntitySimulation::sortEntitiesThatMoved(); +} diff --git a/libraries/entities/src/SimpleEntitySimulation.h b/libraries/entities/src/SimpleEntitySimulation.h index d9c04fdcf9..12ded8a30d 100644 --- a/libraries/entities/src/SimpleEntitySimulation.h +++ b/libraries/entities/src/SimpleEntitySimulation.h @@ -30,6 +30,8 @@ protected: virtual void changeEntityInternal(EntityItemPointer entity) override; virtual void clearEntitiesInternal() override; + virtual void sortEntitiesThatMoved() override; + SetOfEntities _entitiesWithSimulationOwner; SetOfEntities _entitiesThatNeedSimulationOwner; quint64 _nextOwnerlessExpiry { 0 }; diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 11d0668001..c4cb4f94ba 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -620,7 +620,7 @@ glm::vec3 SpatiallyNestable::getLocalPosition() const { return result; } -void SpatiallyNestable::setLocalPosition(const glm::vec3& position) { +void SpatiallyNestable::setLocalPosition(const glm::vec3& position, bool tellPhysics) { // guard against introducing NaN into the transform if (isNaN(position)) { qDebug() << "SpatiallyNestable::setLocalPosition -- position contains NaN"; @@ -629,7 +629,7 @@ void SpatiallyNestable::setLocalPosition(const glm::vec3& position) { _transformLock.withWriteLock([&] { _transform.setTranslation(position); }); - locationChanged(); + locationChanged(tellPhysics); } glm::quat SpatiallyNestable::getLocalOrientation() const { diff --git a/libraries/shared/src/SpatiallyNestable.h b/libraries/shared/src/SpatiallyNestable.h index c120c1010c..6485c23b87 100644 --- a/libraries/shared/src/SpatiallyNestable.h +++ b/libraries/shared/src/SpatiallyNestable.h @@ -102,7 +102,7 @@ public: virtual void setLocalTransform(const Transform& transform); virtual glm::vec3 getLocalPosition() const; - virtual void setLocalPosition(const glm::vec3& position); + virtual void setLocalPosition(const glm::vec3& position, bool tellPhysics = true); virtual glm::quat getLocalOrientation() const; virtual void setLocalOrientation(const glm::quat& orientation);