Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: 6b55344e5c6191d78ba406f2064054fda2855998 (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
97
/*
   client/hudenginestatus.cc
   This file is part of the Osirion project and is distributed under
   the terms and conditions of the GNU General Public License version 2
*/

#include "client/hudenginestatus.h"
#include "core/core.h"
#include "core/application.h"
#include "ui/ui.h"
#include "ui/paint.h"
#include "render/gl.h"

namespace client
{

HUDEngineStatus::HUDEngineStatus(ui::Widget *parent) : ui::Widget(parent)
{
	set_border(false);
	set_background(false);
}

void HUDEngineStatus::draw()
{
	const float padding = font()->width() * 0.25f;
	
	math::Vector2f pos(global_location());
	pos[0] += padding;
	pos[1] += padding;
	
	math::Vector2f s(size());
	s[0] -= 2.0f * padding;
	s[1] -= 2.0f * padding;
	
	// thrust
	const float blink_t = core::application()->time() * 2.0f;
	std::ostringstream thruststr;
	switch(core::localcontrol()->state()) {
		case core::Entity::Normal:
			thruststr << "^B" << roundf(core::localcontrol()->thrust() * 100.0f) << "%";
			break;
		case core::Entity::ImpulseInitiate:
		case core::Entity::JumpInitiate:
			
			if ((blink_t - floorf(blink_t)) < 0.5f) {
				thruststr << "^B--";
			}
			break;
		default:
			thruststr << "^B--";
			break;
	}

	// speed
	std::ostringstream speedstr;
	speedstr << "^B" << roundf(core::localcontrol()->speed() * 100.0f);
	
	ui::Paint::set_color(palette()->foreground());
	ui::Paint::draw_label(pos, s, ui::root()->font_large(), thruststr.str(), ui::AlignLeft | ui::AlignVCenter);
	ui::Paint::draw_label(pos, s, ui::root()->font_large(), speedstr.str(), ui::AlignRight | ui::AlignVCenter);
		
	// health bar size
	const float hb_width = width() - 12 * ui::root()->font_large()->width() - 2.0f * padding;
	const float hb_height = ui::root()->font_tiny()->width();
	const float hb_f = hb_width * core::localcontrol()->health() / 100.0f;
	
	pos.assign(global_location());
	pos[0] += (width() - hb_width) * 0.5f;
	pos[1] += (height() - hb_height) * 0.5f;
	
	// health bar
	gl::color(0, 1, 0, 1);
	gl::begin(gl::Quads);
	gl::vertex(pos[0], pos[1]);
	gl::vertex(pos[0] + hb_f, pos[1]);
	gl::vertex(pos[0] + hb_f, pos[1] + hb_height);
	gl::vertex(pos[0], pos[1] + hb_height);
	gl::end();
	
	// health bar frame
	gl::color(palette()->foreground());
	
	gl::begin(gl::LineLoop);
	gl::vertex(pos[0], pos[1]);
	gl::vertex(pos[0] + hb_width, pos[1]);
	gl::vertex(pos[0] + hb_width, pos[1] + hb_height);
	gl::vertex(pos[0], pos[1] + hb_height);
	gl::end();
}

bool HUDEngineStatus::on_keypress(const int key, const unsigned int modifier)
{
	return false;
}

} // namespace client