Overte C++ Documentation
ParabolaPointer.h
1 //
2 // Created by Sam Gondelman 7/17/2018
3 // Copyright 2018 High Fidelity, Inc.
4 // Copyright 2024 Overte e.V.
5 //
6 // Distributed under the Apache License, Version 2.0.
7 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
8 //
9 #ifndef hifi_ParabolaPointer_h
10 #define hifi_ParabolaPointer_h
11 
12 #include "PathPointer.h"
13 
14 #include <EntityItemProperties.h>
15 
16 #include <render/Item.h>
17 
18 class ParabolaPointer : public PathPointer {
19  using Parent = PathPointer;
20 public:
21  class RenderState : public StartEndRenderState {
22  public:
23  class ParabolaRenderItem {
24  public:
25  using Payload = render::Payload<ParabolaRenderItem>;
26  using Pointer = Payload::DataPointer;
27 
28  ParabolaRenderItem(const glm::vec3& color, float alpha, float width,
29  bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled);
30  ~ParabolaRenderItem() {}
31 
32  static std::map<std::pair<bool, bool>, gpu::PipelinePointer> _parabolaPipelines;
33  gpu::PipelinePointer getParabolaPipeline(bool forward) const;
34 
35  void render(RenderArgs* args);
36  render::Item::Bound& editBound() { return _bound; }
37  const render::Item::Bound& getBound(RenderArgs* args) { return _bound; }
38  render::ItemKey getKey() const { return _key; }
39 
40  void setVisible(bool visible);
41  void updateKey();
42  void updateUniformBuffer() { _uniformBuffer->setSubData(0, _parabolaData); }
43  void updateBounds();
44 
45  void setColor(const glm::vec3& color) { _parabolaData.color = glm::vec4(color, _parabolaData.color.a); }
46  void setAlpha(const float& alpha) { _parabolaData.color.a = alpha; }
47  void setWidth(const float& width) { _parabolaData.width = width; }
48  void setParabolicDistance(const float& parabolicDistance) { _parabolaData.parabolicDistance = parabolicDistance; }
49  void setVelocity(const glm::vec3& velocity) { _parabolaData.velocity = velocity; }
50  void setAcceleration(const glm::vec3& acceleration) { _parabolaData.acceleration = acceleration; }
51  void setOrigin(const glm::vec3& origin) { _origin = origin; }
52  void setIsVisibleInSecondaryCamera(const bool& isVisibleInSecondaryCamera) { _isVisibleInSecondaryCamera = isVisibleInSecondaryCamera; }
53  void setDrawInFront(const bool& drawInFront) { _drawInFront = drawInFront; }
54  void setEnabled(const bool& enabled) { _enabled = enabled; }
55 
56  static const glm::vec4 DEFAULT_PARABOLA_COLOR;
57  static const float DEFAULT_PARABOLA_WIDTH;
58  static const bool DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA;
59  static const bool DEFAULT_PARABOLA_DRAWINFRONT;
60 
61  private:
62  render::Item::Bound _bound;
63  render::ItemKey _key;
64 
65  glm::vec3 _origin { 0.0f };
66  Transform _prevRenderTransform;
67  bool _isVisibleInSecondaryCamera { DEFAULT_PARABOLA_ISVISIBLEINSECONDARYCAMERA };
68  bool _drawInFront { DEFAULT_PARABOLA_DRAWINFRONT };
69  bool _visible { false };
70  bool _enabled { false };
71 
72  struct ParabolaData {
73  glm::vec3 velocity { 0.0f };
74  float parabolicDistance { 0.0f };
75  vec3 acceleration { 0.0f };
76  float width { DEFAULT_PARABOLA_WIDTH };
77  vec4 color { vec4(DEFAULT_PARABOLA_COLOR)};
78  int numSections { 0 };
79  ivec3 spare;
80  };
81 
82  ParabolaData _parabolaData;
83  gpu::BufferPointer _uniformBuffer { std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer) };
84  };
85 
86  RenderState() {}
87  RenderState(const QUuid& startID, const QUuid& endID, const glm::vec3& pathColor, float pathAlpha, float parentScale,
88  bool isVisibleInSecondaryCamera, bool drawInFront, bool pathEnabled);
89 
90  void setPathWidth(float width) { _pathWidth = width; }
91  float getPathWidth() const { return _pathWidth; }
92 
93  void cleanup() override;
94  void disable() override;
95  void update(const glm::vec3& origin, const glm::vec3& end, const glm::vec3& surfaceNormal, float parentScale, bool distanceScaleEnd, bool centerEndY,
96  bool faceAvatar, bool followNormal, float followNormalStrength, float distance, const PickResultPointer& pickResult) override;
97 
98  void editParabola(const glm::vec3& color, float alpha, float width, bool isVisibleInSecondaryCamera, bool drawInFront, bool enabled);
99 
100  private:
101  int _pathID;
102  float _pathWidth;
103  };
104 
105  ParabolaPointer(const QVariant& rayProps, const RenderStateMap& renderStates, const DefaultRenderStateMap& defaultRenderStates, bool hover, const PointerTriggers& triggers,
106  bool faceAvatar, bool followNormal, float followNormalStrength, bool centerEndY, bool lockEnd, bool distanceScaleEnd, bool scaleWithAvatar, bool enabled);
107 
108  PickQuery::PickType getType() const override;
109 
110  QVariantMap toVariantMap() const override;
111 
112  static std::shared_ptr<StartEndRenderState> buildRenderState(const QVariantMap& propMap, const QList<EntityItemProperties> &entityProperties);
113 
114 protected:
115  virtual PickResultPointer getPickResultCopy(const PickResultPointer& pickResult) const override;
116 
117  void editRenderStatePath(const std::string& state, const QVariant& pathProps) override;
118 
119  glm::vec3 getPickOrigin(const PickResultPointer& pickResult) const override;
120  glm::vec3 getPickEnd(const PickResultPointer& pickResult, float distance) const override;
121  glm::vec3 getPickedObjectNormal(const PickResultPointer& pickResult) const override;
122  IntersectionType getPickedObjectType(const PickResultPointer& pickResult) const override;
123  QUuid getPickedObjectID(const PickResultPointer& pickResult) const override;
124  void setVisualPickResultInternal(PickResultPointer pickResult, IntersectionType type, const QUuid& id,
125  const glm::vec3& intersection, float distance, const glm::vec3& surfaceNormal) override;
126 
127  PointerEvent buildPointerEvent(const PickedObject& target, const PickResultPointer& pickResult, const std::string& button = "", bool hover = true) override;
128 
129 private:
130  static glm::vec3 findIntersection(const PickedObject& pickedObject, const glm::vec3& origin, const glm::vec3& velocity, const glm::vec3& acceleration);
131 };
132 
133 namespace render {
134  template <> const ItemKey payloadGetKey(const ParabolaPointer::RenderState::ParabolaRenderItem::Pointer& payload);
135  template <> const Item::Bound payloadGetBound(const ParabolaPointer::RenderState::ParabolaRenderItem::Pointer& payload, RenderArgs* args);
136  template <> void payloadRender(const ParabolaPointer::RenderState::ParabolaRenderItem::Pointer& payload, RenderArgs* args);
137  template <> const ShapeKey shapeGetShapeKey(const ParabolaPointer::RenderState::ParabolaRenderItem::Pointer& payload);
138 }
139 
140 #endif // hifi_ParabolaPointer_h
Represents a 2D or 3D pointer to the scripting engine. Exposed as PointerEvent
Definition: PointerEvent.h:32