| @@ -107,7 +107,7 @@ liblol_core_sources = \ | |||||
| mesh/mesh.cpp mesh/mesh.h \ | mesh/mesh.cpp mesh/mesh.h \ | ||||
| mesh/primitivemesh.cpp mesh/primitivemesh.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 \ | sys/thread.cpp sys/threadtypes.cpp sys/getopt.cpp \ | ||||
| \ | \ | ||||
| image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | ||||
| @@ -10,6 +10,9 @@ | |||||
| #pragma once | #pragma once | ||||
| #include <chrono> | |||||
| #include <thread> | |||||
| // | // | ||||
| // The Timer class | // The Timer class | ||||
| // --------------- | // --------------- | ||||
| @@ -18,18 +21,71 @@ | |||||
| namespace lol | 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 | class Timer | ||||
| { | { | ||||
| public: | 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: | private: | ||||
| TimerData *data; | 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 */ | |||||