diff options
author | rtk0c <[email protected]> | 2022-04-17 20:08:57 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-04-17 20:08:57 -0700 |
commit | 5424a1d5434e3ddd911a504719918c2df027e2fd (patch) | |
tree | 6275aab13140d81dcc46c8290e73ac9a8bbb5605 /source/Sprite.hpp | |
parent | afcac59c7d04f4337d6b04ebed8cac7e871ccc50 (diff) |
Changeset: 8 Initial work on sprites and texture system
Diffstat (limited to 'source/Sprite.hpp')
-rw-r--r-- | source/Sprite.hpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/source/Sprite.hpp b/source/Sprite.hpp new file mode 100644 index 0000000..ec25fbd --- /dev/null +++ b/source/Sprite.hpp @@ -0,0 +1,98 @@ +#pragma once + +#include "CpuMesh.hpp" +#include "Ires.hpp" +#include "Mesh.hpp" +#include "PodVector.hpp" +#include "RcPtr.hpp" +#include "Texture.hpp" + +#include <rapidjson/fwd.h> +#include <glm/glm.hpp> +#include <string> +#include <string_view> +#include <vector> + +class Sprite : public RefCounted { + friend class IresSpriteFiles; + friend class IresSpritesheet; + +private: + RcPtr<Texture> mAtlas; + glm::ivec2 mBoundingBox; + std::vector<Subregion> 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<Sprite> mInstance; + std::vector<std::string> 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<Sprite> 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<GpuMesh> mMesh; + RcPtr<Sprite> mSprite; + PodVector<StandardVertex> mVertices; + PodVector<uint16_t> 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); +}; |