Created
January 10, 2015 20:09
-
-
Save blackwolf12333/574c31dad81fc7ea1135 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "texture.h" | |
Texture::Texture(std::string path, bool loadNow) { | |
//Initialize texture ID | |
mTextureID = 0; | |
//Initialize texture dimensions | |
width = 0; | |
height = 0; | |
this->path = path; | |
if(loadNow) { | |
loadTexture(path); | |
} | |
} | |
Texture::~Texture() { | |
freeTexture(); | |
} | |
bool Texture::loadTexture(std::string path) { | |
//Texture loading success | |
loaded = false; | |
SDL_Surface *image = IMG_Load(path.c_str()); | |
//Image loaded successfully | |
if(image != NULL) { | |
if((image->w & (image->w - 1)) == 0) { | |
printf("Warning: image width not power of 2 -> %s\n", path.c_str()); | |
} | |
if((image->h & (image->h - 1)) == 0) { | |
printf("Warning: image height not power of 2 -> %s\n", path.c_str()); | |
} | |
loaded = loadTextureFromPixels32(image, (GLuint)image->w, (GLuint)image->h); | |
} | |
//Report error | |
if(!loaded) { | |
printf( "Unable to load %s\n", path.c_str() ); | |
} | |
return loaded; | |
} | |
bool Texture::loadTextureFromPixels32(SDL_Surface *image, GLuint width, GLuint height ) { | |
//Free texture if it exists | |
freeTexture(); | |
//Get texture dimensions | |
this->width = width; | |
this->height = height; | |
//Generate texture ID | |
glGenTextures(1, &mTextureID); | |
//Bind texture ID | |
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, mTextureID); | |
//Generate texture | |
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); | |
//Set texture parameters | |
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
//Unbind texture | |
glBindTexture(GL_TEXTURE_2D, 0); | |
//Check for error | |
GLenum error = glGetError(); | |
if(error != GL_NO_ERROR) { | |
printf("Error loading texture from %p pixels!\n", image->pixels); | |
return false; | |
} | |
return true; | |
} | |
void Texture::render(GLfloat x, GLfloat y) { | |
if(loaded) { | |
//If the texture exists | |
if(mTextureID != 0) { | |
GLfloat realX = x;// - (this->width / 2); | |
GLfloat realY = y;// - (this->height / 2); | |
//Remove any previous transformations | |
glLoadIdentity(); | |
//Move to rendering point | |
glTranslatef(realX, realY, 0.f); | |
glClearDepth(1.0f); | |
//Set texture ID | |
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, mTextureID); | |
//Render textured quad | |
glBegin(GL_QUADS); | |
glTexCoord2f( 0.f, 0.f ); glVertex2f(0.f, 0.f); | |
glTexCoord2f( 1.f, 0.f ); glVertex2f(width, 0.f); | |
glTexCoord2f( 1.f, 1.f ); glVertex2f(width, height); | |
glTexCoord2f( 0.f, 1.f ); glVertex2f(0.f, height); | |
glEnd(); | |
} | |
} else { | |
// do nothing | |
} | |
} | |
GLuint Texture::getWidth() { | |
return this->width; | |
} | |
GLuint Texture::getHeight() { | |
return this->height; | |
} | |
void Texture::freeTexture() { | |
//Delete texture | |
if(mTextureID != 0) { | |
glDeleteTextures(1, &mTextureID); | |
mTextureID = 0; | |
} | |
width = 0; | |
height = 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment