CanadianMachines / CanadianExperienceLib / AnimChannelAngle.h
AnimChannelAngle.h
Raw
/**
 * @file AnimChannelAngle.h
 * @author Charles Owen
 *
 * Animation channel for angles
 */

#ifndef CANADIANEXPERIENCE_ANIMCHANNELANGLE_H
#define CANADIANEXPERIENCE_ANIMCHANNELANGLE_H

#include "AnimChannel.h"

/**
 * Animation channel for angles
 */
class AnimChannelAngle : public AnimChannel {
private:
    double mAngle = 0;  ///< The computed animation angle

protected:
    /// A keyframe for an angle channel
    class KeyframeAngle : public Keyframe
    {
    public:
        /**
         * Constructor
         * @param channel The channel we are for
         * @param angle The angle for the keyframe
         */
        KeyframeAngle(AnimChannelAngle *channel, double angle) :
            Keyframe(channel), mChannel(channel), mAngle(angle) {}

        /** Default constructor disabled */
        KeyframeAngle() = delete;
        /** Copy constructor disabled */
        KeyframeAngle(const KeyframeAngle &) = delete;
        /** Assignment operator disabled */
        void operator=(const KeyframeAngle &) = delete;

        /**
         * Get the angle at this keyframe
         * @return Angle in radians
         */
        double GetAngle() { return mAngle; }

        /// Use this keyframe as keyframe 1
        void UseAs1() override { mChannel->mKeyframe1 = this; }

        /// Use this keyframe as keyfraem 2
        void UseAs2() override { mChannel->mKeyframe2 = this; }

        /// Use this keyframe as the angle
        void UseOnly() override { mChannel->mAngle = mAngle; }

    private:
        double mAngle;  ///< The angle for this keyframe

        /// The channel this keyframe is associated with
        AnimChannelAngle *mChannel;

        wxXmlNode* XmlSave(wxXmlNode* node) override;
    };

protected:
    void XmlLoadKeyframe(wxXmlNode* node) override;

    /// The first angle keyframe
    KeyframeAngle *mKeyframe1 = nullptr;

    /// The second angle keyframe
    KeyframeAngle *mKeyframe2 = nullptr;

public:
    AnimChannelAngle() {}

    /**
     * Get the current time angle
     * @return Angle in radians
     */
    double GetAngle() { return mAngle; }

    void SetKeyframe(double angle);
    void Tween(double t) override;
};

#endif //CANADIANEXPERIENCE_ANIMCHANNELANGLE_H