104 lines
No EOL
2.1 KiB
C++
104 lines
No EOL
2.1 KiB
C++
|
|
#include "Animations.hpp"
|
|
|
|
using namespace tp;
|
|
|
|
bool AnimValue::gInTransition = false;
|
|
|
|
halnf AnimValue::interpolate() const {
|
|
if (!mTimeAnim) {
|
|
return mVal;
|
|
}
|
|
|
|
auto dt = gCurrentTime - mTimeStart;
|
|
if (dt > mTimeAnim) dt = mTimeAnim;
|
|
auto t = (halnf)dt / (halnf)mTimeAnim;
|
|
t = (halnf)(0.511 + atan((t - 0.36) * 28) / 2.9);
|
|
t = clamp(t, 0.f, 1.f);
|
|
auto out = mValPrev + (mVal - mValPrev) * t;
|
|
return out;
|
|
}
|
|
|
|
AnimValue::AnimValue() = default;
|
|
|
|
void AnimValue::setAnimTime(halni time) {
|
|
mTimeAnim = time;
|
|
}
|
|
|
|
AnimValue::AnimValue(halnf val) {
|
|
mVal = val;
|
|
mValPrev = mVal;
|
|
mTimeStart = gCurrentTime;
|
|
}
|
|
|
|
bool AnimValue::inTransition() const {
|
|
auto timePassed = gCurrentTime - mTimeStart >= mTimeAnim;
|
|
return !timePassed;
|
|
}
|
|
|
|
void AnimValue::set(halnf val) {
|
|
if (!inTransition()) mValPrev = mVal;
|
|
if (val == mVal) return;
|
|
mValPrev = get();
|
|
mVal = val;
|
|
if (!inTransition()) mTimeStart = (halni)gCurrentTime;
|
|
}
|
|
|
|
halnf AnimValue::getTarget() const {
|
|
return mVal;
|
|
}
|
|
|
|
void AnimValue::setNoTransition(halnf val) {
|
|
mValPrev = val;
|
|
mVal = val;
|
|
mTimeStart -= mTimeStart;
|
|
}
|
|
|
|
halnf AnimValue::get() const {
|
|
if (inTransition()) {
|
|
gInTransition = true;
|
|
}
|
|
return interpolate();
|
|
}
|
|
|
|
AnimValue::operator halnf() const {
|
|
return get();
|
|
}
|
|
|
|
RectF AnimRect::get() const {
|
|
return { x.get(), y.get() , z.get(), w.get() };
|
|
}
|
|
|
|
RectF AnimRect::getTarget() const {
|
|
return { x.getTarget(), y.getTarget() , z.getTarget(), w.getTarget() };
|
|
}
|
|
|
|
void AnimRect::setNoTransition(RectF rec) {
|
|
x.setNoTransition(rec.x);
|
|
y.setNoTransition(rec.y);
|
|
z.setNoTransition(rec.z);
|
|
w.setNoTransition(rec.w);
|
|
}
|
|
|
|
void AnimRect::setAnimTime(const halni time) {
|
|
x.setAnimTime(time);
|
|
y.setAnimTime(time);
|
|
z.setAnimTime(time);
|
|
w.setAnimTime(time);
|
|
}
|
|
|
|
void AnimRect::set(const RectF& in) {
|
|
x.set(in.x);
|
|
y.set(in.y);
|
|
z.set(in.z);
|
|
w.set(in.w);
|
|
}
|
|
|
|
RGBA AnimColor::get() const {
|
|
auto col = mColor.get();
|
|
return {col.x, col.y, col.z, col.w};
|
|
}
|
|
|
|
void AnimColor::set(const RGBA& col) {
|
|
mColor.set(RectF(col.r, col.g, col.b, col.a));
|
|
} |