#pragma once #ifndef REAL_BUILD # include "externals.hh" #endif enum class E_TexType { RGBA8 , RGBA16F , RGB8 , RGB16F , R8 , R16F , }; enum class E_TexSampling { NEAREST , LINEAR , }; enum class E_TexWrap { REPEAT , CLAMP_EDGE , CLAMP_BORDER }; struct T_Texture { T_Texture( ) = delete; T_Texture( T_Texture const& ) = delete; T_Texture( T_Texture&& ) = delete; T_Texture( __rd__ const uint32_t width , __rd__ const uint32_t height , __rd__ const E_TexType type , __rd__ const uint32_t levels = 1 ); ~T_Texture( ); T_Texture& samplingMode( __rd__ const E_TexSampling mode ); T_Texture& wrap( __rd__ const E_TexWrap mode ); GLuint id( ) const noexcept { return id_; } uint32_t levels( ) const noexcept { return levels_; } uint32_t width( ) const noexcept { return width_; } uint32_t height( ) const noexcept { return height_; } private: GLuint id_; uint32_t levels_ , width_ , height_; }; struct T_TextureSampler { T_TextureSampler( T_TextureSampler const& ) = delete; // -------------------------------------------------------------------- // Initialisation, destruction & move T_TextureSampler( ); T_TextureSampler( __rw__ T_TextureSampler&& other ) noexcept; T_TextureSampler& operator=( __rw__ T_TextureSampler&& other ) noexcept; ~T_TextureSampler( ); // -------------------------------------------------------------------- // Configuration T_TextureSampler& sampling( __rd__ const E_TexSampling mode ); T_TextureSampler& noMipmap( ); T_TextureSampler& mipmap( __rd__ const E_TexSampling mode ); T_TextureSampler& wrap( __rd__ const E_TexWrap mode ); T_TextureSampler& lod( __rd__ const float min , __rd__ const float max ); // -------------------------------------------------------------------- // Usage GLuint id( ) const noexcept { return id_; } // unused void bind( __rd__ const GLuint unit ) { glBindSampler( unit , id_ ); } private: void setSamplingMode( ) const; GLuint id_ = 0; E_TexSampling sampling_ = E_TexSampling::NEAREST; E_TexSampling lodSampling_ = E_TexSampling::NEAREST; bool hasLOD_ = false; }; struct T_TextureBinding { T_TextureBinding( ) = delete; T_TextureBinding( T_TextureBinding const& ) = delete; T_TextureBinding( T_TextureBinding&& ) = delete; explicit T_TextureBinding( __rd__ const uint32_t binding ); void clear( ); void set( __rd__ const uint32_t uniform , __rd__ T_Texture const& texture ); void bind( ) const; private: const uint32_t binding_; uint32_t uniform_; T_Texture const* texture_; }; struct T_TextureManagement { static constexpr uint32_t MaxUnits = 8; T_TextureManagement( ) = default; T_TextureManagement( T_TextureManagement const& ) = delete; T_TextureManagement( T_TextureManagement&& ) = delete; void bind( __rd__ const uint32_t unit , __rd__ T_Texture const& texture ); void bind( __rd__ const uint32_t unit , __rd__ T_Texture& texture , __rd__ T_TextureSampler& sampler ); void update( ); private: struct T_Binding_ { T_Texture const* texture = nullptr; T_TextureSampler const* sampler = nullptr; bool update = false; }; T_Binding_ bindings_[ MaxUnits ]; };