#pragma once #include "CommonVertexIndex.hpp" #include "Ires.hpp" #include "PodVector.hpp" #include "RcPtr.hpp" #include "Renderer.hpp" #include "Texture.hpp" #include "VertexIndex.hpp" #include #include #include #include #include class SpriteDefinition : public RefCounted { friend class IresSpriteFiles; friend class IresSpritesheet; private: RcPtr mAtlas; glm::ivec2 mBoundingBox; std::vector mFrames; public: bool IsValid() const; Texture* GetAtlas() const { return mAtlas.Get(); } glm::ivec2 GetBoundingBox() const { return mBoundingBox; } const decltype(mFrames)& GetFrames() const { return mFrames; } }; class IresSpriteFiles : public IresObject { public: RcPtr mInstance; std::vector spriteFiles; public: IresSpriteFiles() : IresObject(KD_SpriteFiles) {} // NOTE: does not check whether all specified files have the same dimensions bool IsValid() const; SpriteDefinition* CreateInstance() const; SpriteDefinition* GetInstance(); void InvalidateInstance(); void Write(IresWritingContext& ctx, rapidjson::Value& value, rapidjson::Document& root) const override; void Read(IresLoadingContext& ctx, const rapidjson::Value& value) override; }; class IresSpritesheet : public IresObject { public: RcPtr mInstance; std::string spritesheetFile; int sheetWSplit = 1; int sheetHSplit = 1; int frameCountOverride = 0; public: IresSpritesheet() : IresObject(KD_Spritesheet) {} bool IsValid() const; static void ResplitSpritesheet(SpriteDefinition* sprite, const IresSpritesheet* conf); static void ResplitSpritesheet(SpriteDefinition* sprite, int wSplit, int hSplit, int frameCountOverride = -1); SpriteDefinition* CreateInstance() const; SpriteDefinition* GetInstance(); void InvalidateInstance(); bool IsFrameCountOverriden() const; int GetFrameCount() const; void ShowEditor(EditorInstance& editor) override; void Write(IresWritingContext& ctx, rapidjson::Value& value, rapidjson::Document& root) const override; void Read(IresLoadingContext& ctx, const rapidjson::Value& value) override; }; // TODO class SpriteCollection { private: std::vector mSprites; }; class Sprite { private: RcPtr mDefinition; int mCurrentFrame = 0; int mTimeElapsed = 0; // # of frames per second int mPlaybackSpeed = 5; public: Sprite(); bool IsValid() const; SpriteDefinition* GetDefinition() const { return mDefinition.Get(); } void SetDefinition(SpriteDefinition* definition); int GetFrame() const; const Subregion& GetFrameSubregion() const; void SetFrame(int frame); // Update as if a render frame has passed void PlayFrame(); int GetPlaybackSpeed() const; void SetPlaybackSpeed(int speed); };