blob: 1fcc2e16bd2cbca8e6961f567798801fb0450288 [file] [log] [blame]
#include "rive/animation/keyframe_double.hpp"
#include "rive/generated/core_registry.hpp"
using namespace rive;
// This whole class is intentionally misnamed to match our editor code. The
// editor uses doubles (float64) for numeric values but at runtime 32 bit
// floating point numbers suffice. So even though this is a "double keyframe" to
// match editor names, the actual values are stored and applied in 32 bits.
static void applyDouble(Core* object, int propertyKey, float mix, float value)
{
if (mix == 1.0f)
{
CoreRegistry::setDouble(object, propertyKey, value);
}
else
{
float mixi = 1.0 - mix;
CoreRegistry::setDouble(
object,
propertyKey,
CoreRegistry::getDouble(object, propertyKey) * mixi + value * mix);
}
}
void KeyFrameDouble::apply(Core* object, int propertyKey, float mix)
{
applyDouble(object, propertyKey, mix, value());
}
void KeyFrameDouble::applyInterpolation(Core* object,
int propertyKey,
float currentTime,
const KeyFrame* nextFrame,
float mix)
{
auto kfd = nextFrame->as<KeyFrameDouble>();
const KeyFrameDouble& nextDouble = *kfd;
float f = (currentTime - seconds()) / (nextDouble.seconds() - seconds());
if (CubicInterpolator* cubic = interpolator())
{
f = cubic->transform(f);
}
applyDouble(
object, propertyKey, mix, value() + (nextDouble.value() - value()) * f);
}