Sparkle 0.0.1
Loading...
Searching...
No Matches
spk_texture_object.hpp
1#pragma once
2
3#include "structure/design_pattern/spk_activable_object.hpp"
4#include "structure/design_pattern/spk_cached_data.hpp"
5#include "structure/design_pattern/spk_synchronizable_object.hpp"
6#include "structure/math/spk_vector2.hpp"
7#include "structure/opengl/spk_opengl_includes.hpp"
8#include "type/spk_activation_status.hpp"
9#include "type/spk_orientation.hpp"
10#include "utils/spk_opengl_utils.hpp"
11#include <cstdint>
12#include <cstring>
13#include <stdexcept>
14#include <vector>
15
16namespace spk
17{
18 namespace OpenGL
19 {
25 {
26 public:
28 enum class Format : GLenum
29 {
30 RGB = GL_RGB,
31 RGBA = GL_RGBA,
32 BGR = GL_BGR,
33 BGRA = GL_BGRA,
34 GreyLevel = GL_RED,
35 DualChannel = GL_RG,
36 DepthComponent = GL_DEPTH_COMPONENT,
37 DepthStencil = GL_DEPTH_STENCIL,
38 Error = GL_NONE
39 };
40
42 enum class Filtering : GLenum
43 {
44 Nearest = GL_NEAREST,
45 Linear = GL_LINEAR
46 };
47
63
65 enum class Wrap : GLenum
66 {
67 Repeat = GL_REPEAT,
68 ClampToEdge = GL_CLAMP_TO_EDGE,
69 ClampToBorder = GL_CLAMP_TO_BORDER
70 };
71
76 struct Wrapper
77 {
86 };
87
89 using Mipmap = spk::ActivationStatus;
90
91 private:
94
95 GLenum _target;
96 Format _format;
97 Filter _filter;
98 Wrapper _wrapper;
99 Mipmap _mipmap = Mipmap::Deactivated;
101 std::vector<uint8_t> _content;
102 spk::Vector2UInt _size = {0, 0};
103
104 static size_t _componentCount(Format p_format);
105
106 size_t _expectedByteSize(const spk::Vector2UInt &p_size) const;
107
108 static GLenum _pixelDataType(Format p_format);
109
110 void _applyParameters();
111
112 void _storeData(std::vector<uint8_t> p_data, const spk::Vector2UInt &p_size);
113 void _storeData(const uint8_t *p_data, const spk::Vector2UInt &p_size);
114
115 void _registerCallbacks();
116
117 protected:
121 void _onSynchronize() override;
122
123 public:
132 Format p_format = Format::RGBA,
133 Filter p_filter = {Filtering::Linear, Filtering::Linear},
134 Wrapper p_wrapper = {Wrap::Repeat, Wrap::Repeat},
135 Mipmap p_mipmap = Mipmap::Activated);
140 TextureObject(const TextureObject &p_other);
146 TextureObject &operator=(const TextureObject &p_other);
151 TextureObject(TextureObject &&p_other) noexcept;
157 TextureObject &operator=(TextureObject &&p_other) noexcept;
158
161
165 void activate() const;
169 void deactivate() const;
170
175 Format format() const;
180 Filter filter() const;
185 Wrapper wrapper() const;
190 Mipmap mipmap() const;
191
196 void setFormat(Format p_format);
201 void setFiltering(Filter p_filter);
207 void setFiltering(Filtering p_minFilter, Filtering p_magFilter);
212 void setWrap(Wrapper p_wrapper);
218 void setWrap(Wrap p_wrapS, Wrap p_wrapT);
223 void setMipmap(Mipmap p_mipmap);
224
229 spk::Vector2UInt size() const;
234 size_t sizeAsBytes() const;
239 GLuint id() const;
240
247 void setData(const uint8_t *p_data, const spk::Vector2UInt &p_size, Format p_format = Format::RGBA);
254 void setData(std::vector<uint8_t> p_data, const spk::Vector2UInt &p_size, Format p_format = Format::RGBA);
255
259 void clearData();
264 void resize(const spk::Vector2UInt &p_size);
265
270 std::vector<uint8_t> &data();
271
276 const std::vector<uint8_t> &data() const;
277
282 void flip(const spk::Orientation &p_orientation);
283 };
284 }
285}
Stateful helper toggling between activated/deactivated states.
Definition spk_activable_object.hpp:20
void deactivate()
Sets the state to Deactivated.
Definition spk_activable_object.hpp:61
void activate()
Sets the state to Activated.
Definition spk_activable_object.hpp:54
Lazily generates and caches a value with optional custom destructor.
Definition spk_cached_data.hpp:26
void setWrap(Wrapper p_wrapper)
Sets wrapping for both axes.
Definition spk_texture_object.cpp:305
Mipmap mipmap() const
Gets mipmap activation state.
Definition spk_texture_object.cpp:274
Filter filter() const
Gets filtering parameters.
Definition spk_texture_object.cpp:264
void clearData()
Clears CPU data and marks for sync.
Definition spk_texture_object.cpp:351
void flip(const spk::Orientation &p_orientation)
Flips stored pixel data along the given orientation.
Definition spk_texture_object.cpp:383
void setData(const uint8_t *p_data, const spk::Vector2UInt &p_size, Format p_format=Format::RGBA)
Uploads pixel data from raw pointer.
Definition spk_texture_object.cpp:340
spk::ActivationStatus Mipmap
Indicates whether mipmaps are active.
Definition spk_texture_object.hpp:89
GLuint id() const
Returns GL texture id, creating if needed.
Definition spk_texture_object.cpp:335
void resize(const spk::Vector2UInt &p_size)
Resizes CPU data and marks for sync.
Definition spk_texture_object.cpp:358
Format format() const
Gets the current texture format.
Definition spk_texture_object.cpp:259
Wrapper wrapper() const
Gets wrapping parameters.
Definition spk_texture_object.cpp:269
void deactivate() const
Deactivates this texture after rendering.
Definition spk_texture_object.cpp:254
void setMipmap(Mipmap p_mipmap)
Sets mipmap activation state.
Definition spk_texture_object.cpp:320
void _onSynchronize() override
Synchronizes CPU-side data with the GPU texture.
Definition spk_texture_object.cpp:99
Wrap
Texture coordinate wrapping strategies.
Definition spk_texture_object.hpp:66
void setFiltering(Filter p_filter)
Sets min/mag filtering together.
Definition spk_texture_object.cpp:290
void activate() const
Activates this texture for rendering.
Definition spk_texture_object.cpp:249
TextureObject & operator=(const TextureObject &p_other)
Copy-assigns a texture object including CPU-side data.
Definition spk_texture_object.cpp:160
std::vector< uint8_t > & data()
Gets CPU-side pixel data.
Definition spk_texture_object.cpp:373
Filtering
Texture sampling algorithms for minification/magnification.
Definition spk_texture_object.hpp:43
TextureObject(Format p_format=Format::RGBA, Filter p_filter={Filtering::Linear, Filtering::Linear}, Wrapper p_wrapper={Wrap::Repeat, Wrap::Repeat}, Mipmap p_mipmap=Mipmap::Activated)
Constructs a texture with format, filtering, and wrapping options.
Definition spk_texture_object.cpp:130
size_t sizeAsBytes() const
Returns CPU data size in bytes.
Definition spk_texture_object.cpp:330
Format
Supported GPU pixel formats.
Definition spk_texture_object.hpp:29
spk::Vector2UInt size() const
Returns texture dimensions.
Definition spk_texture_object.cpp:325
void setFormat(Format p_format)
Sets the texture format (affects upload interpretation).
Definition spk_texture_object.cpp:279
Base for objects requiring deferred synchronization hooks.
Definition spk_synchronizable_object.hpp:10
void forceSynchronization()
Forces synchronization regardless of current flag.
Definition spk_synchronizable_object.hpp:54
void synchronize()
Performs synchronization if requested.
Definition spk_synchronizable_object.hpp:40
Filtering modes applied on minification and magnification.
Definition spk_texture_object.hpp:53
Filtering minor
Minification filter applied when shrinking textures.
Definition spk_texture_object.hpp:61
Filtering major
Magnification filter applied when enlarging textures.
Definition spk_texture_object.hpp:57
Wrapping policy along each texture axis.
Definition spk_texture_object.hpp:77
Wrap s
Horizontal wrapping mode for the S axis.
Definition spk_texture_object.hpp:81
Wrap t
Vertical wrapping mode for the T axis.
Definition spk_texture_object.hpp:85