8 #ifndef hifi_PathPointer_h
9 #define hifi_PathPointer_h
13 #include <glm/glm.hpp>
18 struct LockEndObject {
20 bool isAvatar {
false };
21 glm::mat4 offsetMat { glm::mat4() };
24 class StartEndRenderState {
26 StartEndRenderState() {}
27 StartEndRenderState(
const QUuid& startID,
const QUuid& endID);
28 virtual ~StartEndRenderState() =
default;
30 const QUuid& getStartID()
const {
return _startID; }
31 const QUuid& getEndID()
const {
return _endID; }
32 const bool& doesStartIgnorePicks()
const {
return _startIgnorePicks; }
33 const bool& doesEndIgnorePicks()
const {
return _endIgnorePicks; }
35 void setStartDim(
const glm::vec3& startDim) { _startDim = startDim; }
36 const glm::vec3& getStartDim()
const {
return _startDim; }
38 void setEndDim(
const glm::vec3& endDim) { _endDim = endDim; }
39 const glm::vec3& getEndDim()
const {
return _endDim; }
41 void setEndRot(
const glm::quat& endRot) { _endRot = endRot; }
42 const glm::quat& getEndRot()
const {
return _endRot; }
44 virtual void cleanup();
45 virtual void disable();
46 virtual void update(
const glm::vec3& origin,
const glm::vec3& end,
const glm::vec3& surfaceNormal,
float parentScale,
bool distanceScaleEnd,
47 bool centerEndY,
bool faceAvatar,
bool followNormal,
float followNormalStrength,
float distance,
48 const PickResultPointer& pickResult);
50 bool isEnabled()
const {
return _enabled; }
55 bool _startIgnorePicks {
false };
56 bool _endIgnorePicks {
false };
63 bool _avgEndRotInitialized {
false };
65 bool _enabled {
true };
68 typedef std::unordered_map<std::string, std::shared_ptr<StartEndRenderState>> RenderStateMap;
69 typedef std::unordered_map<std::string, std::pair<float, std::shared_ptr<StartEndRenderState>>> DefaultRenderStateMap;
71 class PathPointer :
public Pointer {
72 using Parent = Pointer;
74 PathPointer(PickQuery::PickType type,
const QVariant& rayProps,
const RenderStateMap& renderStates,
const DefaultRenderStateMap& defaultRenderStates,
75 bool hover,
const PointerTriggers& triggers,
bool faceAvatar,
bool followNormal,
float followNormalStrength,
bool centerEndY,
bool lockEnd,
76 bool distanceScaleEnd,
bool scaleWithParent,
bool enabled);
77 virtual ~PathPointer();
79 void setRenderState(
const std::string& state)
override;
81 void editRenderState(
const std::string& state,
const QVariant& startProps,
const QVariant& pathProps,
const QVariant& endProps)
override;
83 void setLength(
float length)
override;
84 void setLockEndUUID(
const QUuid& objectID,
bool isAvatar,
const glm::mat4& offsetMat = glm::mat4())
override;
86 void updateVisuals(
const PickResultPointer& prevRayPickResult)
override;
89 RenderStateMap _renderStates;
90 DefaultRenderStateMap _defaultRenderStates;
91 std::string _currentRenderState {
"" };
92 PointerTriggers _triggers;
93 float _pathLength { 0.0f };
96 float _followNormalStrength;
99 bool _distanceScaleEnd;
100 bool _scaleWithParent;
101 LockEndObject _lockEndObject;
103 struct TriggerState {
104 PickedObject triggeredObject;
105 glm::vec3 intersection { NAN };
106 glm::vec3 surfaceNormal { NAN };
107 glm::vec2 triggerPos2D { NAN };
108 quint64 triggerStartTime { 0 };
109 bool deadspotExpired {
true };
110 bool triggering {
false };
111 bool wasTriggering {
false };
114 Pointer::Buttons _previousButtons;
115 std::unordered_map<std::string, TriggerState> _states;
116 TriggerState _latestState;
118 bool shouldHover(
const PickResultPointer& pickResult)
override {
return _currentRenderState !=
""; }
119 bool shouldTrigger(
const PickResultPointer& pickResult)
override {
return _currentRenderState !=
""; }
121 void updateRenderState(
const QUuid&
id,
const QVariant& props);
122 virtual void editRenderStatePath(
const std::string& state,
const QVariant& pathProps) = 0;
124 PickedObject getHoveredObject(
const PickResultPointer& pickResult)
override;
125 Pointer::Buttons getPressedButtons(
const PickResultPointer& pickResult)
override;
126 glm::vec2 getScroll(
const PickResultPointer& pickResult)
override;
128 PickResultPointer getVisualPickResult(
const PickResultPointer& pickResult)
override;
129 virtual glm::vec3 getPickOrigin(
const PickResultPointer& pickResult)
const = 0;
130 virtual glm::vec3 getPickEnd(
const PickResultPointer& pickResult,
float distance = 0.0f)
const = 0;
131 virtual glm::vec3 getPickedObjectNormal(
const PickResultPointer& pickResult)
const = 0;
132 virtual IntersectionType getPickedObjectType(
const PickResultPointer& pickResult)
const = 0;
133 virtual QUuid getPickedObjectID(
const PickResultPointer& pickResult)
const = 0;
134 virtual void setVisualPickResultInternal(PickResultPointer pickResult, IntersectionType type,
const QUuid&
id,
135 const glm::vec3& intersection,
float distance,
const glm::vec3& surfaceNormal) = 0;
137 static glm::vec2 findPos2D(
const PickedObject& pickedObject,
const glm::vec3& origin);