#pragma once #include #include #include #include #include namespace frostbite2D { class Sprite : public Actor { public: Sprite(); explicit Sprite(Ptr texture); virtual ~Sprite(); static Ptr createFromFile(const std::string& path); static Ptr createFromMemory(const uint8* data, int width, int height, int channels); static Ptr createFromNpk(const std::string& imgPath, size_t frameIndex = 0); void Render() override; void SetTexture(Ptr texture); Ptr GetTexture() const { return texture_; } void SetShader(const std::string& shaderName); void SetDefaultShader(); const std::string& GetShaderName() const { return shaderName_; } bool HasCustomShader() const { return !shaderName_.empty(); } void SetSourceRect(const Rect& rect); const Rect& GetSourceRect() const { return srcRect_; } void SetColor(const Color& color); void SetColor(float r, float g, float b, float a = 1.0f); const Color& GetColor() const { return color_; } void SetFlippedX(bool flipped); void SetFlippedY(bool flipped); bool IsFlippedX() const { return flippedX_; } bool IsFlippedY() const { return flippedY_; } void SetBlendMode(BlendMode mode); BlendMode GetBlendMode() const { return blendMode_; } void SetSizeToTexture(); const Vec2& GetOffset() const { return offset_; } void SetOffset(const Vec2& offset); void SetOffset(float x, float y); protected: virtual void ConfigureShader(Shader* shader) const; void updateTransform(); Shader* getActiveShader() const; Quad createQuad() const; private: Ptr texture_; std::string shaderName_; Color color_ = Color(1.0f, 1.0f, 1.0f, 1.0f); Rect srcRect_; bool flippedX_ = false; bool flippedY_ = false; BlendMode blendMode_ = BlendMode::Normal; Vec2 offset_ = Vec2::Zero(); Transform2D transform_; static constexpr const char* DEFAULT_SHADER = "sprite"; }; }