glm/test/external/gli/sampler2d.hpp
2017-01-02 20:52:57 +01:00

73 lines
2.6 KiB
C++

/// @brief Include to sample 2d textures.
/// @file gli/sampler2d.hpp
#pragma once
#include "sampler.hpp"
#include "texture2d.hpp"
#include "core/mipmaps_compute.hpp"
#include "core/convert_func.hpp"
namespace gli
{
/// 2d texture sampler
/// @tparam T Sampler can fetch, write and interpret any texture format but will expose and process the data through type T conversions.
/// @tparam P Precision in term of ULPs
template <typename T, precision P = defaultp>
class sampler2d : public sampler
{
private:
typedef typename detail::interpolate<T>::type interpolate_type;
public:
typedef texture2d texture_type;
typedef typename texture_type::size_type size_type;
typedef typename texture_type::extent_type extent_type;
typedef interpolate_type level_type;
typedef vec<2, interpolate_type, P> normalized_type;
typedef vec<4, T, P> texel_type;
sampler2d(texture_type const& Texture, wrap Wrap, filter Mip = FILTER_NEAREST, filter Min = FILTER_NEAREST, texel_type const& BorderColor = texel_type(0, 0, 0, 1));
/// Access the sampler texture object
texture_type const& operator()() const;
/// Fetch a texel from the sampler texture
texel_type texel_fetch(extent_type const& TexelCoord, size_type const& Level) const;
/// Write a texel in the sampler texture
void texel_write(extent_type const& TexelCoord, size_type const& Level, texel_type const& Texel);
/// Clear the sampler texture with a uniform texel
void clear(texel_type const& Texel);
/// Sample the sampler texture at a specific level
texel_type texture_lod(normalized_type const& SampleCoord, level_type Level) const;
/// Generate all the mipmaps of the sampler texture from the texture base level
void generate_mipmaps(filter Minification);
/// Generate the mipmaps of the sampler texture from the texture base level to the texture max level included
void generate_mipmaps(size_type BaseLevel, size_type MaxLevel, filter Minification);
private:
typedef typename detail::convert<texture_type, T, P>::func convert_type;
typedef typename detail::convert<texture_type, T, P>::fetchFunc fetch_type;
typedef typename detail::convert<texture_type, T, P>::writeFunc write_type;
typedef typename detail::filterBase<detail::DIMENSION_2D, texture_type, interpolate_type, normalized_type, fetch_type, texel_type>::filterFunc filter_type;
texture_type Texture;
convert_type Convert;
texel_type BorderColor;
filter_type Filter;
};
typedef sampler2d<float> fsampler2D;
typedef sampler2d<double> dsampler2D;
typedef sampler2d<unsigned int> usampler2D;
typedef sampler2d<int> isampler2D;
}//namespace gli
#include "./core/sampler2d.inl"