blob: 81e72def5965c067166ea2dbc09426d9f01e788a [file]
#ifndef _RIVE_LINEAR_ANIMATION_INSTANCE_EXTRAS_HPP_
#define _RIVE_LINEAR_ANIMATION_INSTANCE_EXTRAS_HPP_
// Implementation detail of LinearAnimationInstance. Only
// linear_animation_instance.cpp needs it, and linear_animation_instance.hpp
// forward declares LAIBindingExtras rather than including this, so the hash
// containers below stay out of the public surface.
//
// LinearAnimationInstance is embedded *by value* in AnimationStateInstance and,
// N times over, in a blend state's BlendStateAnimationInstance vector, so every
// inline byte is multiplied by the live state instances in a file. The members
// here are populated only when a file authors a scripted interpolator or a
// data-bound keyframe value. Before adding an inline member there, check
// whether it belongs in here instead.
#include <memory>
#include <unordered_map>
#include <vector>
namespace rive
{
class BindableProperty;
class DataBind;
class InterpolatingKeyFrame;
class KeyFrame;
class ScriptedInterpolator;
/// The cold cluster of LinearAnimationInstance. Allocated the first time this
/// instance vends a stateful scripted interpolator or a data-bound keyframe
/// value; never allocated otherwise.
///
/// Teardown of these four is order sensitive — see the comment in
/// ~LinearAnimationInstance, which does it explicitly rather than leaning on
/// declaration order.
struct LAIBindingExtras
{
/// Per-(this LAI, keyframe) stateful clones of the shared
/// ScriptedInterpolator templates. The unique_ptr destroys the clone (and
/// its Lua ref) with this cluster.
std::unordered_map<const InterpolatingKeyFrame*,
std::unique_ptr<ScriptedInterpolator>>
scriptedInterpolators;
/// Data binds that cloneProperties() appended to the artboard on our
/// behalf for the clones above. ~LinearAnimationInstance must
/// removeDataBind + delete each of these BEFORE `scriptedInterpolators`
/// tears down, because the bind targets point at CustomPropertys owned by
/// the clones.
std::vector<DataBind*> clonedArtboardDataBinds;
/// Per-keyframe holders receiving data-bound values for this instance,
/// keyed by the shared KeyFrame*. Built lazily by keyFrameValueHolder() on
/// first apply of a bound keyframe; owned here.
std::unordered_map<const KeyFrame*, BindableProperty*> keyFrameValueHolders;
/// Clones of the source keyframe data binds, retargeted to the holders
/// above and appended to the artboard's data-bind container, keyed by the
/// keyframe so keyFrameValueHolder can refresh a holder at read time.
/// Removed + deleted BEFORE the holders they target, same discipline as
/// `clonedArtboardDataBinds`.
std::unordered_map<const KeyFrame*, DataBind*> keyFrameValueBinds;
};
} // namespace rive
#endif