Add util::updater and smooth_updater

This commit is contained in:
Nikita Lisitsa 2021-12-22 20:35:21 +03:00
parent 8d0440926f
commit ec08a4a281
2 changed files with 81 additions and 0 deletions

View file

@ -0,0 +1,67 @@
#pragma once
#include <psemek/util/updater.hpp>
#include <cmath>
namespace psemek::util
{
template <typename Time, typename Value = Time>
struct smooth_updater
: updater<Time>
{
smooth_updater(Value & value, Time speed)
: value_(value)
, target_(value)
, speed_(speed)
{}
template <typename H>
smooth_updater & operator = (H new_value)
{
target_ = new_value;
return *this;
}
template <typename H>
smooth_updater & operator += (H new_value)
{
target_ += new_value;
return *this;
}
template <typename H>
smooth_updater & operator -= (H new_value)
{
target_ -= new_value;
return *this;
}
template <typename H>
smooth_updater & operator *= (H new_value)
{
target_ *= new_value;
return *this;
}
template <typename H>
smooth_updater & operator /= (H new_value)
{
target_ /= new_value;
return *this;
}
void update(Time dt) override
{
using std::lerp;
value_ = lerp(target_, value_, std::exp(- dt * speed_));
}
private:
Value & value_;
Value target_;
Time speed_;
};
}

View file

@ -0,0 +1,14 @@
#pragma once
namespace psemek::util
{
template <typename Time>
struct updater
{
virtual void update(Time dt) = 0;
virtual ~updater() {}
};
}