#ifndef ANIMATION_H #define ANIMATION_H #include "Model.h" #include // Время // Тип интерполяции 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 timestamps; // Временные метки !ОБЯЗАТЕЛЬНО ОТСОРТИРОВАНЫ ПО ВОЗРАСТАНИЮ! std::vector values; // Данные по параметру (ИНДЕКС СООТВЕТСТВУЕТ ВРЕМЕННЫМ МЕТКАМ) std::vector tangents; // Касательные для CUBICSPLINE }; // Класс анимации class Animation { public: void begin(); // Задает состояние анимации как начало через запоминание времени void end(); // Заканчивает выполнение анимации void process(); // Вычисляет анимацию для каждого канала на основании текущего времени bool isEnabled(); // Возвращает состояние анимации (вкл/выкл) std::vector channels; // Каналы анимации ANIM_ENDINGS endings = CYCLED; private: std::chrono::steady_clock::time_point begin_time; // Время начала анимации bool enabled = false; }; #endif // ANIMATION_H