1
0

finish chicken nugget anime loader

This commit is contained in:
2026-01-09 16:49:06 +08:00
parent 06bfe69c0e
commit ff34754274
3 changed files with 26 additions and 26 deletions

View File

@@ -6,33 +6,26 @@ namespace basalt::shared::anime_loader {
#pragma region Anime Loader
IAnimeLoader::IAnimeLoader() : status(AnimeLoaderStatus::Ready), time(0), last_index(0) {}
IAnimeLoader::IAnimeLoader() : status(AnimeLoaderStatus::Ready), time(0) {}
IAnimeLoader::~IAnimeLoader() {}
void IAnimeLoader::load() {
void IAnimeLoader::load(AnimeLoaderConfig&& config) {
if (this->status != AnimeLoaderStatus::Ready) throw std::runtime_error("unexpected anime loader status");
// load by user
internal_load();
// check empty
if (this->frames.empty()) throw std::runtime_error("no anime key frames.");
// Get last frame index
auto last_pair = this->frames.end();
--last_pair;
this->last_index = last_pair->first;
// change status
this->config = std::move(config);
this->status = AnimeLoaderStatus::Loaded;
}
KeyFrameSpan IAnimeLoader::tick() {
if (this->status != AnimeLoaderStatus::Loaded) throw std::runtime_error("unexpected anime loader status");
// Get last frame index
auto last_pair = this->frames.end();
--last_pair;
auto last_index = last_pair->first;
// Accumulate time
++this->time;
if (this->time > this->last_index) {
if (this->time > last_index) {
this->time = 0;
}
@@ -61,10 +54,6 @@ namespace basalt::shared::anime_loader {
};
}
void IAnimeLoader::internal_load() {
throw std::logic_error("unimplemented function");
}
#pragma endregion
} // namespace basalt::shared::anime_loader

View File

@@ -28,6 +28,10 @@ namespace basalt::shared::anime_loader {
math::Quaternion next_rotation; ///< 后一帧的摄像机旋转。
};
struct AnimeLoaderConfig {
};
enum class AnimeLoaderStatus {
Ready,
Loaded,
@@ -45,15 +49,19 @@ namespace basalt::shared::anime_loader {
virtual ~IAnimeLoader();
public:
void load();
/**
* @brief
* @remarks
* \li 重写时只允许往frames里插入数据。
* \li 重写时务必保证frames里插入的数据大于2个且初始节点的Key总是0。动画帧个数必须大于4。
*/
virtual void load(AnimeLoaderConfig&& config);
KeyFrameSpan tick();
protected:
virtual void internal_load();
protected:
AnimeLoaderStatus status;
math::Index time, last_index;
AnimeLoaderConfig config;
math::Index time;
std::map<math::Index, KeyFrame> frames;
};