1 #include "animation/keyed_property.hpp"
2 #include "animation/keyframe.hpp"
6 KeyedProperty::~KeyedProperty()
8 for (auto keyframe : m_KeyFrames)
14 void KeyedProperty::addKeyFrame(KeyFrame* keyframe)
16 m_KeyFrames.push_back(keyframe);
19 void KeyedProperty::apply(Core* object, float seconds, float mix)
21 assert(!m_KeyFrames.empty());
25 float closestSeconds = 0.0f;
27 auto numKeyFrames = m_KeyFrames.size();
28 int end = (int)numKeyFrames - 1;
31 mid = (start + end) >> 1;
32 closestSeconds = m_KeyFrames[mid]->seconds();
33 if (closestSeconds < seconds)
37 else if (closestSeconds > seconds)
48 int pk = propertyKey();
51 m_KeyFrames[0]->apply(object, pk, mix);
55 if (idx < numKeyFrames)
57 KeyFrame* fromFrame = m_KeyFrames[idx - 1];
58 KeyFrame* toFrame = m_KeyFrames[idx];
59 if (seconds == toFrame->seconds())
61 toFrame->apply(object, pk, mix);
65 if (fromFrame->interpolationType() == 0)
67 fromFrame->apply(object, pk, mix);
71 fromFrame->applyInterpolation(
72 object, pk, seconds, toFrame, mix);
78 m_KeyFrames[idx - 1]->apply(object, pk, mix);
83 StatusCode KeyedProperty::onAddedDirty(CoreContext* context)
86 for (auto keyframe : m_KeyFrames)
88 if ((code = keyframe->onAddedDirty(context)) != StatusCode::Ok)
93 return StatusCode::Ok;
96 StatusCode KeyedProperty::onAddedClean(CoreContext* context)
99 for (auto keyframe : m_KeyFrames)
101 if ((code = keyframe->onAddedClean(context)) != StatusCode::Ok)
106 return StatusCode::Ok;