From 5424a1d5434e3ddd911a504719918c2df027e2fd Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 17 Apr 2022 20:08:57 -0700 Subject: Changeset: 8 Initial work on sprites and texture system --- source/Sprite.hpp | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 source/Sprite.hpp (limited to 'source/Sprite.hpp') 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 +#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); +}; -- cgit v1.2.3-70-g09d2