From cefa0a140e36b9946e9b69871258d7c13ceb1900 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Mon, 26 Aug 2019 21:34:19 +0400
Subject: [PATCH] Better frame time and quit event handling.

---
 common/sketchbook.hpp | 19 +++++++++++++++++--
 drag_and_wrap.cpp     |  2 +-
 starry_night_sky.cpp  |  2 +-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/common/sketchbook.hpp b/common/sketchbook.hpp
index 20f381f..4adb4a4 100644
--- a/common/sketchbook.hpp
+++ b/common/sketchbook.hpp
@@ -58,15 +58,26 @@ auto trand_float2()
 { return float2(trand_float(), trand_float()); };
 
 template <typename Number, typename Ratio = float>
+constexpr
 Number lerp(Number from, Number to, Ratio ratio)
 {
 	return from + (to - from) * ratio;
 }
 
+template <size_t FPS>
+class framerate
+{
+	public:
+	constexpr static auto frames_per_second = FPS;
+	// thanks howard hinnant, everything other than this amazing duration type caused a lot of stutter
+	using tick = std::chrono::duration<std::uintmax_t, std::ratio<1, FPS>>;
+	constexpr static auto frametime = tick(1);
+};
+
 class Program
 {
 	public:
-	using clock = std::chrono::high_resolution_clock;
+	using clock = std::chrono::steady_clock;
 	using duration = std::chrono::duration<float>;
 
 	private:
@@ -132,8 +143,8 @@ int main(int argc, char const* argv[]) try
 
 	if(!vsync && !program.frametime)
 	{
-		program.frametime = 16ms;
 		std::cout << "vsync didn't work"  << '\n';
+		program.frametime = framerate<60>::frametime;
 	}
 	float2 win_size = float2(win.size());
 
@@ -213,6 +224,10 @@ void process_events(Program& program)
 		{
 			program.mouse_move(float2(e.data.position), float2(e.data.motion));
 		},
+		[&program](const quit_request&)
+		{
+			program.end();
+		},
 		[](auto) { }
 	}, *event);
 }
diff --git a/drag_and_wrap.cpp b/drag_and_wrap.cpp
index a9904b3..e7ab349 100644
--- a/drag_and_wrap.cpp
+++ b/drag_and_wrap.cpp
@@ -63,6 +63,7 @@ circle* crc = nullptr;
 
 void start(Program& program)
 {
+	program.frametime = framerate<60>::frametime;
 
 	if(program.argc > 2)
 	{
@@ -70,7 +71,6 @@ void start(Program& program)
 		using seed_t = decltype(tiny_rand());
 		tiny_rand.seed({ ston<seed_t>(program.argv[1]), ston<seed_t>(program.argv[2]) });
 	}
-	program.frametime = 16'666'666ns;
 
 	std::cout << "seed: " << std::hex << std::showbase << tiny_rand << '\n';
 
diff --git a/starry_night_sky.cpp b/starry_night_sky.cpp
index cc524f5..aef11f7 100644
--- a/starry_night_sky.cpp
+++ b/starry_night_sky.cpp
@@ -17,7 +17,7 @@ rgb skyColorFrom (rgb24(0_u8, 0_u8, 51_u8)),
 bool request_draw = false;
 void start(Program& program)
 {
-	program.frametime = 16ms;
+	program.frametime = framerate<60>::frametime;
 
 	if(program.argc > 2)
 	{
-- 
GitLab