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 <procedural/Procedural.h>
20 
21 class TextEntityItem;
22 class TextRenderer3D;
23 
24 namespace render { namespace entities {
25 
26 class TextPayload;
27 
28 class TextEntityRenderer : public TypedEntityRenderer<TextEntityItem> {
29  using Parent = TypedEntityRenderer<TextEntityItem>;
30  using Pointer = std::shared_ptr<TextEntityRenderer>;
31 public:
32  TextEntityRenderer(const EntityItemPointer& entity);
33  ~TextEntityRenderer();
34 
35  QSizeF textSize(const QString& text) const;
36 
37 protected:
38  bool isTransparent() const override;
39  bool isTextTransparent() const;
40  Item::Bound getBound(RenderArgs* args) override;
41  ShapeKey getShapeKey() override;
42  ItemKey getKey() override;
43  virtual uint32_t metaFetchMetaSubItems(ItemIDs& subItems) const override;
44 
45  void onAddToSceneTyped(const TypedEntityPointer& entity) override;
46  void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override;
47 
48 private:
49  virtual bool needsRenderUpdate() const override;
50  virtual void doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) override;
51  virtual void doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) override;
52  virtual void doRender(RenderArgs* args) override;
53 
54  std::shared_ptr<TextRenderer3D> _textRenderer;
55 
56  PulsePropertyGroup _pulseProperties;
57 
58  QString _text;
59  float _lineHeight;
60  glm::vec3 _textColor;
61  float _textAlpha;
62  bool _unlit { false };
63 
64  std::shared_ptr<graphics::ProceduralMaterial> _material { std::make_shared<graphics::ProceduralMaterial>() };
65  glm::vec3 _backgroundColor { NAN };
66  float _backgroundAlpha { NAN };
67 
68  float _leftMargin;
69  float _rightMargin;
70  float _topMargin;
71  float _bottomMargin;
72 
73  glm::vec3 _dimensions;
74 
75  QString _font { "" };
76  TextAlignment _alignment { TextAlignment::LEFT };
77  TextEffect _effect { TextEffect::NO_EFFECT };
78  glm::vec3 _effectColor { 0 };
79  float _effectThickness { 0.0f };
80 
81  int _geometryID { 0 };
82 
83  std::shared_ptr<TextPayload> _textPayload;
84  render::ItemID _textRenderID;
85  void updateTextRenderItem() const;
86 
87  friend class render::entities::TextPayload;
88 };
89 
90 class TextPayload {
91 public:
92  TextPayload() = default;
93  TextPayload(const QUuid& entityID, const std::weak_ptr<TextRenderer3D>& textRenderer);
94  ~TextPayload();
95 
96  typedef render::Payload<TextPayload> Payload;
97  typedef Payload::DataPointer Pointer;
98 
99  ItemKey getKey() const;
100  Item::Bound getBound(RenderArgs* args) const;
101  ShapeKey getShapeKey() const;
102  void render(RenderArgs* args);
103  bool passesZoneOcclusionTest(const std::unordered_set<QUuid>& containingZones) const;
104 
105 protected:
106  QUuid _entityID;
107  std::weak_ptr<TextRenderer3D> _textRenderer;
108 
109  int _geometryID { 0 };
110 };
111 
112 } }
113 
114 namespace render {
115  template <> const ItemKey payloadGetKey(const entities::TextPayload::Pointer& payload);
116  template <> const Item::Bound payloadGetBound(const entities::TextPayload::Pointer& payload, RenderArgs* args);
117  template <> const ShapeKey shapeGetShapeKey(const entities::TextPayload::Pointer& payload);
118  template <> void payloadRender(const entities::TextPayload::Pointer& payload, RenderArgs* args);
119  template <> bool payloadPassesZoneOcclusionTest(const entities::TextPayload::Pointer& payload, const std::unordered_set<QUuid>& containingZones);
120 }
121 
122 #endif // hifi_RenderableTextEntityItem_h