summaryrefslogtreecommitdiff
path: root/engine-ocean/Graphics/GLWrappers/texture.cpp
blob: 1c761654fda719fd3073806c9c34826953931b98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "texture.h"

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

#include <iostream>

#include "../debug.h"

Texture::Texture(int width, int height, GLenum texUnit, GLint internalFormat, GLenum texTarget):
    m_texTarget(texTarget),
    m_texUnit(texUnit)
{
    glGenTextures(1, &m_handle);
    bind();
    glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(m_texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(m_texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexImage2D(m_texTarget, 0, internalFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    m_height = height;
    m_width = width;
    unbind();
}

Texture::Texture(std::string filepath, GLenum texUnit, GLint internalFormat, GLenum texTarget):
    m_texTarget(texTarget),
    m_texUnit(texUnit)
{
    glGenTextures(1, &m_handle);
    bind();
    glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(m_texTarget, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(m_texTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(m_texTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    stbi_set_flip_vertically_on_load(1);
    int width, height, numChannels;
    unsigned char* data = stbi_load(filepath.c_str(), &width, &height, &numChannels, 4);
    if (stbi_failure_reason()){
        std::cout << stbi_failure_reason() << std::endl;
    }
    glTexImage2D(m_texTarget, 0, internalFormat, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    m_height = height;
    m_width = width;
    stbi_image_free(data);
    unbind();
}

Texture::~Texture(){
    glDeleteTextures(1, &m_handle);
}

void Texture::bind(){
    glActiveTexture(m_texUnit);
    glBindTexture(m_texTarget, m_handle);
}

void Texture::bind(GLenum texUnit){
    glActiveTexture(texUnit);
    glBindTexture(m_texTarget, m_handle);
}

void Texture::unbind(){
    glActiveTexture(m_texUnit);
    glBindTexture(m_texTarget, 0);
}

void Texture::unbind(GLenum texUnit){
    glActiveTexture(texUnit);
    glBindTexture(m_texTarget, 0);
}

GLuint Texture::getHandle(){
    return m_handle;
}

GLuint Texture::getTexUnitUint(){
    return GLuint(m_texUnit) - GLuint(GL_TEXTURE0);
}

GLenum Texture::getTexUnitEnum(){
    return m_texUnit;
}

int Texture::getWidth(){
    return m_width;
}

int Texture::getHeight(){
    return m_width;
}