#pragma once #include "CpuMesh.hpp" #include "Ires.hpp" #include "Mesh.hpp" #include "PodVector.hpp" #include "RcPtr.hpp" #include "Texture.hpp" #include #include #include #include #include class Sprite : 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; Sprite* CreateInstance() const; Sprite* GetInstance(); void InvalidateInstance(); void Write(rapidjson::Value& value, rapidjson::Document& root) const override; void Read(const rapidjson::Value& value) override; }; class IresSpritesheet : public IresObject { public: RcPtr mInstance; std::string spritesheetFile; int sheetWSplit; int sheetHSplit; public: IresSpritesheet() : IresObject(KD_Spritesheet) {} bool IsValid() const; static void ResplitSpritesheet(Sprite* sprite, int wSplit, int hSplit); Sprite* CreateInstance() const; Sprite* GetInstance(); void InvalidateInstance(); void Write(rapidjson::Value& value, rapidjson::Document& root) const override; void Read(const rapidjson::Value& value) override; }; class SpriteMesh { private: RcPtr mMesh; RcPtr mSprite; PodVector mVertices; PodVector mIndices; int mCurrentFrame = 0; // # of frames per second int mPlaybackSpeed = 5; public: SpriteMesh(Sprite* sprite); Sprite* GetSprite() const { return mSprite.Get(); } GpuMesh* GetGpuMesh() const { return mMesh.Get(); } int GetFrame() const { return mCurrentFrame; } void SetFrame(int frame); // Update as if a render frame has passed void PlayFrame(); int GetPlaybackSpeed() const { return mPlaybackSpeed; } void SetPlaybackSpeed(int speed); };