145 lines
4.6 KiB
C++
145 lines
4.6 KiB
C++
// This file is part of VSTGUI. It is subject to the license terms
|
|
// in the LICENSE file found in the top-level directory of this
|
|
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE
|
|
|
|
#pragma once
|
|
|
|
#include "animator.h"
|
|
#include "itimingfunction.h"
|
|
#include "../cpoint.h"
|
|
#include <map>
|
|
|
|
namespace VSTGUI {
|
|
namespace Animation {
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_0
|
|
//-----------------------------------------------------------------------------
|
|
class TimingFunctionBase : public ITimingFunction
|
|
{
|
|
public:
|
|
explicit TimingFunctionBase (uint32_t length) : length (length) {}
|
|
TimingFunctionBase (const TimingFunctionBase&) = default;
|
|
TimingFunctionBase& operator= (const TimingFunctionBase&) = default;
|
|
|
|
uint32_t getLength () const { return length; }
|
|
bool isDone (uint32_t milliseconds) override { return milliseconds >= length; }
|
|
|
|
protected:
|
|
uint32_t length; // in milliseconds
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_0
|
|
//-----------------------------------------------------------------------------
|
|
class LinearTimingFunction : public TimingFunctionBase
|
|
{
|
|
public:
|
|
explicit LinearTimingFunction (uint32_t length);
|
|
LinearTimingFunction (const LinearTimingFunction&) = default;
|
|
LinearTimingFunction& operator= (const LinearTimingFunction&) = default;
|
|
|
|
float getPosition (uint32_t milliseconds) override;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_0
|
|
//-----------------------------------------------------------------------------
|
|
class PowerTimingFunction : public TimingFunctionBase
|
|
{
|
|
public:
|
|
PowerTimingFunction (uint32_t length, float factor);
|
|
PowerTimingFunction (const PowerTimingFunction&) = default;
|
|
PowerTimingFunction& operator= (const PowerTimingFunction&) = default;
|
|
|
|
float getPosition (uint32_t milliseconds) override;
|
|
|
|
protected:
|
|
float factor;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_0
|
|
//-----------------------------------------------------------------------------
|
|
class InterpolationTimingFunction : public TimingFunctionBase
|
|
{
|
|
public:
|
|
InterpolationTimingFunction (uint32_t length, float startPos = 0.f, float endPos = 1.f);
|
|
InterpolationTimingFunction (const InterpolationTimingFunction&) = default;
|
|
InterpolationTimingFunction& operator= (const InterpolationTimingFunction&) = default;
|
|
|
|
/** both values are normalized ones */
|
|
void addPoint (float time, float pos);
|
|
|
|
float getPosition (uint32_t milliseconds) override;
|
|
|
|
protected:
|
|
|
|
using PointMap = std::map<uint32_t, float>;
|
|
PointMap points;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_7
|
|
//-----------------------------------------------------------------------------
|
|
class CubicBezierTimingFunction : public TimingFunctionBase
|
|
{
|
|
public:
|
|
CubicBezierTimingFunction (uint32_t milliseconds, CPoint p1, CPoint p2);
|
|
CubicBezierTimingFunction (const CubicBezierTimingFunction&) = default;
|
|
CubicBezierTimingFunction (CubicBezierTimingFunction&&) = default;
|
|
CubicBezierTimingFunction& operator= (const CubicBezierTimingFunction&) = default;
|
|
CubicBezierTimingFunction& operator= (CubicBezierTimingFunction&&) = default;
|
|
|
|
float getPosition (uint32_t milliseconds) override;
|
|
|
|
// some common timings
|
|
static CubicBezierTimingFunction easy (uint32_t time);
|
|
static CubicBezierTimingFunction easyIn (uint32_t time);
|
|
static CubicBezierTimingFunction easyOut (uint32_t time);
|
|
static CubicBezierTimingFunction easyInOut (uint32_t time);
|
|
|
|
enum Style
|
|
{
|
|
Easy,
|
|
EasyIn,
|
|
EasyOut,
|
|
EasyInOut
|
|
};
|
|
static CubicBezierTimingFunction* make (Style style, uint32_t time);
|
|
|
|
private:
|
|
static CPoint lerp (CPoint p1, CPoint p2, float pos);
|
|
|
|
CPoint p1;
|
|
CPoint p2;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// @ingroup AnimationTimingFunctions
|
|
/// @ingroup new_in_4_0
|
|
//-----------------------------------------------------------------------------
|
|
class RepeatTimingFunction : public ITimingFunction
|
|
{
|
|
public:
|
|
RepeatTimingFunction (TimingFunctionBase* tf, int32_t repeatCount, bool autoReverse = true);
|
|
~RepeatTimingFunction () noexcept override;
|
|
|
|
float getPosition (uint32_t milliseconds) override;
|
|
bool isDone (uint32_t milliseconds) override;
|
|
protected:
|
|
TimingFunctionBase* tf;
|
|
int32_t repeatCount;
|
|
uint32_t runCounter;
|
|
bool autoReverse;
|
|
bool isReverse;
|
|
};
|
|
|
|
} // Animation
|
|
} // VSTGUI
|