#pragma once #include #include #include #include #include #include #include #include #include "../audio.hpp" #include "../texture.hpp" #include "../../util/physfs.hpp" namespace game::resource::xml { class Anm2 { public: enum Type { NONE, ROOT, LAYER, NULL_, TRIGGER }; enum Flag { NO_SPRITESHEETS = (1 << 0), NO_SOUNDS = (1 << 1), DEFAULT_ANIMATION_ONLY = (1 << 2) }; using Flags = int; struct Spritesheet { struct Region { enum Origin { TOP_LEFT, CENTER, CUSTOM }; std::string name{}; glm::vec2 crop{}; glm::vec2 pivot{}; glm::vec2 size{}; Origin origin{CUSTOM}; }; std::string path{}; resource::Texture texture{}; std::map regions{}; std::vector regionOrder{}; }; struct Sound { std::string path{}; resource::Audio audio{}; }; struct Layer { std::string name{"New Layer"}; int spritesheetID{-1}; }; struct Null { std::string name{"New Null"}; bool isShowRect{}; }; struct Event { std::string name{"New Event"}; }; struct Frame { glm::vec2 crop{}; glm::vec2 position{}; glm::vec2 pivot{}; glm::vec2 size{}; glm::vec2 scale{100, 100}; float rotation{}; int duration{}; glm::vec4 tint{1.0f, 1.0f, 1.0f, 1.0f}; glm::vec3 colorOffset{}; bool isInterpolated{}; int eventID{-1}; int regionID{-1}; std::vector soundIDs{}; int atFrame{-1}; bool isVisible{true}; }; struct FrameOptional { std::optional crop{}; std::optional position{}; std::optional pivot{}; std::optional size{}; std::optional scale{}; std::optional rotation{}; std::optional tint{}; std::optional colorOffset{}; std::optional isInterpolated{}; std::optional isVisible{}; }; struct Item { std::vector frames{}; bool isVisible{}; }; struct Animation { std::string name{"New Animation"}; int frameNum{}; bool isLoop{}; Item rootAnimation{}; std::unordered_map layerAnimations{}; std::vector layerOrder{}; std::map nullAnimations{}; Item triggers{}; }; int fps{30}; std::map spritesheets{}; std::map layers{}; std::map nulls{}; std::map events{}; std::map sounds{}; std::unordered_map layerMap{}; std::unordered_map nullMap{}; std::unordered_map eventMap{}; std::string defaultAnimation{}; int defaultAnimationID{-1}; std::vector animations{}; std::unordered_map animationMap{}; std::unordered_map animationMapReverse{}; std::string path{}; bool isValid{}; Flags flags{}; Anm2() = default; Anm2(const Anm2&); Anm2(Anm2&&); Anm2& operator=(const Anm2&); Anm2& operator=(Anm2&&); Anm2(const std::filesystem::path&, Flags = 0); Anm2(const util::physfs::Path&, Flags = 0); bool is_valid() const; private: void init(tinyxml2::XMLDocument& document, Flags anm2Flags, const util::physfs::Path& archive = {}); }; }