From 61d12923ea794373ee6b951ea16125f9ebc2aff2 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 13 Aug 2018 16:49:51 -0700 Subject: [PATCH] Do not copy list of collision pick contact points when filtering them --- interface/src/raypick/CollisionPick.cpp | 20 ++++++++++---------- interface/src/raypick/CollisionPick.h | 2 +- libraries/physics/src/PhysicsEngine.cpp | 2 +- libraries/physics/src/PhysicsEngine.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 87c8c91e6d..a70882eed0 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -308,20 +308,18 @@ CollisionRegion CollisionPick::getMathematicalPick() const { return _mathPick; } -const std::vector CollisionPick::filterIntersections(const std::vector& intersections) const { - std::vector filteredIntersections; - +void CollisionPick::filterIntersections(std::vector& intersections) const { const QVector& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); bool isWhitelist = includeItems.size(); - for (const auto& intersection : intersections) { + for (int i = 0; i < intersections.size(); i++) { + auto& intersection = intersections[i]; const QUuid& id = intersection.foundID; - if (!ignoreItems.contains(id) && (!isWhitelist || includeItems.contains(id))) { - filteredIntersections.push_back(intersection); + if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { + intersections[i] = intersections[intersections.size()-1]; + intersections.pop_back(); } } - - return filteredIntersections; } PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) { @@ -330,7 +328,8 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - const auto& entityIntersections = filterIntersections(_physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform)); + auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); + filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); } @@ -344,7 +343,8 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - const auto& avatarIntersections = filterIntersections(_physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform)); + auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); + filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::vector(), avatarIntersections); } diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index b3a7186893..bfc3487a62 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -92,7 +92,7 @@ protected: // Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use. bool isShapeInfoReady(); void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); - const std::vector filterIntersections(const std::vector& intersections) const; + void filterIntersections(std::vector& intersections) const; CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index efe1bddc97..cfe255e561 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -944,7 +944,7 @@ protected: } }; -const std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { +std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { // TODO: Give MyAvatar a motion state so we don't have to do this btCollisionObject* myAvatarCollisionObject = nullptr; if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && _myAvatarController) { diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index c5ab0cfdee..854d61844f 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -126,7 +126,7 @@ public: void setShowBulletConstraintLimits(bool value); // Function for getting colliding ObjectMotionStates in the world of specified type - const std::vector getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; + std::vector getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; private: QList removeDynamicsForBody(btRigidBody* body);