#pragma once #include #include #include #include "anm2_type.hpp" #include "types.hpp" namespace anm2ed::anm2 { constexpr auto FRAME_DURATION_MIN = 1; constexpr auto FRAME_DURATION_MAX = 1000000; class Frame { public: bool isVisible{true}; bool isInterpolated{false}; float rotation{}; int duration{FRAME_DURATION_MIN}; int atFrame{-1}; int eventID{-1}; int regionID{-1}; std::vector soundIDs{}; glm::vec2 pivot{}; glm::vec2 crop{}; glm::vec2 position{}; glm::vec2 size{}; glm::vec2 scale{100, 100}; glm::vec3 colorOffset{}; glm::vec4 tint{types::color::WHITE}; Frame() = default; Frame(tinyxml2::XMLElement*, Type); tinyxml2::XMLElement* to_element(tinyxml2::XMLDocument&, Type, Flags = 0); std::string to_string(Type type, Flags = 0); void serialize(tinyxml2::XMLDocument&, tinyxml2::XMLElement*, Type, Flags = 0); void shorten(); void extend(); }; struct FrameChange { std::optional isVisible{}; std::optional isInterpolated{}; std::optional rotation{}; std::optional duration{}; std::optional regionID{}; std::optional pivotX{}; std::optional pivotY{}; std::optional cropX{}; std::optional cropY{}; std::optional positionX{}; std::optional positionY{}; std::optional sizeX{}; std::optional sizeY{}; std::optional scaleX{}; std::optional scaleY{}; std::optional colorOffsetR{}; std::optional colorOffsetG{}; std::optional colorOffsetB{}; std::optional tintR{}; std::optional tintG{}; std::optional tintB{}; std::optional tintA{}; std::optional isFlipX{}; std::optional isFlipY{}; }; }