8 #include "nta/GLTexture.h"
9 #include "nta/Logger.h"
10 #include "nta/utils.h"
13 void GLTexture::init(
const RawTexture& raw, GLint minFilt, GLint magFilt) {
23 if (
id == 0) glGenTextures(1, &
id);
24 glBindTexture(GL_TEXTURE_2D,
id);
25 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, raw.width, raw.height, 0,
26 raw.format, GL_UNSIGNED_BYTE, raw.data);
27 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilt);
28 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilt);
29 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
30 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
31 glGenerateMipmap(GL_TEXTURE_2D);
32 glBindTexture(GL_TEXTURE_2D, 0);
43 if (!lhs.is_valid())
return rhs;
44 if (!rhs.is_valid())
return lhs;
47 glGenTextures(1, &ret.
id);
49 ret.height = std::max(lhs.height, rhs.height);
51 GLubyte* pixels =
new GLubyte[ret.
width*ret.height*4];
52 GLubyte* lpixels =
new GLubyte[lhs.
width*lhs.height*4];
53 GLubyte* rpixels =
new GLubyte[rhs.
width*rhs.height*4];
55 glBindTexture(GL_TEXTURE_2D, lhs.
id);
56 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpixels);
57 glBindTexture(GL_TEXTURE_2D, rhs.
id);
58 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, rpixels);
60 memset(pixels, 0, ret.
width*ret.height*4);
61 for (
int r = 0; r < ret.height; r++) {
71 glBindTexture(GL_TEXTURE_2D, ret.
id);
72 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ret.
width, ret.height, 0,
73 GL_RGBA, GL_UNSIGNED_BYTE, pixels);
74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
75 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
76 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
77 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
78 glGenerateMipmap(GL_TEXTURE_2D);
79 glBindTexture(GL_TEXTURE_2D, 0);
88 if (!lhs.is_valid())
return rhs;
89 if (!rhs.is_valid())
return lhs;
92 glGenTextures(1, &ret.
id);
94 ret.height = lhs.height + rhs.height;
96 GLubyte* pixels =
new GLubyte[ret.
width*ret.height*4];
97 GLubyte* lpixels =
new GLubyte[lhs.
width*lhs.height*4];
98 GLubyte* rpixels =
new GLubyte[rhs.
width*rhs.height*4];
100 glBindTexture(GL_TEXTURE_2D, lhs.
id);
101 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpixels);
102 glBindTexture(GL_TEXTURE_2D, rhs.
id);
103 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, rpixels);
105 memset(pixels, 0, ret.
width*ret.height*4);
106 for (
int r = 0; r < ret.height; r++) {
107 if (r < lhs.height) {
110 memcpy(&pixels[r*ret.
width*4], &rpixels[(r-lhs.height)*rhs.
width*4],
115 glBindTexture(GL_TEXTURE_2D, ret.
id);
116 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ret.
width, ret.height, 0,
117 GL_RGBA, GL_UNSIGNED_BYTE, pixels);
118 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
119 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
120 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
122 glGenerateMipmap(GL_TEXTURE_2D);
123 glBindTexture(GL_TEXTURE_2D, 0);
137 ilGenImages(1, &imgID);
139 if (ilLoadImage(filePath.c_str()) == IL_FALSE) {
140 ILenum error = ilGetError();
143 "DevIL failed to load image with error " +
148 ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
150 cimg_library::CImg<GLubyte> image(filePath.c_str());
154 if (dimensions != glm::vec2(0)) {
156 iluScale(dimensions.x, dimensions.y, 1);
158 image = image.resize(dimensions.x, dimensions.y);
162 ret.width = ilGetInteger(IL_IMAGE_WIDTH);
163 ret.height = ilGetInteger(IL_IMAGE_HEIGHT);
164 ret.format = GL_RGBA;
166 ret.data =
new GLubyte[ret.width*ret.height*4];
167 memcpy(ret.data, ilGetData(), ret.width*ret.height*4);
169 ret.width = image.width();
170 ret.height = image.height();
172 ret.format = image.spectrum() == 3 ? GL_RGB : GL_RGBA;
175 image.permute_axes(
"cxyz");
176 ret.data =
new GLubyte[ret.width*ret.height*image.spectrum()];
177 memcpy(ret.data, image.data(), ret.width*ret.height*image.spectrum());
184 GLint magFilt, crvec2 dimensions) {