75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
#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
|