20/include/Animation.h

75 lines
2.3 KiB
C
Raw Normal View History

#ifndef ANIMATION_H
#define ANIMATION_H
#include "Model.h"
#include <chrono> // Время
// Тип интерполяции
enum INTERPOLIATION_TYPE
{
STEP,
LINEAR,
CUBICSPLINE
};
// Анимируемый параметр
enum TARGET_PATH
{
POSITION,
ROTATION,
SCALE
};
// Поведение при завершении шкалы ключевых кадров
enum ANIM_ENDINGS
{
STOP,
TO_BEGIN,
CYCLED
};
union PARAMETER_TYPE
{
glm::quat quat;
glm::vec3 vec3;
};
// Касательные для кубической-сплайн интерполяции
struct Tangents
{
PARAMETER_TYPE in;
PARAMETER_TYPE out;
};
// Канал анимации
struct Channel
{
void process(float dtime, ANIM_ENDINGS endings); // Выполнить анимацию для канала с учетом времени относительно начала
class Node* target = NULL; // Анимируемый узел
TARGET_PATH path = POSITION; // Анимируемый параметр
INTERPOLIATION_TYPE interpolation = STEP; // Тип интерполяции
std::vector<float> timestamps; // Временные метки !ОБЯЗАТЕЛЬНО ОТСОРТИРОВАНЫ ПО ВОЗРАСТАНИЮ!
std::vector<PARAMETER_TYPE> values; // Данные по параметру (ИНДЕКС СООТВЕТСТВУЕТ ВРЕМЕННЫМ МЕТКАМ)
std::vector<Tangents> tangents; // Касательные для CUBICSPLINE
};
// Класс анимации
class Animation
{
public:
void begin(); // Задает состояние анимации как начало через запоминание времени
void end(); // Заканчивает выполнение анимации
void process(); // Вычисляет анимацию для каждого канала на основании текущего времени
bool isEnabled(); // Возвращает состояние анимации (вкл/выкл)
std::vector<Channel> channels; // Каналы анимации
ANIM_ENDINGS endings = CYCLED;
private:
std::chrono::steady_clock::time_point begin_time; // Время начала анимации
bool enabled = false;
};
#endif // ANIMATION_H