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