diff options
Diffstat (limited to 'gfx/gl/glTexture.h')
| -rw-r--r-- | gfx/gl/glTexture.h | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/gfx/gl/glTexture.h b/gfx/gl/glTexture.h index 5e5c838..3472c4a 100644 --- a/gfx/gl/glTexture.h +++ b/gfx/gl/glTexture.h @@ -1,14 +1,34 @@ #pragma once -#include "config/types.h" #include "glArrays.h" #include "gl_traits.h" namespace Impl { - // NOLINTNEXTLINE(readability-identifier-naming) - struct glTexture : Detail::glNamed { - [[nodiscard]] TextureDimensions getSize() const; - void bind(GLenum type = GL_TEXTURE_2D, GLenum unit = GL_TEXTURE0) const; + template<GLenum> struct TextureTargetTraits; + + template<GLenum Target> struct TextureTargetTraitsCommon { + static void + create(GLsizei count, GLuint * textures) + { + glCreateTextures(Target, count, textures); + } + }; + + template<> struct TextureTargetTraits<GL_TEXTURE_2D> : TextureTargetTraitsCommon<GL_TEXTURE_2D> { + constexpr static glm::length_t dims = 2; + }; + + template<> struct TextureTargetTraits<GL_TEXTURE_2D_ARRAY> : TextureTargetTraitsCommon<GL_TEXTURE_2D_ARRAY> { + constexpr static glm::length_t dims = 3; + }; + + template<> struct TextureTargetTraits<GL_TEXTURE_RECTANGLE> : TextureTargetTraitsCommon<GL_TEXTURE_RECTANGLE> { + constexpr static glm::length_t dims = 2; + }; + + struct glTextureBase : Detail::glNamed { + void bind(GLuint unit) const; + void generateMipmap(); template<has_glTextureParameter T> void @@ -24,9 +44,29 @@ namespace Impl { (*gl_traits<T>::glTextureParametervFunc)(name, pname, glm::value_ptr(param)); } }; + + template<glm::length_t Dims> + requires(Dims >= 1 && Dims <= 3) + struct glTextureDims : glTextureBase { + [[nodiscard]] glm::vec<Dims, GLsizei> getSize() const; + void storage(GLsizei levels, GLenum internalformat, glm::vec<Dims, GLsizei> dims); + void image(GLenum format, GLenum type, const void * pixels); + void image(glm::vec<Dims, GLint> size, GLenum format, GLenum type, const void * pixels); + void subImage(glm::vec<Dims, GLint> offset, glm::vec<Dims, GLint> size, GLenum format, GLenum type, + const void * pixels); + + void saveColour(const char * path) const; + void saveDepth(const char * path) const; + void saveNormal(const char * path) const; + void savePosition(const char * path) const; + }; + + template<GLenum Target> struct glTexture : glTextureDims<TextureTargetTraits<Target>::dims> { }; } -// NOLINTBEGIN(readability-identifier-naming) -template<size_t N> using glTextures = glManagedArray<Impl::glTexture, N, &glGenTextures, &glDeleteTextures>; -using glTexture = glManagedSingle<Impl::glTexture, &glGenTextures, &glDeleteTextures>; -// NOLINTEND(readability-identifier-naming) +template<GLenum Target, size_t N> +using glTextures + = glManagedArray<Impl::glTexture<Target>, N, &Impl::TextureTargetTraits<Target>::create, &glDeleteTextures>; +template<GLenum Target> +using glTexture + = glManagedSingle<Impl::glTexture<Target>, &Impl::TextureTargetTraits<Target>::create, &glDeleteTextures>; |
