20/include/Animation.h

75 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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