Overte C++ Documentation
RenderableTextEntityItem.h
1 //
2 // RenderableTextEntityItem.h
3 // interface/src/entities
4 //
5 // Created by Brad Hefta-Gaub on 8/6/14.
6 // Copyright 2014 High Fidelity, Inc.
7 // Copyright 2023 Overte e.V.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 // SPDX-License-Identifier: Apache-2.0
12 //
13 
14 #ifndef hifi_RenderableTextEntityItem_h
15 #define hifi_RenderableTextEntityItem_h
16 
17 #include "RenderableEntityItem.h"
18 
19 #include <GeometryCache.h>
20 #include <procedural/Procedural.h>
21 
22 class TextEntityItem;
23 class TextRenderer3D;
24 
25 namespace render { namespace entities {
26 
27 class TextPayload;
28 
29 class TextEntityRenderer : public TypedEntityRenderer<TextEntityItem> {
30  using Parent = TypedEntityRenderer<TextEntityItem>;
31  using Pointer = std::shared_ptr<TextEntityRenderer>;
32 public:
33  TextEntityRenderer(const EntityItemPointer& entity);
34  ~TextEntityRenderer();
35 
36  QSizeF textSize(const QString& text) const;
37 
38 protected:
39  bool isTransparent() const override;
40  bool isTextTransparent() const;
41  Item::Bound getBound(RenderArgs* args) override;
42  ShapeKey getShapeKey() override;
43  ItemKey getKey() override;
44  virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override;
45 
46  void onAddToSceneTyped(const TypedEntityPointer& entity) override;
47  void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override;
48 
49 private:
50  virtual bool needsRenderUpdate() const override;
51  virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
52  virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
53  virtual void doRender(RenderArgs* args) override;
54 
55  std::shared_ptr<TextRenderer3D> _textRenderer;
56 
57  PulsePropertyGroup _pulseProperties;
58 
59  QString _text;
60  float _lineHeight;
61  glm::vec3 _textColor;
62  float _textAlpha;
63  bool _unlit { false };
64 
65  std::shared_ptr<graphics::ProceduralMaterial> _material { std::make_shared<graphics::ProceduralMaterial>() };
66  glm::vec3 _backgroundColor { NAN };
67  float _backgroundAlpha { NAN };
68 
69  float _leftMargin;
70  float _rightMargin;
71  float _topMargin;
72  float _bottomMargin;
73 
74  glm::vec3 _dimensions;
75 
76  QString _font { "" };
77  TextAlignment _alignment { TextAlignment::LEFT };
78  TextVerticalAlignment _verticalAlignment { TextVerticalAlignment::TOP };
79  TextEffect _effect { TextEffect::NO_EFFECT };
80  glm::vec3 _effectColor { 0 };
81  float _effectThickness { 0.0f };
82 
83  FadeBuffers _fadeBuffers;
84 
85  int _geometryID { 0 };
86 
87  std::shared_ptr<TextPayload> _textPayload;
88  render::ItemID _textRenderID { render::Item::INVALID_ITEM_ID };
89  void updateTextRenderItem() const;
90 
91  friend class render::entities::TextPayload;
92 };
93 
94 class TextPayload {
95 public:
96  TextPayload() = default;
97  TextPayload(const QUuid& entityID, const std::weak_ptr<TextRenderer3D>& textRenderer);
98  ~TextPayload();
99 
100  typedef render::Payload<TextPayload> Payload;
101  typedef Payload::DataPointer Pointer;
102 
103  ItemKey getKey() const;
104  Item::Bound getBound(RenderArgs* args) const;
105  ShapeKey getShapeKey() const;
106  void render(RenderArgs* args);
107  bool passesZoneOcclusionTest(const std::unordered_set<QUuid>& containingZones) const;
108  ItemID computeMirrorView(ViewFrustum& viewFrustum) const;
109 
110 protected:
111  QUuid _entityID;
112  std::weak_ptr<TextRenderer3D> _textRenderer;
113  Transform _prevRenderTransform;
114 
115  int _geometryID { 0 };
116 };
117 
118 } }
119 
120 namespace render {
121  template <> const ItemKey payloadGetKey(const entities::TextPayload::Pointer& payload);
122  template <> const Item::Bound payloadGetBound(const entities::TextPayload::Pointer& payload, RenderArgs* args);
123  template <> const ShapeKey shapeGetShapeKey(const entities::TextPayload::Pointer& payload);
124  template <> void payloadRender(const entities::TextPayload::Pointer& payload, RenderArgs* args);
125  template <> bool payloadPassesZoneOcclusionTest(const entities::TextPayload::Pointer& payload, const std::unordered_set<QUuid>& containingZones);
126  template <> ItemID payloadComputeMirrorView(const entities::TextPayload::Pointer& payload, ViewFrustum& viewFrustum);
127 }
128 
129 #endif // hifi_RenderableTextEntityItem_h