From 44efe648e083f7fd80393775424e1897e9f83ca7 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 27 Sep 2018 17:05:31 -0700 Subject: [PATCH] Add scaleWithParent option to collision pick creation --- interface/src/raypick/CollisionPick.cpp | 15 +++++++++++---- interface/src/raypick/CollisionPick.h | 4 +++- interface/src/raypick/PickScriptingInterface.cpp | 8 +++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 5b5ecd09ff..7ea739be06 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -345,8 +345,9 @@ void CollisionPick::computeShapeInfo(const CollisionRegion& pick, ShapeInfo& sha } } -CollisionPick::CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine) : +CollisionPick::CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, bool scaleWithParent, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine) : Pick(collisionRegion, filter, maxDistance, enabled), + _scaleWithParent(scaleWithParent), _physicsEngine(physicsEngine) { if (collisionRegion.shouldComputeShapeInfo()) { _cachedResource = DependencyManager::get()->getCollisionGeometryResource(collisionRegion.modelURL); @@ -360,9 +361,15 @@ CollisionRegion CollisionPick::getMathematicalPick() const { if (parentTransform) { Transform parentTransformValue = parentTransform->getTransform(); mathPick.transform = parentTransformValue.worldTransform(mathPick.transform); - glm::vec3 scale = parentTransformValue.getScale(); - float largestDimension = glm::max(glm::max(scale.x, scale.y), scale.z); - mathPick.threshold *= largestDimension; + + if (_scaleWithParent) { + glm::vec3 scale = parentTransformValue.getScale(); + float largestDimension = glm::max(glm::max(scale.x, scale.y), scale.z); + mathPick.threshold *= largestDimension; + } else { + // We need to undo parent scaling after-the-fact because the parent's scale was needed to calculate this mathPick's position + mathPick.transform.setScale(_mathPick.transform.getScale()); + } } return mathPick; } diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index 79238b37fc..67e39e4d72 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -47,7 +47,7 @@ public: class CollisionPick : public Pick { public: - CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine); + CollisionPick(const PickFilter& filter, float maxDistance, bool enabled, bool scaleWithParent, CollisionRegion collisionRegion, PhysicsEnginePointer physicsEngine); CollisionRegion getMathematicalPick() const override; PickResultPointer getDefaultResult(const QVariantMap& pickVariant) const override { @@ -67,6 +67,8 @@ protected: void computeShapeInfoDimensionsOnly(const CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); void filterIntersections(std::vector& intersections) const; + bool _scaleWithParent; + PhysicsEnginePointer _physicsEngine; QSharedPointer _cachedResource; diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index 18677fa6e7..4218d593aa 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -254,6 +254,7 @@ unsigned int PickScriptingInterface::createParabolaPick(const QVariant& properti * @property {Uuid} parentID - The ID of the parent, either an avatar, an entity, or an overlay. * @property {number} parentJointIndex - The joint of the parent to parent to, for example, the joints on the model of an avatar. (default = 0, no joint) * @property {string} joint - If "Mouse," parents the pick to the mouse. If "Avatar," parents the pick to MyAvatar's head. Otherwise, parents to the joint of the given name on MyAvatar. +* @property {boolean} [scaleWithParent=true] If true, the collision pick's dimensions and threshold will adjust according to the scale of the parent. */ unsigned int PickScriptingInterface::createCollisionPick(const QVariant& properties) { QVariantMap propMap = properties.toMap(); @@ -273,8 +274,13 @@ unsigned int PickScriptingInterface::createCollisionPick(const QVariant& propert maxDistance = propMap["maxDistance"].toFloat(); } + bool scaleWithParent = true; + if (propMap["scaleWithParent"].isValid()) { + scaleWithParent = propMap["scaleWithParent"].toBool(); + } + CollisionRegion collisionRegion(propMap); - auto collisionPick = std::make_shared(filter, maxDistance, enabled, collisionRegion, qApp->getPhysicsEngine()); + auto collisionPick = std::make_shared(filter, maxDistance, enabled, scaleWithParent, collisionRegion, qApp->getPhysicsEngine()); setParentTransform(collisionPick, propMap); return DependencyManager::get()->addPick(PickQuery::Collision, collisionPick);