14#ifndef CSCI441_TEXTURE_UTILS_HPP
15#define CSCI441_TEXTURE_UTILS_HPP
19#ifdef CSCI441_USE_GLEW
25#ifdef CSCI441_TEXTURE_UTILS_IMPLEMENTATION
26# ifndef STB_IMAGE_WRITE_IMPLEMENTATION
27# define STB_IMAGE_IMPLEMENTATION
64 bool loadPPM(
const char *filename,
int &imageWidth,
int &imageHeight,
unsigned char* &imageData );
81 GLint minFilter = GL_LINEAR,
82 GLint magFilter = GL_LINEAR,
83 GLint wrapS = GL_REPEAT,
84 GLint wrapT = GL_REPEAT,
85 GLboolean flipOnY = GL_TRUE,
86 GLboolean printAllMessages = GL_TRUE,
87 GLboolean enableMipmaps = GL_TRUE,
88 GLboolean enableAniso = GL_TRUE);
107 GLint minFilter = GL_LINEAR,
108 GLint magFilter = GL_LINEAR,
109 GLint wrapS = GL_REPEAT,
110 GLint wrapT = GL_REPEAT,
111 GLboolean flipOnY = GL_TRUE,
112 GLboolean printAllMessages = GL_TRUE,
113 GLboolean enableMipmaps = GL_TRUE,
114 GLboolean enableAniso = GL_TRUE);
130 FILE *fp = fopen(filename,
"r");
132 fscanf(fp,
"P%d", &temp);
134 fprintf(stderr,
"[ERROR]: CSCI441::TextureUtils::loadPPM(): PPM file is not of correct format! (Must be P3, is P%d.)\n", temp);
140 fscanf(fp,
"%d", &imageWidth);
141 fscanf(fp,
"%d", &imageHeight);
142 fscanf(fp,
"%d", &maxValue);
145 imageData =
new unsigned char[imageWidth*imageHeight*3];
147 fprintf(stderr,
"[ERROR]: CSCI441::TextureUtils::loadPPM(): couldn't allocate image memory. Dimensions: %d x %d.\n", imageWidth, imageHeight);
153 for(
int j = 0; j < imageHeight; j++) {
154 for(
int i = 0; i < imageWidth; i++) {
156 fscanf(fp,
"%d", &r);
157 fscanf(fp,
"%d", &g);
158 fscanf(fp,
"%d", &b);
160 imageData[(j*imageWidth+i)*3+0] = r;
161 imageData[(j*imageWidth+i)*3+1] = g;
162 imageData[(j*imageWidth+i)*3+2] = b;
171inline GLuint
CSCI441::TextureUtils::loadAndRegisterTexture(
const char *filename,
const GLint minFilter,
const GLint magFilter,
const GLint wrapS,
const GLint wrapT,
const GLboolean flipOnY,
const GLboolean printAllMessages,
const GLboolean enableMipmaps,
const GLboolean enableAniso ) {
172 return loadAndRegister2DTexture( filename, minFilter, magFilter, wrapS, wrapT, flipOnY, printAllMessages, enableMipmaps, enableAniso );
175inline GLuint
CSCI441::TextureUtils::loadAndRegister2DTexture(
const char *filename,
const GLint minFilter,
const GLint magFilter,
const GLint wrapS,
const GLint wrapT,
const GLboolean flipOnY,
const GLboolean printAllMessages,
const GLboolean enableMipmaps,
const GLboolean enableAniso ) {
176 int imageWidth, imageHeight, imageChannels;
177 GLuint texHandle = 0;
178 stbi_set_flip_vertically_on_load(flipOnY);
179 unsigned char *data = stbi_load( filename, &imageWidth, &imageHeight, &imageChannels, 0);
182 if( strstr(filename,
".ppm") != NULL ) {
183 loadPPM(filename, imageWidth, imageHeight, data);
187 if(printAllMessages) printf(
"[ERROR]: CSCI441::TextureUtils::loadAndRegister2DTexture(): Could not load texture \"%s\"\n", filename );
192 glGenTextures(1, &texHandle );
193 glBindTexture( GL_TEXTURE_2D, texHandle );
194 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter );
195 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter );
196 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS );
197 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT );
198 const GLint STORAGE_TYPE = (imageChannels == 4 ? GL_RGBA : GL_RGB);
199 glTexImage2D( GL_TEXTURE_2D, 0, STORAGE_TYPE, imageWidth, imageHeight, 0, STORAGE_TYPE, GL_UNSIGNED_BYTE, data);
201 if(enableMipmaps) glGenerateMipmap(GL_TEXTURE_2D);
205 GLint major = 0, minor = 0;
206 glGetIntegerv(GL_MAJOR_VERSION, &major);
207 glGetIntegerv(GL_MINOR_VERSION, &minor);
209 if( (major > 4 || (major == 4 && minor >= 6)) || GL_EXT_texture_filter_anisotropic ) {
210 GLfloat maxAniso = 1.0f;
211 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAniso);
212 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAniso);
216 printf(
"[INFO]: Successfully loaded texture \"%s\" with handle %d\n", filename, texHandle );
223 int imageWidth, imageHeight, imageChannels;
224 unsigned char *data = stbi_load( FILENAME, &imageWidth, &imageHeight, &imageChannels, 0);
227 const GLint STORAGE_TYPE = (imageChannels == 4 ? GL_RGBA : GL_RGB);
228 glTexImage2D(cubeMapFace, 0, STORAGE_TYPE, imageWidth, imageHeight, 0, STORAGE_TYPE, GL_UNSIGNED_BYTE, data);
229 stbi_image_free(data);
231 fprintf( stderr,
"[ERROR]: CSCI441::TextureUtils::loadCubeMapFaceTexture(): Could not load texture map \"%s\"\n", FILENAME );
void loadCubeMapFaceTexture(GLint cubeMapFace, const char *filename)
loads a texture into memory of a cube face
Definition: TextureUtils.hpp:222
bool loadPPM(const char *filename, int &imageWidth, int &imageHeight, unsigned char *&imageData)
loads a PPM into memory
Definition: TextureUtils.hpp:129
GLuint loadAndRegister2DTexture(const char *filename, GLint minFilter=GL_LINEAR, GLint magFilter=GL_LINEAR, GLint wrapS=GL_REPEAT, GLint wrapT=GL_REPEAT, GLboolean flipOnY=GL_TRUE, GLboolean printAllMessages=GL_TRUE, GLboolean enableMipmaps=GL_TRUE, GLboolean enableAniso=GL_TRUE)
loads and registers a texture into memory returning a texture handle
Definition: TextureUtils.hpp:175
GLuint loadAndRegisterTexture(const char *filename, GLint minFilter=GL_LINEAR, GLint magFilter=GL_LINEAR, GLint wrapS=GL_REPEAT, GLint wrapT=GL_REPEAT, GLboolean flipOnY=GL_TRUE, GLboolean printAllMessages=GL_TRUE, GLboolean enableMipmaps=GL_TRUE, GLboolean enableAniso=GL_TRUE)
loads and registers a texture into memory returning a texture handle
Definition: TextureUtils.hpp:171
CSCI441 Helper Functions for OpenGL.
Definition: ArcballCam.hpp:17
OpenGL Texture Utility functions.