From 297232d21594b138bb368a42b5b0d085ff9ed6aa Mon Sep 17 00:00:00 2001 From: rtk0c Date: Thu, 19 Oct 2023 22:50:07 -0700 Subject: The great renaming: switch to "module style" --- src/brussel.engine/Sprite.hpp | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/brussel.engine/Sprite.hpp (limited to 'src/brussel.engine/Sprite.hpp') diff --git a/src/brussel.engine/Sprite.hpp b/src/brussel.engine/Sprite.hpp new file mode 100644 index 0000000..e163a01 --- /dev/null +++ b/src/brussel.engine/Sprite.hpp @@ -0,0 +1,111 @@ +#pragma once + +#include "Ires.hpp" +#include "PodVector.hpp" +#include "RcPtr.hpp" +#include "Renderer.hpp" +#include "Texture.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(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 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); +}; -- cgit v1.2.3-70-g09d2