gfx::texture::pixels: support different lods & outputting to existing pixmap

This commit is contained in:
Nikita Lisitsa 2020-12-10 23:33:25 +03:00
parent f4c94e318f
commit 91650cb4ac

View file

@ -47,10 +47,13 @@ namespace psemek::gfx
template <typename Pixel>
void load(util::array<Pixel, D> const & p);
void pixels(GLenum format, GLenum type, void * data) const;
void pixels(GLenum format, GLenum type, void * data, int layer = 0) const;
template <typename Pixmap>
Pixmap pixels() const;
void pixels(Pixmap & pixmap, int layer = 0) const;
template <typename Pixmap>
Pixmap pixels(int layer = 0) const;
static basic_texture from_data(GLint internal_format, geom::vector<std::size_t, D> const & size, GLenum format, GLenum type, const void * data);
@ -268,24 +271,31 @@ namespace psemek::gfx
}
template <std::size_t D, GLenum Target>
void basic_texture<D, Target>::pixels(GLenum format, GLenum type, void * data) const
void basic_texture<D, Target>::pixels(GLenum format, GLenum type, void * data, int layer) const
{
bind();
gl::GetTexImage(Target, 0, format, type, data);
gl::GetTexImage(Target, layer, format, type, data);
}
template <std::size_t D, GLenum Target>
template <typename Pixmap>
Pixmap basic_texture<D, Target>::pixels() const
void basic_texture<D, Target>::pixels(Pixmap & pixmap, int layer) const
{
using traits = pixel_traits<typename Pixmap::value_type>;
std::array<std::size_t, D> size;
for (std::size_t i = 0; i < D; ++i) size[i] = size_[i];
pixmap.resize(size);
pixels(traits::format, traits::type, pixmap.data(), layer);
}
Pixmap p(size);
pixels(traits::format, traits::type, p.data());
return p;
template <std::size_t D, GLenum Target>
template <typename Pixmap>
Pixmap basic_texture<D, Target>::pixels(int layer) const
{
Pixmap pixmap;
pixels(pixmap, layer);
return pixmap;
}
template <std::size_t D, GLenum Target>