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,
bool centerEndY,
47 bool faceAvatar,
bool followNormal,
float followNormalStrength,
float distance,
const PickResultPointer& pickResult);
49 bool isEnabled()
const {
return _enabled; }
54 bool _startIgnorePicks;
62 bool _avgEndRotInitialized {
false };
64 bool _enabled {
true };
67 typedef std::unordered_map<std::string, std::shared_ptr<StartEndRenderState>> RenderStateMap;
68 typedef std::unordered_map<std::string, std::pair<float, std::shared_ptr<StartEndRenderState>>> DefaultRenderStateMap;
70 class PathPointer :
public Pointer {
71 using Parent = Pointer;
73 PathPointer(PickQuery::PickType type,
const QVariant& rayProps,
const RenderStateMap& renderStates,
const DefaultRenderStateMap& defaultRenderStates,
74 bool hover,
const PointerTriggers& triggers,
bool faceAvatar,
bool followNormal,
float followNormalStrength,
bool centerEndY,
bool lockEnd,
75 bool distanceScaleEnd,
bool scaleWithParent,
bool enabled);
76 virtual ~PathPointer();
78 void setRenderState(
const std::string& state)
override;
80 void editRenderState(
const std::string& state,
const QVariant& startProps,
const QVariant& pathProps,
const QVariant& endProps)
override;
82 void setLength(
float length)
override;
83 void setLockEndUUID(
const QUuid& objectID,
bool isAvatar,
const glm::mat4& offsetMat = glm::mat4())
override;
85 void updateVisuals(
const PickResultPointer& prevRayPickResult)
override;
88 RenderStateMap _renderStates;
89 DefaultRenderStateMap _defaultRenderStates;
90 std::string _currentRenderState {
"" };
91 PointerTriggers _triggers;
92 float _pathLength { 0.0f };
95 float _followNormalStrength;
98 bool _distanceScaleEnd;
99 bool _scaleWithParent;
100 LockEndObject _lockEndObject;
102 struct TriggerState {
103 PickedObject triggeredObject;
104 glm::vec3 intersection { NAN };
105 glm::vec3 surfaceNormal { NAN };
106 glm::vec2 triggerPos2D { NAN };
107 quint64 triggerStartTime { 0 };
108 bool deadspotExpired {
true };
109 bool triggering {
false };
110 bool wasTriggering {
false };
113 Pointer::Buttons _previousButtons;
114 std::unordered_map<std::string, TriggerState> _states;
115 TriggerState _latestState;
117 bool shouldHover(
const PickResultPointer& pickResult)
override {
return _currentRenderState !=
""; }
118 bool shouldTrigger(
const PickResultPointer& pickResult)
override {
return _currentRenderState !=
""; }
120 void updateRenderState(
const QUuid&
id,
const QVariant& props);
121 virtual void editRenderStatePath(
const std::string& state,
const QVariant& pathProps) = 0;
123 PickedObject getHoveredObject(
const PickResultPointer& pickResult)
override;
124 Pointer::Buttons getPressedButtons(
const PickResultPointer& pickResult)
override;
126 PickResultPointer getVisualPickResult(
const PickResultPointer& pickResult)
override;
127 virtual glm::vec3 getPickOrigin(
const PickResultPointer& pickResult)
const = 0;
128 virtual glm::vec3 getPickEnd(
const PickResultPointer& pickResult,
float distance = 0.0f)
const = 0;
129 virtual glm::vec3 getPickedObjectNormal(
const PickResultPointer& pickResult)
const = 0;
130 virtual IntersectionType getPickedObjectType(
const PickResultPointer& pickResult)
const = 0;
131 virtual QUuid getPickedObjectID(
const PickResultPointer& pickResult)
const = 0;
132 virtual void setVisualPickResultInternal(PickResultPointer pickResult, IntersectionType type,
const QUuid&
id,
133 const glm::vec3& intersection,
float distance,
const glm::vec3& surfaceNormal) = 0;
135 static glm::vec2 findPos2D(
const PickedObject& pickedObject,
const glm::vec3& origin);