142 lines
2.9 KiB
C++
142 lines
2.9 KiB
C++
#pragma once
|
|
#ifndef REAL_BUILD
|
|
# include "externals.hh"
|
|
#endif
|
|
|
|
|
|
struct T_OutputDebugger;
|
|
|
|
|
|
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
|
|
{
|
|
friend struct T_OutputDebugger;
|
|
|
|
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_;
|
|
int32_t debugIndex_;
|
|
};
|
|
|
|
|
|
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_TextureManager
|
|
{
|
|
static constexpr uint32_t MaxUnits = 8;
|
|
|
|
T_TextureManager( );
|
|
|
|
NO_COPY( T_TextureManager );
|
|
NO_MOVE( T_TextureManager );
|
|
|
|
void reset( );
|
|
T_TextureSampler const* sampler(
|
|
__rd__ std::string const& name ) const;
|
|
|
|
void bind( __rd__ const uint32_t unit ,
|
|
__rd__ T_Texture const& texture );
|
|
void bind( __rd__ const uint32_t unit ,
|
|
__rd__ T_Texture const& texture ,
|
|
__rd__ T_TextureSampler const& sampler );
|
|
|
|
private:
|
|
struct T_Binding_
|
|
{
|
|
GLuint texture = 0;
|
|
GLuint sampler = 0;
|
|
};
|
|
|
|
std::map< std::string , std::shared_ptr< T_TextureSampler > > samplers_;
|
|
T_Binding_ bindings_[ MaxUnits ];
|
|
};
|