#pragma once #ifndef _NB_TEXTURES #define _NB_TEXTURES #include "Buffers.hpp" #include "OGLObjects.hpp" namespace nb { template class TextureBuffer : public virtual Buffer> { using Base = Buffer>; using BufferType = Base; public: using Base::Base; static const GLenum Target = GL_TEXTURE_BUFFER; protected: }; template <> class TextureBuffer : public virtual TextureBuffer, public virtual ImmutableBuffer> { using Base = TextureBuffer; using BufferType = ImmutableBuffer>; public: using BufferType::BufferType; using Base::Target; }; class Texture : public OpenGLObject { using Base = OpenGLObject; public: using Base::Base; using Base::id; Texture(GLenum); virtual void bind() const override { glBindTexture(target, _id); } virtual void unbind() const override { glBindTexture(target, 0); } const GLenum target; friend Base; protected: using Base::_id; virtual void remove() override { if (_id) { glDeleteTextures(0, &_id); } } }; } // namespace nb #endif // _NB_TEXTURES