@@ -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 */ | |||||