Overte C++ Documentation
PathPointer.h
1 //
2 // Created by Sam Gondelman 7/17/2018
3 // Copyright 2018 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 #ifndef hifi_PathPointer_h
9 #define hifi_PathPointer_h
10 
11 #include <QVariant>
12 #include <QString>
13 #include <glm/glm.hpp>
14 
15 #include <Pointer.h>
16 #include <Pick.h>
17 
18 struct LockEndObject {
19  QUuid id { QUuid() };
20  bool isAvatar { false };
21  glm::mat4 offsetMat { glm::mat4() };
22 };
23 
24 class StartEndRenderState {
25 public:
26  StartEndRenderState() {}
27  StartEndRenderState(const QUuid& startID, const QUuid& endID);
28  virtual ~StartEndRenderState() = default;
29 
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; }
34 
35  void setStartDim(const glm::vec3& startDim) { _startDim = startDim; }
36  const glm::vec3& getStartDim() const { return _startDim; }
37 
38  void setEndDim(const glm::vec3& endDim) { _endDim = endDim; }
39  const glm::vec3& getEndDim() const { return _endDim; }
40 
41  void setEndRot(const glm::quat& endRot) { _endRot = endRot; }
42  const glm::quat& getEndRot() const { return _endRot; }
43 
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);
49 
50  bool isEnabled() const { return _enabled; }
51 
52 protected:
53  QUuid _startID;
54  QUuid _endID;
55  bool _startIgnorePicks { false };
56  bool _endIgnorePicks { false };
57 
58  glm::vec3 _startDim;
59  glm::vec3 _endDim;
60  glm::quat _endRot;
61 
62  glm::quat _avgEndRot;
63  bool _avgEndRotInitialized { false };
64 
65  bool _enabled { true };
66 };
67 
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;
70 
71 class PathPointer : public Pointer {
72  using Parent = Pointer;
73 public:
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();
78 
79  void setRenderState(const std::string& state) override;
80  // You cannot use editRenderState to change the type of any part of the pointer. You can only edit the properties of the existing parts.
81  void editRenderState(const std::string& state, const QVariant& startProps, const QVariant& pathProps, const QVariant& endProps) override;
82 
83  void setLength(float length) override;
84  void setLockEndUUID(const QUuid& objectID, bool isAvatar, const glm::mat4& offsetMat = glm::mat4()) override;
85 
86  void updateVisuals(const PickResultPointer& prevRayPickResult) override;
87 
88 protected:
89  RenderStateMap _renderStates;
90  DefaultRenderStateMap _defaultRenderStates;
91  std::string _currentRenderState { "" };
92  PointerTriggers _triggers;
93  float _pathLength { 0.0f };
94  bool _faceAvatar;
95  bool _followNormal;
96  float _followNormalStrength;
97  bool _centerEndY;
98  bool _lockEnd;
99  bool _distanceScaleEnd;
100  bool _scaleWithParent;
101  LockEndObject _lockEndObject;
102 
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 };
112  };
113 
114  Pointer::Buttons _previousButtons;
115  std::unordered_map<std::string, TriggerState> _states;
116  TriggerState _latestState;
117 
118  bool shouldHover(const PickResultPointer& pickResult) override { return _currentRenderState != ""; }
119  bool shouldTrigger(const PickResultPointer& pickResult) override { return _currentRenderState != ""; }
120 
121  void updateRenderState(const QUuid& id, const QVariant& props);
122  virtual void editRenderStatePath(const std::string& state, const QVariant& pathProps) = 0;
123 
124  PickedObject getHoveredObject(const PickResultPointer& pickResult) override;
125  Pointer::Buttons getPressedButtons(const PickResultPointer& pickResult) override;
126  glm::vec2 getScroll(const PickResultPointer& pickResult) override;
127 
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;
136 
137  static glm::vec2 findPos2D(const PickedObject& pickedObject, const glm::vec3& origin);
138 };
139 
140 #endif // hifi_PathPointer_h