#include "wrapper/Texture.h" Texture::Texture(const TextureFormat& format, int maxMipMaps) : format(format), texture(0), maxMipMaps(maxMipMaps) { glGenTextures(1, &texture); setNearestFilter(); setRepeatWrap(); } Texture::Texture(int maxMipMaps) : Texture(TextureFormat::unknown(), maxMipMaps) { } Texture::~Texture() { glDeleteTextures(1, &texture); } void Texture::setFormat(const TextureFormat& tf) { format = tf; } void Texture::setFilter(GLint minParam, GLint maxParam) { bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minParam); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, maxParam); } void Texture::setNearestFilter() { if(maxMipMaps > 0) { setFilter(GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST); } else { setFilter(GL_NEAREST, GL_NEAREST); } } void Texture::setLinearFilter() { if(maxMipMaps > 0) { setFilter(GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR); } else { setFilter(GL_LINEAR, GL_LINEAR); } } void Texture::setWrap(GLint param) { bind(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, param); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, param); } void Texture::setRepeatWrap() { setWrap(GL_REPEAT); } void Texture::setClampWrap() { setWrap(GL_CLAMP_TO_EDGE); } void Texture::setData(int width, int height, const void* data) { bind(); glTexImage2D(GL_TEXTURE_2D, 0, format.internalformat, width, height, 0, format.format, format.type, data); if(maxMipMaps > 0) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxMipMaps); glGenerateMipmap(GL_TEXTURE_2D); } } void Texture::bind() const { glBindTexture(GL_TEXTURE_2D, texture); } void Texture::bindTo(int index) const { glActiveTexture(GL_TEXTURE0 + index); bind(); }