]> git.localhorst.tv Git - blobs.git/blob - src/ui/ui.cpp
becfb9813297002ac0d638b5d84e3bea2051f887
[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 <iomanip>
10 #include <iostream>
11 #include <sstream>
12 #include <glm/gtx/io.hpp>
13 #include <glm/gtx/transform.hpp>
14
15
16 namespace blobs {
17 namespace ui {
18
19 CreaturePanel::CreaturePanel(const app::Assets &assets)
20 : assets(assets)
21 , c(nullptr)
22 , name(new Label(assets.fonts.large))
23 , born(new Label(assets.fonts.medium))
24 , age(new Label(assets.fonts.medium))
25 , mass(new Label(assets.fonts.medium))
26 , pos(new Label(assets.fonts.medium))
27 , vel(new Label(assets.fonts.medium))
28 , dir(new Label(assets.fonts.medium))
29 , tile(new Label(assets.fonts.medium))
30 , goal(new Label(assets.fonts.medium))
31 , stats{nullptr}
32 , props{nullptr}
33 , panel() {
34         born->Text("00h 00m 00s");
35         Label *born_label = new Label(assets.fonts.medium);
36         born_label->Text("Born");
37         Panel *born_panel = new Panel;
38         born_panel
39                 ->Add(born_label)
40                 ->Add(born)
41                 ->Spacing(10.0f)
42                 ->Direction(Panel::HORIZONTAL);
43
44         age->Text("00h 00m 00s");
45         Label *age_label = new Label(assets.fonts.medium);
46         age_label->Text("Age");
47         Panel *age_panel = new Panel;
48         age_panel
49                 ->Add(age_label)
50                 ->Add(age)
51                 ->Spacing(10.0f)
52                 ->Direction(Panel::HORIZONTAL);
53
54         mass->Text("00.000kg");
55         Label *mass_label = new Label(assets.fonts.medium);
56         mass_label->Text("Mass");
57         Panel *mass_panel = new Panel;
58         mass_panel
59                 ->Add(mass_label)
60                 ->Add(mass)
61                 ->Spacing(10.0f)
62                 ->Direction(Panel::HORIZONTAL);
63
64         pos->Text("<00.0, 00.0, 00.0>");
65         Label *pos_label = new Label(assets.fonts.medium);
66         pos_label->Text("Pos");
67         Panel *pos_panel = new Panel;
68         pos_panel
69                 ->Add(pos_label)
70                 ->Add(pos)
71                 ->Spacing(10.0f)
72                 ->Direction(Panel::HORIZONTAL);
73
74         vel->Text("<00.0, 00.0, 00.0>");
75         Label *vel_label = new Label(assets.fonts.medium);
76         vel_label->Text("Vel");
77         Panel *vel_panel = new Panel;
78         vel_panel
79                 ->Add(vel_label)
80                 ->Add(vel)
81                 ->Spacing(10.0f)
82                 ->Direction(Panel::HORIZONTAL);
83
84         dir->Text("<0.00, 0.00, 0.00>");
85         Label *dir_label = new Label(assets.fonts.medium);
86         dir_label->Text("Dir");
87         Panel *dir_panel = new Panel;
88         dir_panel
89                 ->Add(dir_label)
90                 ->Add(dir)
91                 ->Spacing(10.0f)
92                 ->Direction(Panel::HORIZONTAL);
93
94         tile->Text("<00, 00> (mountains)");
95         Label *tile_label = new Label(assets.fonts.medium);
96         tile_label->Text("Tile");
97         Panel *tile_panel = new Panel;
98         tile_panel
99                 ->Add(tile_label)
100                 ->Add(tile)
101                 ->Spacing(10.0f)
102                 ->Direction(Panel::HORIZONTAL);
103
104         goal->Text("long goal description");
105         Label *goal_label = new Label(assets.fonts.medium);
106         goal_label->Text("Goal");
107         Panel *goal_panel = new Panel;
108         goal_panel
109                 ->Add(goal_label)
110                 ->Add(goal)
111                 ->Spacing(10.0f)
112                 ->Direction(Panel::HORIZONTAL);
113
114         Label *stat_label[7];
115         for (int i = 0; i < 7; ++i) {
116                 stat_label[i] = new Label(assets.fonts.medium);
117                 stats[i] = new Meter;
118                 stats[i]
119                         ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent()))
120                         ->Padding(glm::vec2(1.0f))
121                         ->Border(1.0f)
122                         ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
123         }
124         stat_label[0]->Text("Damage");
125         stat_label[1]->Text("Breath");
126         stat_label[2]->Text("Thirst");
127         stat_label[3]->Text("Hunger");
128         stat_label[4]->Text("Exhaustion");
129         stat_label[5]->Text("Fatigue");
130         stat_label[6]->Text("Boredom");
131
132         Panel *stat_label_panel = new Panel;
133         stat_label_panel
134                 ->Spacing(2)
135                 ->Direction(Panel::VERTICAL);
136         Panel *stat_meter_panel = new Panel;
137         stat_meter_panel
138                 ->Spacing(stat_label[0]->Size().y - stats[0]->Size().y + 2)
139                 ->Direction(Panel::VERTICAL);
140         for (int i = 0; i < 7; ++i) {
141                 stat_label_panel->Add(stat_label[i]);
142                 stat_meter_panel->Add(stats[i]);
143         }
144         Panel *stat_panel = new Panel;
145         stat_panel
146                 ->Direction(Panel::HORIZONTAL)
147                 ->Spacing(10)
148                 ->Add(stat_label_panel)
149                 ->Add(stat_meter_panel);
150
151         Label *prop_label[8];
152         for (int i = 0; i < 8; ++i) {
153                 prop_label[i] = new Label(assets.fonts.medium);
154                 props[i] = new Label(assets.fonts.medium);
155         }
156         prop_label[0]->Text("Strength");
157         prop_label[1]->Text("Stamina");
158         prop_label[2]->Text("Dexerty");
159         prop_label[3]->Text("Intelligence");
160         prop_label[4]->Text("Lifetime");
161         prop_label[5]->Text("Fertility");
162         prop_label[6]->Text("Mutability");
163         prop_label[7]->Text("Offspring mass");
164
165         Panel *prop_label_panel = new Panel;
166         prop_label_panel
167                 ->Spacing(2)
168                 ->Direction(Panel::VERTICAL);
169         Panel *prop_meter_panel = new Panel;
170         prop_meter_panel
171                 ->Spacing(2)
172                 ->Direction(Panel::VERTICAL);
173         for (int i = 0; i < 8; ++i) {
174                 prop_label_panel->Add(prop_label[i]);
175                 prop_meter_panel->Add(props[i]);
176         }
177         Panel *prop_panel = new Panel;
178         prop_panel
179                 ->Direction(Panel::HORIZONTAL)
180                 ->Spacing(10)
181                 ->Add(prop_label_panel)
182                 ->Add(prop_meter_panel);
183
184         panel
185                 .Add(name)
186                 ->Add(age_panel)
187                 ->Add(born_panel)
188                 ->Add(mass_panel)
189                 ->Add(pos_panel)
190                 ->Add(vel_panel)
191                 ->Add(dir_panel)
192                 ->Add(tile_panel)
193                 ->Add(goal_panel)
194                 ->Add(stat_panel)
195                 ->Add(prop_panel)
196                 ->Padding(glm::vec2(10.0f))
197                 ->Spacing(10.0f)
198                 ->Direction(Panel::VERTICAL)
199                 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f));
200 }
201
202 CreaturePanel::~CreaturePanel() {
203 }
204
205
206 void CreaturePanel::Show(creature::Creature &cr) {
207         c = &cr;
208         name->Text(c->Name());
209         born->Time(c->Born());
210 }
211
212 void CreaturePanel::Hide() noexcept {
213         c = nullptr;
214 }
215
216 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
217         if (!c) return;
218
219         age->Time(c->Age());
220         mass->Mass(c->Mass());
221         {
222                 const glm::dvec3 &p = c->GetSituation().Position();
223                 std::stringstream ss;
224                 ss << std::fixed << std::setprecision(1)
225                         << "<" << p.x << ", " << p.y << ", " << p.z << ">";
226                 pos->Text(ss.str());
227         }
228         {
229                 const glm::dvec3 &v = c->GetSituation().Velocity();
230                 std::stringstream ss;
231                 ss << std::fixed << std::setprecision(1)
232                         << "<" << v.x << ", " << v.y << ", " << v.z << ">";
233                 vel->Text(ss.str());
234         }
235         {
236                 const glm::dvec3 &d = c->GetSituation().GetState().dir;
237                 std::stringstream ss;
238                 ss << std::fixed << std::setprecision(2)
239                         << "<" << d.x << ", " << d.y << ", " << d.z << ">";
240                 dir->Text(ss.str());
241         }
242         {
243                 glm::ivec2 t = c->GetSituation().SurfacePosition();
244                 std::stringstream ss;
245                 ss << std::fixed << std::setprecision(1)
246                         << "<" << t.x << ", " << t.y
247                         << "> (" << c->GetSituation().GetTileType().label << ")";
248                 tile->Text(ss.str());
249         }
250         if (c->Goals().empty()) {
251                 goal->Text("none");
252         } else {
253                 goal->Text(c->Goals()[0]->Describe());
254         }
255
256         for (int i = 0; i < 7; ++i) {
257                 stats[i]->Value(c->GetStats().stat[i].value);
258                 if (c->GetStats().stat[i].Okay()) {
259                         stats[i]->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f));
260                 } else if (c->GetStats().stat[i].Critical()) {
261                         stats[i]->FillColor(glm::vec4(0.7f, 0.0f, 0.0f, 1.0f));
262                 } else {
263                         stats[i]->FillColor(glm::vec4(0.9f, 0.4f, 0.0f, 1.0f));
264                 }
265         }
266
267         props[0]->Decimal(c->Strength());
268         props[1]->Decimal(c->Stamina());
269         props[2]->Decimal(c->Dexerty());
270         props[3]->Decimal(c->Intelligence());
271         props[4]->Time(c->Lifetime());
272         props[5]->Percentage(c->Fertility());
273         props[6]->Percentage(c->Mutability());
274         props[7]->Mass(c->OffspringMass());
275
276         const glm::vec2 margin(20.0f);
277
278         panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
279         panel.Draw(assets, viewport);
280 }
281
282 }
283 }