0,0 → 1,104 |
#include "SDL/SDL_image.h" |
#include "SDL/SDL_opengl.h" |
|
#include <iostream> |
|
using namespace std; |
|
#include "texture.hpp" |
|
Texture::Texture(string filename) |
{ |
loaded = false; |
|
GLenum textureFormat = GL_RGB; |
|
SDL_Surface *surface = IMG_Load(filename.c_str()); |
if (surface) |
{ |
GLint noOfColours = surface->format->BytesPerPixel; |
if (noOfColours == 4) |
{ |
if (surface->format->Rmask == 0x000000ff) |
{ |
textureFormat = GL_RGBA; |
} |
else |
{ |
textureFormat = GL_BGRA; |
} |
} |
else if (noOfColours == 3) |
{ |
if (surface->format->Rmask == 0x000000ff) |
{ |
textureFormat = GL_RGB; |
} |
else |
{ |
textureFormat = GL_BGR; |
} |
} |
else |
{ |
// Big Problem! |
} |
|
glGenTextures(1, &texture); |
|
glBindTexture(GL_TEXTURE_2D, texture); |
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
|
width = surface->w; |
height = surface->h; |
halfWidth = width * 0.5; |
halfHeight = height * 0.5; |
|
glTexImage2D(GL_TEXTURE_2D, 0, noOfColours, width, height, 0, textureFormat, GL_UNSIGNED_BYTE, surface->pixels); |
|
SDL_FreeSurface(surface); |
|
loaded = true; |
} |
} |
|
Texture::~Texture() |
{ |
if (loaded) |
{ |
glDeleteTextures(1, &texture); |
} |
} |
|
void Texture::draw(int x, int y) |
{ |
if (loaded) |
{ |
glBindTexture(GL_TEXTURE_2D, texture); |
|
int x1 = x - halfWidth; |
int x2 = x + halfWidth; |
int y1 = y - halfHeight; |
int y2 = y + halfHeight; |
|
glBegin(GL_QUADS); |
//Bottom-left vertex (corner) |
glTexCoord2i(0, 0); |
glVertex3f(x1, y2, 0.0f); |
|
//Bottom-right vertex (corner) |
glTexCoord2i(1, 0); |
glVertex3f(x2, y2, 0.f); |
|
//Top-right vertex (corner) |
glTexCoord2i(1, 1); |
glVertex3f(x2, y1, 0.f); |
|
//Top-left vertex (corner) |
glTexCoord2i(0, 1); |
glVertex3f(x1, y1, 0.f); |
glEnd(); |
} |
} |