Line data Source code
1 : #include "core/animations/AnimationData.hpp"
2 :
3 : #include "core/utility/Getline.hpp"
4 :
5 : #include "spdlog/spdlog.h"
6 :
7 : #include <algorithm>
8 : #include <ranges>
9 : #include <string_view>
10 : #include <array>
11 :
12 : namespace Soldank
13 : {
14 0 : void AnimationDataManager::LoadAnimationData(AnimationType animation_type,
15 : const std::string& file_path,
16 : bool looped,
17 : int speed,
18 : const IFileReader& file_reader)
19 : {
20 0 : spdlog::info("LoadAnimationData");
21 :
22 0 : auto file_data = file_reader.Read(file_path);
23 0 : if (!file_data.has_value()) {
24 0 : spdlog::critical("Animation file not found {}", file_path);
25 0 : std::string message = "Could not open file: " + file_path;
26 0 : throw std::runtime_error(message.c_str());
27 0 : }
28 0 : std::stringstream data_buffer{ *file_data };
29 0 : spdlog::info("Animation: {}", file_path);
30 :
31 0 : std::string line;
32 0 : std::vector<glm::vec2> positions;
33 0 : std::vector<AnimationFrame> frames;
34 :
35 0 : GetlineSafe(data_buffer, line);
36 0 : while (!data_buffer.eof() && (line != "ENDFILE")) {
37 0 : if (line == "NEXTFRAME") {
38 0 : frames.push_back({ positions });
39 0 : positions.clear();
40 : } else {
41 0 : unsigned int point = std::stoul(line);
42 0 : if (point != positions.size() + 1) {
43 0 : spdlog::error("Error in Animation loading: {} != {}", point, positions.size() + 1);
44 : }
45 :
46 0 : GetlineSafe(data_buffer, line);
47 0 : float x = std::stof(line);
48 0 : GetlineSafe(data_buffer, line); // y is not used for some reason
49 0 : GetlineSafe(data_buffer, line);
50 0 : float z = std::stof(line);
51 :
52 0 : positions.emplace_back(-3.0F * x / 1.1F, -3.0 * z);
53 : }
54 :
55 0 : GetlineSafe(data_buffer, line);
56 : }
57 :
58 0 : frames.push_back({ positions });
59 :
60 0 : animation_datas_.push_back(
61 0 : std::make_shared<AnimationData>(animation_type, looped, speed, frames));
62 0 : }
63 :
64 0 : void AnimationDataManager::LoadAllAnimationDatas(const IFileReader& file_reader)
65 : {
66 0 : const auto get_file_path = [](std::string_view file_name) {
67 0 : return std::string{ ANIMATION_BASE_DIRECTORY_PATH } + std::string{ file_name };
68 : };
69 : // clang-format off
70 0 : LoadAnimationData(AnimationType::Stand, get_file_path(ANIMATION_STAND_FILE), true, 3, file_reader);
71 0 : LoadAnimationData(AnimationType::Run, get_file_path(ANIMATION_RUN_FILE), true, 1, file_reader);
72 0 : LoadAnimationData(AnimationType::RunBack, get_file_path(ANIMATION_RUN_BACK_FILE), true, 1, file_reader);
73 0 : LoadAnimationData(AnimationType::Jump, get_file_path(ANIMATION_JUMP_FILE), false, 1, file_reader);
74 0 : LoadAnimationData(AnimationType::JumpSide, get_file_path(ANIMATION_JUMP_SIDE_FILE), false, 1, file_reader);
75 0 : LoadAnimationData(AnimationType::Fall, get_file_path(ANIMATION_FALL_FILE), false, 1, file_reader);
76 0 : LoadAnimationData(AnimationType::Crouch, get_file_path(ANIMATION_CROUCH_FILE), false, 1, file_reader);
77 0 : LoadAnimationData(AnimationType::CrouchRun, get_file_path(ANIMATION_CROUCH_RUN_FILE), true, 2, file_reader);
78 0 : LoadAnimationData(AnimationType::Reload, get_file_path(ANIMATION_RELOAD_FILE), false, 2, file_reader);
79 0 : LoadAnimationData(AnimationType::Throw, get_file_path(ANIMATION_THROW_FILE), false, 1, file_reader);
80 0 : LoadAnimationData(AnimationType::Recoil, get_file_path(ANIMATION_RECOIL_FILE), false, 1, file_reader);
81 0 : LoadAnimationData(AnimationType::SmallRecoil, get_file_path(ANIMATION_SMALL_RECOIL_FILE), false, 1, file_reader);
82 0 : LoadAnimationData(AnimationType::Shotgun, get_file_path(ANIMATION_SHOTGUN_FILE), false, 1, file_reader);
83 0 : LoadAnimationData(AnimationType::ClipOut, get_file_path(ANIMATION_CLIP_OUT_FILE), false, 3, file_reader);
84 0 : LoadAnimationData(AnimationType::ClipIn, get_file_path(ANIMATION_CLIP_IN_FILE), false, 3, file_reader);
85 0 : LoadAnimationData(AnimationType::SlideBack, get_file_path(ANIMATION_SLIDE_BACK_FILE), false, 2, file_reader);
86 0 : LoadAnimationData(AnimationType::Change, get_file_path(ANIMATION_CHANGE_FILE), false, 1, file_reader);
87 0 : LoadAnimationData(AnimationType::ThrowWeapon, get_file_path(ANIMATION_THROW_WEAPON_FILE), false, 1, file_reader);
88 0 : LoadAnimationData(AnimationType::WeaponNone, get_file_path(ANIMATION_WEAPON_NONE_FILE), false, 3, file_reader);
89 0 : LoadAnimationData(AnimationType::Punch, get_file_path(ANIMATION_PUNCH_FILE), false, 1, file_reader);
90 0 : LoadAnimationData(AnimationType::ReloadBow, get_file_path(ANIMATION_RELOAD_BOW_FILE), false, 1, file_reader);
91 0 : LoadAnimationData(AnimationType::Barret, get_file_path(ANIMATION_BARRET_FILE), false, 9, file_reader);
92 0 : LoadAnimationData(AnimationType::Roll, get_file_path(ANIMATION_ROLL_FILE), false, 1, file_reader);
93 0 : LoadAnimationData(AnimationType::RollBack, get_file_path(ANIMATION_ROLL_BACK_FILE), false, 1, file_reader);
94 0 : LoadAnimationData(AnimationType::CrouchRunBack, get_file_path(ANIMATION_CROUCH_RUN_BACK_FILE), true, 2, file_reader);
95 0 : LoadAnimationData(AnimationType::Cigar, get_file_path(ANIMATION_CIGAR_FILE), false, 3, file_reader);
96 0 : LoadAnimationData(AnimationType::Match, get_file_path(ANIMATION_MATCH_FILE), false, 3, file_reader);
97 0 : LoadAnimationData(AnimationType::Smoke, get_file_path(ANIMATION_SMOKE_FILE), false, 4, file_reader);
98 0 : LoadAnimationData(AnimationType::Wipe, get_file_path(ANIMATION_WIPE_FILE), false, 4, file_reader);
99 0 : LoadAnimationData(AnimationType::Groin, get_file_path(ANIMATION_GROIN_FILE), false, 2, file_reader);
100 0 : LoadAnimationData(AnimationType::Piss, get_file_path(ANIMATION_PISS_FILE), false, 8, file_reader);
101 0 : LoadAnimationData(AnimationType::Mercy, get_file_path(ANIMATION_MERCY_FILE), false, 3, file_reader);
102 0 : LoadAnimationData(AnimationType::Mercy2, get_file_path(ANIMATION_MERCY2_FILE), false, 3, file_reader);
103 0 : LoadAnimationData(AnimationType::TakeOff, get_file_path(ANIMATION_TAKE_OFF_FILE), false, 2, file_reader);
104 0 : LoadAnimationData(AnimationType::Prone, get_file_path(ANIMATION_PRONE_FILE), false, 1, file_reader);
105 0 : LoadAnimationData(AnimationType::Victory, get_file_path(ANIMATION_VICTORY_FILE), false, 3, file_reader);
106 0 : LoadAnimationData(AnimationType::Aim, get_file_path(ANIMATION_AIM_FILE), false, 2, file_reader);
107 0 : LoadAnimationData(AnimationType::HandsUpAim, get_file_path(ANIMATION_HANDS_UP_AIM_FILE), false, 2, file_reader);
108 0 : LoadAnimationData(AnimationType::ProneMove, get_file_path(ANIMATION_PRONE_MOVE_FILE), true, 2, file_reader);
109 0 : LoadAnimationData(AnimationType::GetUp, get_file_path(ANIMATION_GET_UP_FILE), false, 1, file_reader);
110 0 : LoadAnimationData(AnimationType::AimRecoil, get_file_path(ANIMATION_AIM_RECOIL_FILE), false, 1, file_reader);
111 0 : LoadAnimationData(AnimationType::HandsUpRecoil, get_file_path(ANIMATION_HANDS_UP_RECOIL_FILE), false, 1, file_reader);
112 0 : LoadAnimationData(AnimationType::Melee, get_file_path(ANIMATION_MELEE_FILE), false, 1, file_reader);
113 0 : LoadAnimationData(AnimationType::Own, get_file_path(ANIMATION_OWN_FILE), false, 3, file_reader);
114 : // clang-format on
115 0 : }
116 :
117 0 : std::shared_ptr<const AnimationData> AnimationDataManager::Get(AnimationType animation_type) const
118 : {
119 0 : for (const auto& animation_data : animation_datas_) {
120 0 : if (animation_data->GetAnimationType() == animation_type) {
121 0 : return animation_data;
122 : }
123 : }
124 :
125 : // TODO: error handling
126 : std::unreachable();
127 : }
128 : } // namespace Soldank
|