diff options
author | rtk0c <[email protected]> | 2022-06-03 23:26:44 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-06-03 23:26:44 -0700 |
commit | 60ccc62f4934e44ad5b905fdbcf458302b8d8a09 (patch) | |
tree | 02ec83cc8387abfd08bd5ee7ea4e8115f1bfb8d0 /source/Game/Sprite.hpp | |
parent | c2ef7737536bf1f8c81fcfae95c0183b21c9753f (diff) |
Changeset: 63 [WIP] Rename directories
Diffstat (limited to 'source/Game/Sprite.hpp')
-rw-r--r-- | source/Game/Sprite.hpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/source/Game/Sprite.hpp b/source/Game/Sprite.hpp new file mode 100644 index 0000000..e163a01 --- /dev/null +++ b/source/Game/Sprite.hpp @@ -0,0 +1,111 @@ +#pragma once + +#include "Ires.hpp" +#include "PodVector.hpp" +#include "RcPtr.hpp" +#include "Renderer.hpp" +#include "Texture.hpp" + +#include <rapidjson/fwd.h> +#include <glm/glm.hpp> +#include <string> +#include <string_view> +#include <vector> + +class SpriteDefinition : 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<SpriteDefinition> 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; + + 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<SpriteDefinition> 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(IEditor& 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<SpriteDefinition> mSprites; +}; + +class Sprite { +private: + RcPtr<SpriteDefinition> 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); +}; |