112 lines
2.4 KiB
C
112 lines
2.4 KiB
C
// Copyright (c) 2026 Dominic Masters
|
|
//
|
|
// This software is released under the MIT License.
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include "easing.h"
|
|
#include "assert/assert.h"
|
|
#include <math.h>
|
|
|
|
const easingfn_t EASING_FUNCTIONS[EASING_COUNT] = {
|
|
easingLinear,
|
|
easingInSine,
|
|
easingOutSine,
|
|
easingInOutSine,
|
|
easingInQuad,
|
|
easingOutQuad,
|
|
easingInOutQuad,
|
|
easingInCubic,
|
|
easingOutCubic,
|
|
easingInOutCubic,
|
|
easingInQuart,
|
|
easingOutQuart,
|
|
easingInOutQuart,
|
|
easingInBack,
|
|
easingOutBack,
|
|
easingInOutBack,
|
|
};
|
|
|
|
float_t easingApply(const easingtype_t type, const float_t t) {
|
|
assertTrue(type < EASING_COUNT, "Invalid easing type");
|
|
return EASING_FUNCTIONS[type](t);
|
|
}
|
|
|
|
float_t easingLinear(const float_t t) {
|
|
return t;
|
|
}
|
|
|
|
float_t easingInSine(const float_t t) {
|
|
return 1.0f - cosf(t * EASING_PI * 0.5f);
|
|
}
|
|
|
|
float_t easingOutSine(const float_t t) {
|
|
return sinf(t * EASING_PI * 0.5f);
|
|
}
|
|
|
|
float_t easingInOutSine(const float_t t) {
|
|
return -(cosf(EASING_PI * t) - 1.0f) * 0.5f;
|
|
}
|
|
|
|
float_t easingInQuad(const float_t t) {
|
|
return t * t;
|
|
}
|
|
|
|
float_t easingOutQuad(const float_t t) {
|
|
float_t u = 1.0f - t;
|
|
return 1.0f - u * u;
|
|
}
|
|
|
|
float_t easingInOutQuad(const float_t t) {
|
|
if(t < 0.5f) return 2.0f * t * t;
|
|
float_t u = -2.0f * t + 2.0f;
|
|
return 1.0f - u * u * 0.5f;
|
|
}
|
|
|
|
float_t easingInCubic(const float_t t) {
|
|
return t * t * t;
|
|
}
|
|
|
|
float_t easingOutCubic(const float_t t) {
|
|
float_t u = 1.0f - t;
|
|
return 1.0f - u * u * u;
|
|
}
|
|
|
|
float_t easingInOutCubic(const float_t t) {
|
|
if(t < 0.5f) return 4.0f * t * t * t;
|
|
float_t u = -2.0f * t + 2.0f;
|
|
return 1.0f - u * u * u * 0.5f;
|
|
}
|
|
|
|
float_t easingInQuart(const float_t t) {
|
|
return t * t * t * t;
|
|
}
|
|
|
|
float_t easingOutQuart(const float_t t) {
|
|
float_t u = 1.0f - t;
|
|
return 1.0f - u * u * u * u;
|
|
}
|
|
|
|
float_t easingInOutQuart(const float_t t) {
|
|
if(t < 0.5f) return 8.0f * t * t * t * t;
|
|
float_t u = -2.0f * t + 2.0f;
|
|
return 1.0f - u * u * u * u * 0.5f;
|
|
}
|
|
|
|
float_t easingInBack(const float_t t) {
|
|
return EASING_C3 * t * t * t - EASING_C1 * t * t;
|
|
}
|
|
|
|
float_t easingOutBack(const float_t t) {
|
|
float_t u = t - 1.0f;
|
|
return 1.0f + EASING_C3 * u * u * u + EASING_C1 * u * u;
|
|
}
|
|
|
|
float_t easingInOutBack(const float_t t) {
|
|
if(t < 0.5f) {
|
|
float_t u = 2.0f * t;
|
|
return u * u * ((EASING_C2 + 1.0f) * u - EASING_C2) * 0.5f;
|
|
}
|
|
float_t u = 2.0f * t - 2.0f;
|
|
return (u * u * ((EASING_C2 + 1.0f) * u + EASING_C2) + 2.0f) * 0.5f;
|
|
}
|