diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index 7de69b537d..2e8f790da5 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -98,8 +98,7 @@ unsigned int PickScriptingInterface::createRayPick(const QVariant& properties) { } auto rayPick = std::make_shared(position, direction, filter, maxDistance, enabled); - rayPick->parentTransform = createTransformNode(propMap); - rayPick->setJointState(getPickJointState(propMap)); + setParentTransform(rayPick, propMap); return DependencyManager::get()->addPick(PickQuery::Ray, rayPick); } @@ -224,8 +223,7 @@ unsigned int PickScriptingInterface::createParabolaPick(const QVariant& properti auto parabolaPick = std::make_shared(position, direction, speed, accelerationAxis, rotateAccelerationWithAvatar, rotateAccelerationWithParent, scaleWithParent, filter, maxDistance, enabled); - parabolaPick->parentTransform = createTransformNode(propMap); - parabolaPick->setJointState(getPickJointState(propMap)); + setParentTransform(parabolaPick, propMap); return DependencyManager::get()->addPick(PickQuery::Parabola, parabolaPick); } @@ -277,8 +275,7 @@ unsigned int PickScriptingInterface::createCollisionPick(const QVariant& propert CollisionRegion collisionRegion(propMap); auto collisionPick = std::make_shared(filter, maxDistance, enabled, collisionRegion, qApp->getPhysicsEngine()); - collisionPick->parentTransform = createTransformNode(propMap); - collisionPick->setJointState(getPickJointState(propMap)); + setParentTransform(collisionPick, propMap); return DependencyManager::get()->addPick(PickQuery::Collision, collisionPick); } @@ -355,82 +352,63 @@ void PickScriptingInterface::setPerFrameTimeBudget(unsigned int numUsecs) { DependencyManager::get()->setPerFrameTimeBudget(numUsecs); } -PickQuery::JointState PickScriptingInterface::getPickJointState(const QVariantMap& propMap) { +void PickScriptingInterface::setParentTransform(std::shared_ptr pick, const QVariantMap& propMap) { + QUuid parentUuid; + int parentJointIndex = 0; + auto myAvatar = DependencyManager::get()->getMyAvatar(); + if (propMap["parentID"].isValid()) { - QUuid parentUuid = propMap["parentID"].toUuid(); - if (propMap["parentJointIndex"].isValid() && parentUuid == DependencyManager::get()->getMyAvatar()->getSessionUUID()) { - int jointIndex = propMap["parentJointIndes"].toInt(); - if (jointIndex == CONTROLLER_LEFTHAND_INDEX || jointIndex == CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX) { - return PickQuery::JOINT_STATE_LEFT_HAND; - } else if (jointIndex == CONTROLLER_RIGHTHAND_INDEX || jointIndex == CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX) { - return PickQuery::JOINT_STATE_RIGHT_HAND; - } else { - return PickQuery::JOINT_STATE_NONE; - } - } else { - return PickQuery::JOINT_STATE_NONE; + parentUuid = propMap["parentID"].toUuid(); + if (propMap["parentJointIndex"].isValid()) { + parentJointIndex = propMap["parentJointIndex"].toInt(); } } else if (propMap["joint"].isValid()) { QString joint = propMap["joint"].toString(); if (joint == "Mouse") { - return PickQuery::JOINT_STATE_MOUSE; - } else if (joint == "_CONTROLLER_LEFTHAND" || joint == "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND") { - return PickQuery::JOINT_STATE_LEFT_HAND; - } else if (joint== "_CONTROLLER_RIGHTHAND" || joint == "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND") { - return PickQuery::JOINT_STATE_RIGHT_HAND; + pick->parentTransform = std::make_shared(); + pick->setJointState(PickQuery::JOINT_STATE_MOUSE); + return; + } else if (joint == "Avatar") { + pick->parentTransform = std::make_shared(); + return; } else { - return PickQuery::JOINT_STATE_NONE; + parentUuid = myAvatar->getSessionUUID(); + parentJointIndex = myAvatar->getJointIndex(joint); + } + } + + if (parentUuid == myAvatar->getSessionUUID()) { + if (parentJointIndex == CONTROLLER_LEFTHAND_INDEX || parentJointIndex == CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX) { + pick->setJointState(PickQuery::JOINT_STATE_LEFT_HAND); + } else if (parentJointIndex == CONTROLLER_RIGHTHAND_INDEX || parentJointIndex == CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX) { + pick->setJointState(PickQuery::JOINT_STATE_RIGHT_HAND); + } + + pick->parentTransform = std::make_shared(myAvatar, parentJointIndex); + } else if (!parentUuid.isNull()) { + // Infer object type from parentID + // For now, assume a QUuid is a SpatiallyNestable. This should change when picks are converted over to QUuids. + bool success; + std::weak_ptr nestablePointer = DependencyManager::get()->find(parentUuid, success, nullptr); + auto sharedNestablePointer = nestablePointer.lock(); + + if (success && sharedNestablePointer) { + NestableType nestableType = sharedNestablePointer->getNestableType(); + if (nestableType == NestableType::Avatar) { + pick->parentTransform = std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } else if (nestableType == NestableType::Overlay) { + pick->parentTransform = std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } else if (nestableType == NestableType::Entity) { + pick->parentTransform = std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } else { + pick->parentTransform = std::make_shared(nestablePointer, parentJointIndex); + } } } else { - return PickQuery::JOINT_STATE_NONE; - } -} - -std::shared_ptr PickScriptingInterface::createTransformNode(const QVariantMap& propMap) { - if (propMap["parentID"].isValid()) { - QUuid parentUuid = propMap["parentID"].toUuid(); - if (!parentUuid.isNull()) { - // Infer object type from parentID - // For now, assume a QUuuid is a SpatiallyNestable. This should change when picks are converted over to QUuids. - bool success; - std::weak_ptr nestablePointer = DependencyManager::get()->find(parentUuid, success, nullptr); - int parentJointIndex = 0; - if (propMap["parentJointIndex"].isValid()) { - parentJointIndex = propMap["parentJointIndex"].toInt(); - } - auto sharedNestablePointer = nestablePointer.lock(); - if (success && sharedNestablePointer) { - NestableType nestableType = sharedNestablePointer->getNestableType(); - if (nestableType == NestableType::Avatar) { - return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); - } else if (nestableType == NestableType::Overlay) { - return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); - } else if (nestableType == NestableType::Entity) { - return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); - } else { - return std::make_shared(nestablePointer, parentJointIndex); - } - } - } - unsigned int pickID = propMap["parentID"].toUInt(); - if (pickID != 0) { - return std::make_shared(pickID); - } - } - - if (propMap["joint"].isValid()) { - QString joint = propMap["joint"].toString(); - if (joint == "Mouse") { - return std::make_shared(); - } else if (joint == "Avatar") { - return std::make_shared(); - } else if (!joint.isNull()) { - auto myAvatar = DependencyManager::get()->getMyAvatar(); - int jointIndex = myAvatar->getJointIndex(joint); - return std::make_shared(myAvatar, jointIndex); - } - } - return std::shared_ptr(); + if (pickID != 0) { + pick->parentTransform = std::make_shared(pickID); + } + } } \ No newline at end of file diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h index 224f7a547e..94112d5fae 100644 --- a/interface/src/raypick/PickScriptingInterface.h +++ b/interface/src/raypick/PickScriptingInterface.h @@ -320,8 +320,7 @@ public slots: static constexpr unsigned int INTERSECTED_HUD() { return IntersectionType::HUD; } protected: - static PickQuery::JointState getPickJointState(const QVariantMap& propMap); - static std::shared_ptr createTransformNode(const QVariantMap& propMap); + static void setParentTransform(std::shared_ptr pick, const QVariantMap& propMap); }; #endif // hifi_PickScriptingInterface_h