Program Listing for File transform_animation_component.h

Return to documentation for file (rootex/framework/components/space/transform_animation_component.h)

#pragma once

#include "component.h"
#include "components/space/transform_component.h"

class TransformAnimationComponent : public Component
{
    COMPONENT(TransformAnimationComponent, Category::General);
    DEPENDS_ON(TransformComponent);

public:
    struct Keyframe
    {
        float timePosition;
        Matrix transform;
    };

    enum class TransitionType
    {
        SmashSmash = 0,
        EaseEase = 1,
        SmashEase = 2,
        EaseSmash = 3
    };

    enum class AnimationMode
    {
        None = 0,
        Looping = 1,
        Alternating = 2
    };

private:
    Vector<Keyframe> m_Keyframes;
    bool m_IsPlayOnStart;
    AnimationMode m_AnimationMode;
    TransitionType m_TransitionType;

    bool m_IsPlaying;
    float m_CurrentTimePosition;
    float m_TimeDirection;

    friend class TransformAnimationSystem;

public:
    TransformAnimationComponent(Entity& owner, const JSON::json& data);
    ~TransformAnimationComponent() = default;

    void pushKeyframe(const Keyframe& keyFrame);
    void popKeyframe(int count);
    bool isPlaying() const { return m_IsPlaying; }
    bool isPlayOnStart() const { return m_IsPlayOnStart; }
    bool hasEnded() const;
    float getStartTime() const;
    float getEndTime() const;
    void reset();

    void interpolate(float t);

    void setPlaying(bool enabled);

    bool setupData() override;
    JSON::json getJSON() const override;
    void draw() override;
};

DECLARE_COMPONENT(TransformAnimationComponent);