demotool/texture.hh

152 lines
3.1 KiB
C++

#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( 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 ];
};