]> git.localhorst.tv Git - blobs.git/blob - src/ui/ui.cpp
better 2D rendering
[blobs.git] / src / ui / ui.cpp
1 #include "CreaturePanel.hpp"
2
3 #include "Label.hpp"
4 #include "Meter.hpp"
5 #include "../app/Assets.hpp"
6 #include "../creature/Creature.hpp"
7 #include "../graphics/Viewport.hpp"
8
9 #include <glm/gtx/transform.hpp>
10
11
12 namespace blobs {
13 namespace ui {
14
15 CreaturePanel::CreaturePanel(const app::Assets &assets)
16 : assets(assets)
17 , c(nullptr)
18 , name(new Label(assets.fonts.large))
19 , needs(new Panel)
20 , panel() {
21         panel
22                 .Add(name)
23                 ->Add(needs)
24                 ->Padding(glm::vec2(10.0f))
25                 ->Spacing(10.0f)
26                 ->Direction(Panel::VERTICAL)
27                 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f));
28 }
29
30 CreaturePanel::~CreaturePanel() {
31 }
32
33
34 void CreaturePanel::Show(creature::Creature &cr) {
35         c = &cr;
36         name->Text(c->Name());
37         CreateNeeds();
38 }
39
40 void CreaturePanel::CreateNeeds() {
41         needs->Clear()->Reserve(c->Needs().size());
42         meters.clear();
43         meters.reserve(c->Needs().size());
44         for (auto &need : c->Needs()) {
45                 Label *label = new Label(assets.fonts.medium);
46                 label
47                         ->Text(assets.data.resources[need.resource].label);
48                 Meter *meter = new Meter;
49                 meter
50                         ->Value(1.0f - need.value)
51                         ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent()))
52                         ->Padding(glm::vec2(1.0f))
53                         ->Border(1.0f)
54                         ->FillColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f))
55                         ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
56                 Panel *need_panel = new Panel;
57                 need_panel
58                         ->Direction(Panel::HORIZONTAL)
59                         ->Spacing(10.0f)
60                         ->Add(label)
61                         ->Add(meter);
62                 needs->Add(need_panel);
63                 meters.push_back(meter);
64         }
65         panel.Relayout();
66 }
67
68 void CreaturePanel::Hide() noexcept {
69         c = nullptr;
70 }
71
72 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
73         if (!c) return;
74
75         if (meters.size() != c->Needs().size()) {
76                 CreateNeeds();
77         } else {
78                 auto need = c->Needs().begin();
79                 auto need_end = c->Needs().end();
80                 auto meter = meters.begin();
81                 for (; need != need_end; ++need, ++meter) {
82                         (*meter)->Value(1.0f - need->value)->FillColor(need->IsSatisfied()
83                                 ? glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)
84                                 : glm::vec4(1.0f, 0.0f, 0.0f, 1.0f));
85                 }
86         }
87
88         const glm::vec2 margin(20.0f);
89
90         panel.Position(glm::vec3(viewport.Width() - margin.x - panel.Size().x, margin.y, 0.0f));
91         panel.Draw(assets, viewport);
92 }
93
94 }
95 }