#pragma once #include "glArrays.h" #include "gl_traits.h" namespace Impl { template struct TextureTargetTraits; template struct TextureTargetTraitsCommon { static void create(GLsizei count, GLuint * textures) { glCreateTextures(Target, count, textures); } }; template<> struct TextureTargetTraits : TextureTargetTraitsCommon { constexpr static glm::length_t dims = 2; }; template<> struct TextureTargetTraits : TextureTargetTraitsCommon { constexpr static glm::length_t dims = 3; }; template<> struct TextureTargetTraits : TextureTargetTraitsCommon { constexpr static glm::length_t dims = 2; }; struct glTextureBase : Detail::glNamed { void bind(GLuint unit) const; void generateMipmap(); template void parameter(GLenum pname, T param) { (*gl_traits::glTextureParameterFunc)(name, pname, param); } template void parameter(GLenum pname, const glm::vec & param) { (*gl_traits::glTextureParametervFunc)(name, pname, glm::value_ptr(param)); } }; template requires(Dims >= 1 && Dims <= 3) struct glTextureDims : glTextureBase { [[nodiscard]] glm::vec getSize() const; void storage(GLsizei levels, GLenum internalformat, glm::vec dims); void image(GLenum format, GLenum type, const void * pixels); void image(glm::vec size, GLenum format, GLenum type, const void * pixels); void subImage(glm::vec offset, glm::vec 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 struct glTexture : glTextureDims::dims> { }; } template using glTextures = glManagedArray, N, &Impl::TextureTargetTraits::create, &glDeleteTextures>; template using glTexture = glManagedSingle, &Impl::TextureTargetTraits::create, &glDeleteTextures>;