JNGL
Easy to use cross-platform 2D game library
Loading...
Searching...
No Matches
sprite.hpp
Go to the documentation of this file.
1// Copyright 2012-2024 Jan Niklas Hasse <jhasse@bixense.com>
2// For conditions of distribution and use, see copyright notice in LICENSE.txt
5#pragma once
6
7#include "Drawable.hpp"
8#include "Rgb.hpp"
9#include "ShaderProgram.hpp"
10#include "Vec2.hpp"
11
12#include <future>
13#include <vector>
14
15namespace jngl {
16
17class ImageData;
18class Mat3;
19class Texture;
20struct Vertex;
21
23class Sprite : public Drawable {
24public:
25 enum class LoadType {
26 NORMAL,
27 HALF,
28 THREADED,
29 };
30
31 Sprite(const unsigned char* bytes, size_t width, size_t height);
32
34 explicit Sprite(const std::string& filename, LoadType loadType = LoadType::NORMAL);
35
37 void step() override;
38
40 void draw() const override;
41
59 class Loader {
60 public:
65 explicit Loader(std::string filename) noexcept;
66
75 ~Loader() noexcept;
76
80 std::shared_ptr<Sprite> shared() const;
81
85 operator bool() const; // NOLINT
86
90 Sprite* operator->() const;
91
92 private:
93 mutable std::future<std::unique_ptr<ImageData>> imageDataFuture;
94 std::string filename;
95 };
96
100 void draw(Mat3 modelview, const ShaderProgram* = nullptr) const;
101
102 void draw(const ShaderProgram* shaderProgram) const;
103
114 [[deprecated("Scale the modelview matrix instead using jngl::Mat3::scale")]]
115 void drawScaled(float xfactor, float yfactor,
116 const ShaderProgram* shaderProgram = nullptr) const;
117
119 [[deprecated("Use new drawClipped(Vec2, Vec2) method instead")]] void
120 drawClipped(float xstart, float xend, float ystart, float yend) const;
121
123 void drawClipped(Vec2 start, Vec2 end) const;
124
127 void drawMesh(const std::vector<Vertex>& vertexes, const ShaderProgram* = nullptr) const;
128
130 void drawMesh(Mat3 modelview, const std::vector<Vertex>& vertexes,
131 const ShaderProgram* = nullptr) const;
132
133 void setBytes(const unsigned char*);
134
136 static const Shader& vertexShader();
137
139 std::shared_ptr<Finally> loader;
140
141private:
142 static void cleanUpRowPointers(std::vector<unsigned char*>& buf);
143 void loadTexture(int scaledWidth, int scaledHeight, const std::string& filename, bool halfLoad,
144 unsigned int format, const unsigned char* const* rowPointers,
145 const unsigned char* data = nullptr);
146 Finally LoadPNG(const std::string& filename, FILE* fp, bool halfLoad);
147 struct BMPHeader {
148 unsigned int dataOffset;
149 unsigned int headerSize;
150 int width;
151 int height;
152 unsigned short planes;
153 unsigned short bpp;
154 unsigned int compression;
155 unsigned int dataSize;
156 };
157 Finally LoadBMP(const std::string& filename, FILE* fp, bool halfLoad);
158#ifndef NOWEBP
159 Finally LoadWebP(const std::string& filename, FILE* file, bool halfLoad);
160#endif
161
163};
164
165void draw(const std::string& filename, double x, double y);
166
167template <class Vect> void draw(const std::string& filename, Vect pos) {
168 draw(filename, pos.x, pos.y);
169}
170
174Finally load(const std::string& filename);
175
176void unload(const std::string& filename);
177
178void unloadAll();
179
180void drawClipped(const std::string& filename, double xposition, double yposition, float xstart,
181 float xend, float ystart, float yend);
182
183void setSpriteColor(unsigned char red, unsigned char green, unsigned char blue,
184 unsigned char alpha);
185
186void setSpriteColor(unsigned char red, unsigned char green, unsigned char blue);
187
189void setSpriteColor(Rgb);
190
191void setSpriteAlpha(unsigned char alpha);
192
193void pushSpriteAlpha(unsigned char alpha = 255);
194
195void popSpriteAlpha();
196
197int getWidth(const std::string& filename);
198
199int getHeight(const std::string& filename);
200
201#if __cplusplus >= 201703L
202[[nodiscard]]
203#endif
205disableBlending();
206
207} // namespace jngl
Contains jngl::Drawable class.
Contains jngl::Rgb class.
Contains jngl::ShaderProgram class.
Contains jngl::Vec2 class.
Base class for drawable objects with a position and a rectangle size.
Definition: Drawable.hpp:12
float getWidth() const
Returns the width in screen coordinates.
float getHeight() const
Returns the height in screen coordinates.
Helper class which calls a function when being destroyed.
Definition: Finally.hpp:22
Containing the pixel data of an image file.
Definition: ImageData.hpp:14
3x3 matrix
Definition: Mat3.hpp:18
Object representing a RGB color, new version of jngl::Color (which will be deprecated in the future)
Definition: Rgb.hpp:12
Linked vertex and fragment shaders.
Fragment or vertex GLSL shader.
Definition: Shader.hpp:12
Use this class to load a Sprite asynchronously.
Definition: sprite.hpp:59
~Loader() noexcept
Blocks until the Sprite has been loaded.
Loader(std::string filename) noexcept
Starts a thread to load filename and returns instantly.
std::shared_ptr< Sprite > shared() const
Blocks until the Sprite has been loaded and returns a non-nullptr std::shared_ptr.
Higher-level representation of an image.
Definition: sprite.hpp:23
void draw() const override
Draws the Sprite, centered by default.
void drawScaled(float xfactor, float yfactor, const ShaderProgram *shaderProgram=nullptr) const
Draws the image scaled by xfactor and yfactor
std::shared_ptr< Finally > loader
Function which actually loads the sprite.
Definition: sprite.hpp:139
void drawClipped(float xstart, float xend, float ystart, float yend) const
void drawMesh(const std::vector< Vertex > &vertexes, const ShaderProgram *=nullptr) const
Draws a list of triangles with the sprite's texture on it using the global modelview from jngl::model...
static const Shader & vertexShader()
Returns a reference to JNGL's default vertex shader used to draw textures.
void step() override
Does nothing.
Sprite(const std::string &filename, LoadType loadType=LoadType::NORMAL)
Two-dimensional vector.
Definition: Vec2.hpp:32
JNGL's main namespace.
Definition: Achievement.hpp:10
void scale(double factor)
Multiplies the global ModelView matrix by a scaling matrix.
Finally load(const std::string &filename)
Starts a thread to load filename and returns a Finally which will join it.
jngl::Mat3 modelview()
Returns a copy of the global ModelView matrix.
Position and texture coordinates.
Definition: Vertex.hpp:9