Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend/StarChatBubbleManager.hpp
blob: 42b58dbb249c97362ae81930f4a05550d9d03fef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#pragma once

#include "StarChatAction.hpp"
#include "StarTextPainter.hpp"
#include "StarWorldCamera.hpp"
#include "StarChatBubbleSeparation.hpp"
#include "StarStoredFunctions.hpp"

namespace Star {

STAR_CLASS(GuiContext);
STAR_CLASS(AssetTextureGroup);
STAR_CLASS(WorldClient);
STAR_CLASS(ChatBubbleManager);

class ChatBubbleManager {
public:
  ChatBubbleManager();

  void setCamera(WorldCamera const& camera);

  void addChatActions(List<ChatAction> chatActions, bool silent = false);

  void update(float dt, WorldClientPtr world);
  void render();

private:
  typedef tuple<String, Vec2F> BubbleImage;
  typedef tuple<String, TextStyle, bool, Vec2F> BubbleText;

  struct Bubble {
    EntityId entity;
    String text;
    Json config;
    float age;
    List<BubbleImage> backgroundImages;
    List<BubbleText> bubbleText;
    bool onscreen;
  };

  struct PortraitBubble {
    EntityId entity;
    String portrait;
    String text;
    Vec2F position;
    Json config;
    float age;
    List<BubbleImage> backgroundImages;
    List<BubbleText> bubbleText;
    bool onscreen;
  };

  // Calculate the alpha for a speech bubble based on distance from player to
  // edge of screen
  uint8_t calcDistanceFadeAlpha(Vec2F bubbleScreenPosition, StoredFunctionPtr fadeFunction) const;

  RectF bubbleImageRect(Vec2F screenPos, BubbleImage const& bubbleImage, int pixelRatio);
  void drawBubbleImage(Vec2F screenPos, BubbleImage const& bubbleImage, int pixelRatio, int alpha);
  void drawBubbleText(Vec2F screenPos, BubbleText const& bubbleText, int pixelRatio, int alpha, bool isPortrait);

  GuiContext* m_guiContext;

  WorldCamera m_camera;

  TextPositioning m_textTemplate;
  TextPositioning m_portraitTextTemplate;
  TextStyle m_textStyle;
  Vec2F m_textPadding;

  BubbleSeparator<Bubble> m_bubbles;
  int m_zoom;
  Vec2F m_bubbleOffset;
  float m_maxAge;
  float m_portraitMaxAge;
  float m_interBubbleMargin;
  int m_maxMessagePerEntity;

  Deque<PortraitBubble> m_portraitBubbles;
  String m_portraitBackgroundImage;
  String m_portraitMoreImage;
  Vec2I m_portraitMorePosition;
  Vec2I m_portraitBackgroundSize;
  Vec2I m_portraitPosition;
  Vec2I m_portraitSize;
  Vec2I m_portraitTextPosition;
  unsigned m_portraitTextWidth;
  float m_portraitChatterFramerate;
  float m_portraitChatterDuration;

  float m_furthestVisibleTextDistance; // 0.0 is directly over the player, 1.0
  // is the edge of the window
  StoredFunctionPtr m_textFadeFunction;
  StoredFunctionPtr m_bubbleFadeFunction;
};

}