#include "rendering/Texture.h"

Texture::Texture()
    : format(TextureFormat::unknown()), texture(0), maxMipMaps(0) {
}

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

void Texture::init(const TextureFormat& format, int maxMipMaps) {
    if(texture != 0) {
        return;
    }
    Texture::format = format;
    Texture::maxMipMaps = maxMipMaps;
    texture = GL::genTexture();
    setNearestFilter();
    setRepeatWrap();
}

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();
}