Subversion Repositories sssnakesss

Rev

Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 tom 1
#include "SDL/SDL_image.h"
2
#include "SDL/SDL_opengl.h"
3
 
4
#include <iostream>
5
 
6
using namespace std;
7
 
8
#include "texture.hpp"
9
 
10
Texture::Texture(string filename)
11
{
12
    loaded = false;
13
 
10 tom 14
    GLenum textureFormat = GL_RGBA;
4 tom 15
 
16
    SDL_Surface *surface = IMG_Load(filename.c_str());
17
    if (surface)
18
    {
19
        GLint noOfColours = surface->format->BytesPerPixel;
20
        if (noOfColours == 4)
21
        {
22
            if (surface->format->Rmask == 0x000000ff)
23
            {
24
                textureFormat = GL_RGBA;
25
            }
26
            else
27
            {
28
                textureFormat = GL_BGRA;
29
            }
30
        }
31
        else if (noOfColours == 3)
32
        {
33
            if (surface->format->Rmask == 0x000000ff)
34
            {
35
                textureFormat = GL_RGB;
36
            }
37
            else
38
            {
39
                textureFormat = GL_BGR;
40
            }
41
        }
42
        else
43
        {
44
            // Big Problem!
45
        }
46
 
47
        glGenTextures(1, &texture);
48
 
49
        glBindTexture(GL_TEXTURE_2D, texture);
50
 
51
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
52
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
53
 
54
        width = surface->w;
55
        height = surface->h;
56
        halfWidth = width * 0.5;
57
        halfHeight = height * 0.5;
58
 
59
        glTexImage2D(GL_TEXTURE_2D, 0, noOfColours, width, height, 0, textureFormat, GL_UNSIGNED_BYTE, surface->pixels);
60
 
61
        SDL_FreeSurface(surface);
62
 
63
        loaded = true;
64
    }
65
}
66
 
67
Texture::~Texture()
68
{
69
    if (loaded)
70
    {
71
        glDeleteTextures(1, &texture);
72
    }
73
}
74
 
75
void Texture::draw(int x, int y)
76
{
77
    if (loaded)
78
    {
79
        glBindTexture(GL_TEXTURE_2D, texture);
80
 
81
        int x1 = x - halfWidth;
82
        int x2 = x + halfWidth;
83
        int y1 = y - halfHeight;
84
        int y2 = y + halfHeight;
85
 
86
        glBegin(GL_QUADS);
87
            //Bottom-left vertex (corner)
88
            glTexCoord2i(0, 0);
89
            glVertex3f(x1, y2, 0.0f);
90
 
91
            //Bottom-right vertex (corner)
92
            glTexCoord2i(1, 0);
93
            glVertex3f(x2, y2, 0.f);
94
 
95
            //Top-right vertex (corner)
96
            glTexCoord2i(1, 1);
97
            glVertex3f(x2, y1, 0.f);
98
 
99
            //Top-left vertex (corner)
100
            glTexCoord2i(0, 1);
101
            glVertex3f(x1, y1, 0.f);
102
        glEnd();
103
    }
104
}
5 tom 105
 
106
void drawTexture(Texture *texture, int x, int y)
107
{
108
    if (texture)
109
    {
110
        texture->draw(x, y);
111
    }
112
}