+Meter::Meter()
+: fill_color(1.0f)
+, border_color(1.0f)
+, size(3.0f)
+, padding(1.0f)
+, border(1.0f)
+, value(0.0f) {
+}
+
+Meter::~Meter() {
+}
+
+glm::vec2 Meter::Size() {
+ return size + (2.0f * padding) + glm::vec2(2.0f * border);
+}
+
+void Meter::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
+ glm::vec2 fullsize = Size();
+ assets.shaders.canvas.Activate();
+ assets.shaders.canvas.ZIndex(ZIndex());
+
+ if (border > 0.0f) {
+ assets.shaders.canvas.SetColor(border_color);
+ assets.shaders.canvas.DrawRect(
+ Position() + glm::vec2(border * 0.5f),
+ Position() + fullsize - glm::vec2(border * 0.5f),
+ border
+ );
+ }
+
+ if (value > 0.0f) {
+ glm::vec2 bottom_right = Position() + fullsize - glm::vec2(border) - padding;
+ bottom_right.x -= size.x * (1.0f - value);
+ assets.shaders.canvas.SetColor(fill_color);
+ assets.shaders.canvas.FillRect(
+ Position() + glm::vec2(border) + padding,
+ bottom_right
+ );
+ }
+}
+
+