93 lines
2.2 KiB
C++
93 lines
2.2 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "core/clock.h"
|
|
#include "platform.h"
|
|
|
|
using namespace GS::Core;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
float Clock::Getf() const
|
|
{ return (float)gtick / Platform::Get().GetClockFrequency(); }
|
|
float Clock::GetDeltaf() const
|
|
{ return (float)dt_clock / Platform::Get().GetClockFrequency(); }
|
|
void Clock::SetScalef(float k)
|
|
{ SetScale((int)(k * 1000.f)); }
|
|
float Clock::GetScalef() const
|
|
{ return (float)GetScale() / 1000.f; }
|
|
void Clock::SetFixedDeltaFramef(float dt)
|
|
{ fixed_delta = (dt >= 0.0) ? int(dt * Platform::Get().GetClockFrequency()) : -1; }
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Clock::Pause(bool _pause)
|
|
{ pause = _pause; }
|
|
void Clock::Reset()
|
|
{
|
|
_gtick = Platform::Get().GetClock(); // CU
|
|
dt_clock_filter.Reset();
|
|
}
|
|
void Clock::Update()
|
|
{
|
|
// Clock can run up to 49 days before looping.
|
|
if (pause)
|
|
{
|
|
_gtick = 0;
|
|
dt_clock = 0;
|
|
}
|
|
else
|
|
{
|
|
int tmp = Platform::Get().GetClock(); // CU
|
|
int raw_dt = tmp - _gtick; // CU
|
|
int dt = (raw_dt * clock_scale) / 1000; // CU
|
|
|
|
// Fixed delta clock.
|
|
if (fixed_delta > 0)
|
|
dt = (fixed_delta * clock_scale) / 1000; // CU
|
|
|
|
// Update tick.
|
|
if (_gtick != 0)
|
|
{
|
|
gtick += dt;
|
|
dt_clock = dt;
|
|
}
|
|
else
|
|
dt_clock = 0;
|
|
|
|
_gtick = tmp;
|
|
if (dt_clock < 0)
|
|
dt_clock = 0;
|
|
|
|
// Filter dt_clock.
|
|
dt_clock_filter.LogValue(dt_clock);
|
|
int filtered_dt_clock = dt_clock_filter.GetMedian();
|
|
|
|
dt_error += dt_clock - filtered_dt_clock;
|
|
int dt_error_correction = dt_error >> 2;
|
|
dt_error -= dt_error_correction;
|
|
|
|
dt_clock = filtered_dt_clock + dt_error_correction;
|
|
}
|
|
}
|
|
void Clock::EatDeltaClock()
|
|
{ _gtick = Platform::Get().GetClock(); }
|
|
|
|
Clock::Clock()
|
|
{
|
|
pause = false;
|
|
|
|
_gtick = 0;
|
|
gtick = 0;
|
|
|
|
dt_clock = 0;
|
|
dt_error = 0;
|
|
clock_scale = 1000;
|
|
|
|
fixed_delta = -1;
|
|
}
|
|
//------------------------------------------------------------------------------
|