#include "rendering/Texture.h"

Texture::Texture(const TextureFormat& format, int maxMipMaps)
    : format(format), texture(GL::genTexture()), maxMipMaps(maxMipMaps) {
    setNearestFilter();
    setRepeatWrap();
}

Texture::Texture(int maxMipMaps)
    : Texture(TextureFormat::unknown(), maxMipMaps) {
}

Texture::~Texture() {
    GL::deleteTexture(texture);
}

void Texture::setFormat(const TextureFormat& tf) {
    format = tf;
}

void Texture::setNearestFilter() {
    bind();
    if(maxMipMaps > 0) {
        GL::setMipMapNearFilter2D();
    } else {
        GL::setNearFilter2D();
    }
}

void Texture::setLinearFilter() {
    bind();
    if(maxMipMaps > 0) {
        GL::setMipMapLinearFilter2D();
    } else {
        GL::setLinearFilter2D();
    }
}

void Texture::setRepeatWrap() {
    bind();
    GL::setRepeatWrap2D();
}

void Texture::setClampWrap() {
    bind();
    GL::setClampWrap2D();
}

void Texture::setData(int width, int height, const void* data) {
    bind();
    GL::texImage2D(format.format, width, height, data);
    if(maxMipMaps > 0) {
        GL::generateMipmap2D(maxMipMaps);
    }
}

void Texture::bind() const {
    GL::bindTexture2D(texture);
}

void Texture::bindTo(int index) const {
    GL::activeTexture(index);
    bind();
}