| #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); | |
| } |