8 #ifndef hifi_PickManager_h
9 #define hifi_PickManager_h
11 #include <DependencyManager.h>
12 #include "RegisteredMetaTypes.h"
15 #include "PickCacheOptimizer.h"
17 #include <NumericalConstants.h>
21 class PickManager :
public QObject,
public Dependency,
protected ReadWriteLockable {
30 unsigned int addPick(PickQuery::PickType type,
const std::shared_ptr<PickQuery> pick);
31 void removePick(
unsigned int uid);
32 void enablePick(
unsigned int uid)
const;
33 void disablePick(
unsigned int uid)
const;
34 bool isPickEnabled(
unsigned int uid)
const;
35 QVector<unsigned int> getPicks()
const;
37 PickResultPointer getPrevPickResult(
unsigned int uid)
const;
39 QVariantMap getPickProperties(
unsigned int uid)
const;
41 QVariantMap getPickScriptParameters(
unsigned int uid)
const;
44 std::shared_ptr<T> getPrevPickResultTyped(
unsigned int uid)
const {
45 return std::static_pointer_cast<T>(getPrevPickResult(uid));
48 void setPrecisionPicking(
unsigned int uid,
bool precisionPicking)
const;
49 void setIgnoreItems(
unsigned int uid,
const QVector<QUuid>& ignore)
const;
50 void setIncludeItems(
unsigned int uid,
const QVector<QUuid>& include)
const;
52 Transform getParentTransform(
unsigned int uid)
const;
53 Transform getResultTransform(
unsigned int uid)
const;
55 bool isLeftHand(
unsigned int uid);
56 bool isRightHand(
unsigned int uid);
57 bool isMouse(
unsigned int uid);
59 void setShouldPickHUDOperator(std::function<
bool()> shouldPickHUDOperator) { _shouldPickHUDOperator = shouldPickHUDOperator; }
60 void setCalculatePos2DFromHUDOperator(std::function<glm::vec2(
const glm::vec3&)> calculatePos2DFromHUDOperator) { _calculatePos2DFromHUDOperator = calculatePos2DFromHUDOperator; }
61 glm::vec2 calculatePos2DFromHUD(
const glm::vec3& intersection) {
return _calculatePos2DFromHUDOperator(intersection); }
63 static const unsigned int INVALID_PICK_ID { 0 };
65 unsigned int getPerFrameTimeBudget()
const {
return _perFrameTimeBudget; }
66 void setPerFrameTimeBudget(
unsigned int numUsecs) { _perFrameTimeBudget = numUsecs; }
68 bool getForceCoarsePicking() {
return _forceCoarsePicking; }
70 const std::vector<QVector3D>& getUpdatedPickCounts() {
return _updatedPickCounts; }
71 const std::vector<int>& getTotalPickCounts() {
return _totalPickCounts; }
74 void setForceCoarsePicking(
bool forceCoarsePicking) { _forceCoarsePicking = forceCoarsePicking; }
77 std::vector<QVector3D> _updatedPickCounts { PickQuery::NUM_PICK_TYPES };
78 std::vector<int> _totalPickCounts { 0, 0, 0, 0 };
80 bool _forceCoarsePicking {
false };
81 std::function<bool()> _shouldPickHUDOperator;
82 std::function<glm::vec2(
const glm::vec3&)> _calculatePos2DFromHUDOperator;
84 std::shared_ptr<PickQuery> findPick(
unsigned int uid)
const;
85 std::unordered_map<PickQuery::PickType, std::unordered_map<unsigned int, std::shared_ptr<PickQuery>>> _picks;
86 unsigned int _nextPickToUpdate[PickQuery::NUM_PICK_TYPES] { 0, 0, 0, 0 };
87 std::unordered_map<unsigned int, PickQuery::PickType> _typeMap;
88 unsigned int _nextPickID { INVALID_PICK_ID + 1 };
90 PickCacheOptimizer<PickRay> _rayPickCacheOptimizer;
91 PickCacheOptimizer<StylusTip> _stylusPickCacheOptimizer;
92 PickCacheOptimizer<PickParabola> _parabolaPickCacheOptimizer;
93 PickCacheOptimizer<CollisionRegion> _collisionPickCacheOptimizer;
95 static const unsigned int DEFAULT_PER_FRAME_TIME_BUDGET = 3 * USECS_PER_MSEC;
96 unsigned int _perFrameTimeBudget { DEFAULT_PER_FRAME_TIME_BUDGET };