Subversion Repositories sssnakesss

Rev

Rev 4 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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();
    }
}

void drawTexture(Texture *texture, int x, int y)
{
    if (texture)
    {
        texture->draw(x, y);
    }
}