|
|
@@ -0,0 +1,62 @@
|
|
|
+//
|
|
|
+// fps_counter.cxx
|
|
|
+// engine
|
|
|
+//
|
|
|
+// Created by Sam Jaffe on 5/24/19.
|
|
|
+// Copyright © 2019 Sam Jaffe. All rights reserved.
|
|
|
+//
|
|
|
+
|
|
|
+#include "game/engine/fps_counter.hpp"
|
|
|
+
|
|
|
+#include <json/value.h>
|
|
|
+
|
|
|
+#include "game/engine/serial.hpp"
|
|
|
+#include "game/graphics/object.hpp"
|
|
|
+#include <iostream>
|
|
|
+
|
|
|
+using namespace engine;
|
|
|
+
|
|
|
+static graphics::object create() {
|
|
|
+ Json::Value value;
|
|
|
+ value["material"]["texture"]["file"] = "data/images/rock.png";
|
|
|
+ value["material"]["texture"]["uniform"] = "u_normalMap";
|
|
|
+ return engine::to_object(value);
|
|
|
+}
|
|
|
+
|
|
|
+static std::size_t digits(env::clock::duration const & fpscap) {
|
|
|
+ auto fps = env::clock::duration::period::den / fpscap.count();
|
|
|
+ std::size_t digits = 1;
|
|
|
+ while (fps /= 10)
|
|
|
+ ++digits;
|
|
|
+ return digits;
|
|
|
+}
|
|
|
+
|
|
|
+fps_counter::fps_counter(env::clock::duration const & fpscap,
|
|
|
+ std::size_t precision)
|
|
|
+ : digits_(precision), magnitude_(std::pow(10, digits_)),
|
|
|
+ glyphs_(digits(fpscap) + digits_ + 1, create()) {
|
|
|
+ auto offset = make_vector(0.f, 44.f);
|
|
|
+ auto pixels = make_vector(12.f, 16.f);
|
|
|
+ auto bounds = make_vector(512.f, 64.f);
|
|
|
+ auto glyph_size = pixels / bounds;
|
|
|
+ for (std::size_t i = 0; i < glyphs_.size(); ++i) {
|
|
|
+ glyphs_[i].location.origin = make_vector((i + 1) * 10.f, 10.f);
|
|
|
+ glyphs_[i].location.size = make_vector(10.f, 10.f);
|
|
|
+ glyphs_[i].points = glyphs_[i].location;
|
|
|
+ glyphs_[i].frame.size = glyph_size;
|
|
|
+ }
|
|
|
+ glyphs_[digits_].frame.origin = (offset + 10 * pixels) / bounds;
|
|
|
+}
|
|
|
+
|
|
|
+fps_counter::~fps_counter() {}
|
|
|
+
|
|
|
+void fps_counter::set_frame_step(env::clock::duration const & since) {
|
|
|
+ auto offset = make_vector(0.f, 48.f);
|
|
|
+ auto pixels = make_vector(12.f, 16.f);
|
|
|
+ auto bounds = make_vector(512.f, 64.f);
|
|
|
+ auto fps = magnitude_ * env::clock::duration::period::den / since.count();
|
|
|
+ for (std::size_t i = 0; i < glyphs_.size(); ++i, fps /= 10) {
|
|
|
+ if (i == digits_) continue;
|
|
|
+ glyphs_[i].frame.origin = (offset + (fps % 10) * pixels) / bounds;
|
|
|
+ }
|
|
|
+}
|