]> git.localhorst.tv Git - blobs.git/blob - src/ui/ui.cpp
basic info box
[blobs.git] / src / ui / ui.cpp
1 #include "CreaturePanel.hpp"
2
3 #include "../app/Assets.hpp"
4 #include "../creature/Creature.hpp"
5 #include "../graphics/Viewport.hpp"
6
7 #include <glm/gtx/transform.hpp>
8
9 #include <iostream>
10 #include <glm/gtx/io.hpp>
11
12
13 namespace blobs {
14 namespace ui {
15
16 CreaturePanel::CreaturePanel(const app::Assets &assets)
17 : c(nullptr)
18 , name(assets.fonts.large) {
19         name.Origin(Gravity::NORTH_EAST);
20 }
21
22 CreaturePanel::~CreaturePanel() {
23 }
24
25
26 void CreaturePanel::Show(creature::Creature &cr) {
27         c = &cr;
28         name.Text(c->Name());
29 }
30
31 void CreaturePanel::Hide() noexcept {
32         c = nullptr;
33 }
34
35 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
36         if (!c) return;
37
38         const glm::vec2 margin(20.0f);
39         const glm::vec2 padding(10.0f);
40
41         const glm::vec2 size(name.Size() + 2.0f * padding);
42         const glm::vec2 half_size = size * 0.5f;
43
44         const glm::vec3 top_right(viewport.Width() - margin.x, margin.y, 0.0f);
45         name.Position(top_right - glm::vec3(padding.x, -padding.y, 1.0f));
46
47         assets.shaders.plain_color.Activate();
48         assets.shaders.plain_color.SetM(
49                 glm::translate(glm::vec3(top_right.x - half_size.x, top_right.y + half_size.y, 0.0f))
50                 * glm::scale(glm::vec3(half_size.x, half_size.y, 1.0f)));
51         assets.shaders.plain_color.SetColor(glm::vec3(0.7f, 0.7f, 0.7f));
52         assets.shaders.plain_color.DrawRect();
53
54         name.Draw(assets, viewport);
55 }
56
57
58 Label::Label(const graphics::Font &f)
59 : font(&f)
60 , text()
61 , tex()
62 , fg_color(0.0f, 0.0f, 0.0f, 1.0f)
63 , bg_color(0.0f, 0.0f, 0.0f, 0.0f)
64 , pos(0.0f, 0.0f, 0.0f)
65 , origin(Gravity::CENTER)
66 , dirty(true) {
67 }
68
69 Label::~Label() {
70 }
71
72 Label &Label::Text(const std::string &t) {
73         if (text != t) {
74                 dirty = true;
75         }
76         text = t;
77         return *this;
78 }
79
80 Label &Label::Font(const graphics::Font &f) {
81         if (font != &f) {
82                 dirty = true;
83         }
84         font = &f;
85         return *this;
86 }
87
88 Label &Label::Foreground(const glm::vec4 &c) {
89         fg_color = c;
90         return *this;
91 }
92
93 Label &Label::Background(const glm::vec4 &c) {
94         bg_color = c;
95         return *this;
96 }
97
98 glm::vec2 Label::Size() {
99         Update();
100         return tex.Size();
101 }
102
103 void Label::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
104         Update();
105         glm::vec2 size = Size();
106         glm::vec3 position = align(origin, size, pos);
107
108         std::cout << "pos: " << pos << ", size: " << size << ", position: " << position << std::endl;
109
110         assets.shaders.alpha_sprite.Activate();
111         assets.shaders.alpha_sprite.SetM(glm::translate(position)
112                 * glm::scale(glm::vec3(size.x * 0.5f, size.y * 0.5f, 1.0f)));
113         assets.shaders.alpha_sprite.SetTexture(tex);
114         assets.shaders.alpha_sprite.SetFgColor(fg_color);
115         assets.shaders.alpha_sprite.SetBgColor(bg_color);
116         assets.shaders.alpha_sprite.DrawRect();
117 }
118
119 void Label::Update() {
120         if (!dirty) return;
121         font->Render(text, tex);
122         dirty = false;
123 }
124
125 }
126 }