// // Created by Sam Gondelman 10/16/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 // #ifndef hifi_PickManager_h #define hifi_PickManager_h #include #include "RegisteredMetaTypes.h" #include "Pick.h" #include "PickCacheOptimizer.h" #include #include class PickManager : public QObject, public Dependency, protected ReadWriteLockable { Q_OBJECT SINGLETON_DEPENDENCY public: PickManager(); void update(); unsigned int addPick(PickQuery::PickType type, const std::shared_ptr pick); void removePick(unsigned int uid); void enablePick(unsigned int uid) const; void disablePick(unsigned int uid) const; bool isPickEnabled(unsigned int uid) const; QVector getPicks() const; PickResultPointer getPrevPickResult(unsigned int uid) const; // The actual current properties of the pick QVariantMap getPickProperties(unsigned int uid) const; // The properties that were passed in to create the pick (may be empty if the pick was created by invoking the constructor) QVariantMap getPickScriptParameters(unsigned int uid) const; template std::shared_ptr getPrevPickResultTyped(unsigned int uid) const { return std::static_pointer_cast(getPrevPickResult(uid)); } void setPrecisionPicking(unsigned int uid, bool precisionPicking) const; void setIgnoreItems(unsigned int uid, const QVector& ignore) const; void setIncludeItems(unsigned int uid, const QVector& include) const; void setDelay(unsigned int uid, float delay) const; Transform getParentTransform(unsigned int uid) const; Transform getResultTransform(unsigned int uid) const; bool isLeftHand(unsigned int uid); bool isRightHand(unsigned int uid); bool isMouse(unsigned int uid); void setShouldPickHUDOperator(std::function shouldPickHUDOperator) { _shouldPickHUDOperator = shouldPickHUDOperator; } void setCalculatePos2DFromHUDOperator(std::function calculatePos2DFromHUDOperator) { _calculatePos2DFromHUDOperator = calculatePos2DFromHUDOperator; } glm::vec2 calculatePos2DFromHUD(const glm::vec3& intersection) { return _calculatePos2DFromHUDOperator(intersection); } static const unsigned int INVALID_PICK_ID { 0 }; unsigned int getPerFrameTimeBudget() const { return _perFrameTimeBudget; } void setPerFrameTimeBudget(unsigned int numUsecs) { _perFrameTimeBudget = numUsecs; } bool getForceCoarsePicking() { return _forceCoarsePicking; } const std::vector& getUpdatedPickCounts() { return _updatedPickCounts; } const std::vector& getTotalPickCounts() { return _totalPickCounts; } public slots: void setForceCoarsePicking(bool forceCoarsePicking) { _forceCoarsePicking = forceCoarsePicking; } protected: std::vector _updatedPickCounts { PickQuery::NUM_PICK_TYPES }; std::vector _totalPickCounts { 0, 0, 0, 0 }; bool _forceCoarsePicking { false }; std::function _shouldPickHUDOperator; std::function _calculatePos2DFromHUDOperator; std::shared_ptr findPick(unsigned int uid) const; std::unordered_map>> _picks; unsigned int _nextPickToUpdate[PickQuery::NUM_PICK_TYPES] { 0, 0, 0, 0 }; std::unordered_map _typeMap; unsigned int _nextPickID { INVALID_PICK_ID + 1 }; PickCacheOptimizer _rayPickCacheOptimizer; PickCacheOptimizer _stylusPickCacheOptimizer; PickCacheOptimizer _parabolaPickCacheOptimizer; PickCacheOptimizer _collisionPickCacheOptimizer; static const unsigned int DEFAULT_PER_FRAME_TIME_BUDGET = 3 * USECS_PER_MSEC; unsigned int _perFrameTimeBudget { DEFAULT_PER_FRAME_TIME_BUDGET }; }; #endif // hifi_PickManager_h