// // Created by Sam Gondelman 10/20/2017 // Copyright 2017 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "PickScriptingInterface.h" #include #include "GLMHelpers.h" #include #include "StaticRayPick.h" #include "JointRayPick.h" #include "MouseRayPick.h" #include "StylusPick.h" #include unsigned int PickScriptingInterface::createPick(const PickQuery::PickType type, const QVariant& properties) { switch (type) { case PickQuery::PickType::Ray: return createRayPick(properties); case PickQuery::PickType::Stylus: return createStylusPick(properties); default: return PickManager::INVALID_PICK_ID; } } unsigned int PickScriptingInterface::createRayPick(const QVariant& properties) { QVariantMap propMap = properties.toMap(); bool enabled = false; if (propMap["enabled"].isValid()) { enabled = propMap["enabled"].toBool(); } PickFilter filter = PickFilter(); if (propMap["filter"].isValid()) { filter = PickFilter(propMap["filter"].toUInt()); } float maxDistance = 0.0f; if (propMap["maxDistance"].isValid()) { maxDistance = propMap["maxDistance"].toFloat(); } if (propMap["joint"].isValid()) { std::string jointName = propMap["joint"].toString().toStdString(); if (jointName != "Mouse") { // x = upward, y = forward, z = lateral glm::vec3 posOffset = Vectors::ZERO; if (propMap["posOffset"].isValid()) { posOffset = vec3FromVariant(propMap["posOffset"]); } glm::vec3 dirOffset = Vectors::UP; if (propMap["dirOffset"].isValid()) { dirOffset = vec3FromVariant(propMap["dirOffset"]); } return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(jointName, posOffset, dirOffset, filter, maxDistance, enabled)); } else { return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(filter, maxDistance, enabled)); } } else if (propMap["position"].isValid()) { glm::vec3 position = vec3FromVariant(propMap["position"]); glm::vec3 direction = -Vectors::UP; if (propMap["direction"].isValid()) { direction = vec3FromVariant(propMap["direction"]); } return DependencyManager::get()->addPick(PickQuery::Ray, std::make_shared(position, direction, filter, maxDistance, enabled)); } return PickManager::INVALID_PICK_ID; } unsigned int PickScriptingInterface::createStylusPick(const QVariant& properties) { QVariantMap propMap = properties.toMap(); bilateral::Side side = bilateral::Side::Invalid; { QVariant handVar = propMap["hand"]; if (handVar.isValid()) { side = bilateral::side(handVar.toInt()); } } bool enabled = false; if (propMap["enabled"].isValid()) { enabled = propMap["enabled"].toBool(); } PickFilter filter = PickFilter(); if (propMap["filter"].isValid()) { filter = PickFilter(propMap["filter"].toUInt()); } float maxDistance = 0.0f; if (propMap["maxDistance"].isValid()) { maxDistance = propMap["maxDistance"].toFloat(); } return DependencyManager::get()->addPick(PickQuery::Stylus, std::make_shared(side, filter, maxDistance, enabled)); } void PickScriptingInterface::enablePick(unsigned int uid) { DependencyManager::get()->enablePick(uid); } void PickScriptingInterface::disablePick(unsigned int uid) { DependencyManager::get()->disablePick(uid); } void PickScriptingInterface::removePick(unsigned int uid) { DependencyManager::get()->removePick(uid); } QVariantMap PickScriptingInterface::getPrevPickResult(unsigned int uid) { QVariantMap result; auto pickResult = DependencyManager::get()->getPrevPickResult(uid); if (pickResult) { result = pickResult->toVariantMap(); } return result; } void PickScriptingInterface::setPrecisionPicking(unsigned int uid, bool precisionPicking) { DependencyManager::get()->setPrecisionPicking(uid, precisionPicking); } void PickScriptingInterface::setIgnoreItems(unsigned int uid, const QScriptValue& ignoreItems) { DependencyManager::get()->setIgnoreItems(uid, qVectorQUuidFromScriptValue(ignoreItems)); } void PickScriptingInterface::setIncludeItems(unsigned int uid, const QScriptValue& includeItems) { DependencyManager::get()->setIncludeItems(uid, qVectorQUuidFromScriptValue(includeItems)); } bool PickScriptingInterface::isLeftHand(unsigned int uid) { return DependencyManager::get()->isLeftHand(uid); } bool PickScriptingInterface::isRightHand(unsigned int uid) { return DependencyManager::get()->isRightHand(uid); } bool PickScriptingInterface::isMouse(unsigned int uid) { return DependencyManager::get()->isMouse(uid); } QScriptValue pickTypesToScriptValue(QScriptEngine* engine, const PickQuery::PickType& pickType) { return pickType; } void pickTypesFromScriptValue(const QScriptValue& object, PickQuery::PickType& pickType) { pickType = static_cast(object.toUInt16()); } void PickScriptingInterface::registerMetaTypes(QScriptEngine* engine) { QScriptValue pickTypes = engine->newObject(); auto metaEnum = QMetaEnum::fromType(); for (int i = 0; i < PickQuery::PickType::NUM_PICK_TYPES; ++i) { pickTypes.setProperty(metaEnum.key(i), metaEnum.value(i)); } engine->globalObject().setProperty("PickType", pickTypes); qScriptRegisterMetaType(engine, pickTypesToScriptValue, pickTypesFromScriptValue); } unsigned int PickScriptingInterface::getPerFrameTimeBudget() const { return DependencyManager::get()->getPerFrameTimeBudget(); } void PickScriptingInterface::setPerFrameTimeBudget(unsigned int numUsecs) { DependencyManager::get()->setPerFrameTimeBudget(numUsecs); }