psemek/libs/gfx/source/texture.cpp
2020-10-26 18:38:47 +03:00

54 lines
1.3 KiB
C++

#include <psemek/gfx/texture.hpp>
#include <optional>
namespace psemek::gfx
{
template struct basic_texture<1, gl::TEXTURE_1D>;
template struct basic_texture<2, gl::TEXTURE_1D_ARRAY>;
template struct basic_texture<2, gl::TEXTURE_2D>;
template struct basic_texture<3, gl::TEXTURE_2D_ARRAY>;
template struct basic_texture<3, gl::TEXTURE_3D>;
template struct basic_texture<2, gl::TEXTURE_CUBE_MAP>;
namespace detail
{
static std::optional<float> get_max_anisotropy()
{
if (!gl::exts::var_EXT_texture_filter_anisotropic) return std::nullopt;
float level;
gl::GetFloatv(gl::MAX_TEXTURE_MAX_ANISOTROPY_EXT, &level);
return level;
}
std::optional<float> max_anisotropy()
{
static std::optional<float> level = get_max_anisotropy();
return level;
}
}
void texture_cubemap::load(int f, GLint internal_format, geom::vector<std::size_t, 2> const & size, GLenum format, GLenum type, const void * data)
{
bind();
gl::TexImage2D(face_to_gl(f), 0, internal_format, size[0], size[1], 0, format, type, data);
size_ = size;
}
void texture_cubemap::pixels(int f, GLenum format, GLenum type, void * data) const
{
bind();
gl::GetTexImage(face_to_gl(f), 0, format, type, data);
}
GLenum texture_cubemap::face_to_gl(int f)
{
return gl::TEXTURE_CUBE_MAP_POSITIVE_X + f;
}
}