| #include "rive/animation/interpolating_keyframe.hpp" | |
| #include "rive/animation/keyframe_interpolator.hpp" | |
| #include "rive/animation/linear_animation_instance.hpp" | |
| #include "rive/core_context.hpp" | |
| #include "rive/scripted/scripted_interpolator.hpp" | |
| using namespace rive; | |
| StatusCode InterpolatingKeyFrame::onAddedDirty(CoreContext* context) | |
| { | |
| if (interpolatorId() != -1) | |
| { | |
| auto coreObject = context->resolve(interpolatorId()); | |
| if (coreObject == nullptr || !coreObject->is<KeyFrameInterpolator>()) | |
| { | |
| return StatusCode::MissingObject; | |
| } | |
| m_interpolator = coreObject->as<KeyFrameInterpolator>(); | |
| } | |
| return StatusCode::Ok; | |
| } | |
| KeyFrameInterpolator* InterpolatingKeyFrame::effectiveInterpolator( | |
| const LinearAnimationInstance* context) const | |
| { | |
| KeyFrameInterpolator* shared = m_interpolator; | |
| if (shared == nullptr || context == nullptr || | |
| !shared->is<ScriptedInterpolator>()) | |
| { | |
| return shared; | |
| } | |
| auto* sharedSI = static_cast<const ScriptedInterpolator*>(shared); | |
| if (auto* stateful = context->statefulInterpolator(this, sharedSI)) | |
| { | |
| return stateful; | |
| } | |
| return shared; | |
| } |