| @@ -107,7 +107,7 @@ liblol_core_sources = \ | |||
| mesh/mesh.cpp mesh/mesh.h \ | |||
| mesh/primitivemesh.cpp mesh/primitivemesh.h \ | |||
| \ | |||
| sys/init.cpp sys/timer.cpp sys/file.cpp sys/hacks.cpp \ | |||
| sys/init.cpp sys/file.cpp sys/hacks.cpp \ | |||
| sys/thread.cpp sys/threadtypes.cpp sys/getopt.cpp \ | |||
| \ | |||
| image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | |||
| @@ -10,6 +10,9 @@ | |||
| #pragma once | |||
| #include <chrono> | |||
| #include <thread> | |||
| // | |||
| // The Timer class | |||
| // --------------- | |||
| @@ -18,18 +21,71 @@ | |||
| namespace lol | |||
| { | |||
| class TimerData; | |||
| /* | |||
| * Timer implementation class | |||
| */ | |||
| class TimerData | |||
| { | |||
| friend class Timer; | |||
| private: | |||
| TimerData() | |||
| { | |||
| (void)GetSeconds(true); | |||
| } | |||
| float GetSeconds(bool reset) | |||
| { | |||
| std::chrono::steady_clock::time_point tp, tp0 = m_tp; | |||
| tp = std::chrono::steady_clock::now(); | |||
| if (reset) | |||
| m_tp = tp; | |||
| return std::chrono::duration_cast<std::chrono::duration<float>>(tp - tp0).count(); | |||
| } | |||
| static void WaitSeconds(float seconds) | |||
| { | |||
| if (seconds > 0.0f) | |||
| std::this_thread::sleep_for(std::chrono::duration<float>(seconds)); | |||
| } | |||
| std::chrono::steady_clock::time_point m_tp; | |||
| }; | |||
| class Timer | |||
| { | |||
| public: | |||
| Timer(); | |||
| ~Timer(); | |||
| Timer() | |||
| : data(new TimerData()) | |||
| { | |||
| } | |||
| ~Timer() | |||
| { | |||
| delete data; | |||
| } | |||
| void Reset() | |||
| { | |||
| (void)data->GetSeconds(true); | |||
| } | |||
| float Get() | |||
| { | |||
| return data->GetSeconds(true); | |||
| } | |||
| float Poll() | |||
| { | |||
| return data->GetSeconds(false); | |||
| } | |||
| void Reset(); | |||
| float Get(); | |||
| float Poll(); | |||
| void Wait(float seconds); | |||
| void Wait(float seconds) | |||
| { | |||
| float secs_elapsed = data->GetSeconds(false); | |||
| data->WaitSeconds(seconds - secs_elapsed); | |||
| } | |||
| private: | |||
| TimerData *data; | |||
| @@ -1,91 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| #include <cstdlib> | |||
| #include <stdint.h> | |||
| #include <chrono> | |||
| using namespace std::chrono; | |||
| namespace lol | |||
| { | |||
| /* | |||
| * Timer implementation class | |||
| */ | |||
| class TimerData | |||
| { | |||
| friend class Timer; | |||
| private: | |||
| TimerData() | |||
| { | |||
| (void)GetSeconds(true); | |||
| } | |||
| float GetSeconds(bool reset) | |||
| { | |||
| steady_clock::time_point tp, tp0 = m_tp; | |||
| tp = steady_clock::now(); | |||
| if (reset) | |||
| m_tp = tp; | |||
| return duration_cast<duration<float>>(tp - tp0).count(); | |||
| } | |||
| static void WaitSeconds(float seconds) | |||
| { | |||
| if (seconds > 0.0f) | |||
| std::this_thread::sleep_for(std::chrono::duration<float>(seconds)); | |||
| } | |||
| steady_clock::time_point m_tp; | |||
| }; | |||
| /* | |||
| * Timer public class | |||
| */ | |||
| Timer::Timer() | |||
| : data(new TimerData()) | |||
| { | |||
| } | |||
| Timer::~Timer() | |||
| { | |||
| delete data; | |||
| } | |||
| void Timer::Reset() | |||
| { | |||
| (void)data->GetSeconds(true); | |||
| } | |||
| float Timer::Get() | |||
| { | |||
| return data->GetSeconds(true); | |||
| } | |||
| float Timer::Poll() | |||
| { | |||
| return data->GetSeconds(false); | |||
| } | |||
| void Timer::Wait(float seconds) | |||
| { | |||
| float secs_elapsed = data->GetSeconds(false); | |||
| data->WaitSeconds(seconds - secs_elapsed); | |||
| } | |||
| } /* namespace lol */ | |||