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
|