1 //**********************************************
2 //Singleton Texture Manager class
3 //Written by Ben English
4 //benjamin.english@oit.edu
5 //
6 //For use with OpenGL and the FreeImage library
7 //**********************************************
8
9 #include "TextureManager.h"
10
11 TextureManager* TextureManager::m_inst(0);
12
Inst()13 TextureManager* TextureManager::Inst()
14 {
15 if(!m_inst)
16 m_inst = new TextureManager();
17
18 return m_inst;
19 }
20
TextureManager()21 TextureManager::TextureManager()
22 {
23 // call this ONLY when linking with FreeImage as a static library
24 #ifdef FREEIMAGE_LIB
25 FreeImage_Initialise();
26 #endif
27 }
28
29 //these should never be called
30 //TextureManager::TextureManager(const TextureManager& tm){}
31 //TextureManager& TextureManager::operator=(const TextureManager& tm){}
32
~TextureManager()33 TextureManager::~TextureManager()
34 {
35 // call this ONLY when linking with FreeImage as a static library
36 #ifdef FREEIMAGE_LIB
37 FreeImage_DeInitialise();
38 #endif
39
40 UnloadAllTextures();
41 m_inst = 0;
42 }
43
LoadTexture(const char * filename,const unsigned int texID,GLenum image_format,GLint internal_format,GLint level,GLint border)44 bool TextureManager::LoadTexture(const char* filename, const unsigned int texID, GLenum image_format, GLint internal_format, GLint level, GLint border)
45 {
46 //image format
47 FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
48 //pointer to the image, once loaded
49 FIBITMAP *dib(0);
50 //pointer to the image data
51 BYTE* bits(0);
52 //image width and height
53 unsigned int width(0), height(0);
54 //OpenGL's image ID to map to
55 GLuint gl_texID;
56
57 //check the file signature and deduce its format
58 fif = FreeImage_GetFileType(filename, 0);
59 //if still unknown, try to guess the file format from the file extension
60 if(fif == FIF_UNKNOWN)
61 fif = FreeImage_GetFIFFromFilename(filename);
62 //if still unkown, return failure
63 if(fif == FIF_UNKNOWN)
64 return false;
65
66 //check that the plugin has reading capabilities and load the file
67 if(FreeImage_FIFSupportsReading(fif))
68 dib = FreeImage_Load(fif, filename);
69 //if the image failed to load, return failure
70 if(!dib)
71 return false;
72
73 //retrieve the image data
74 bits = FreeImage_GetBits(dib);
75 //get the image width and height
76 width = FreeImage_GetWidth(dib);
77 height = FreeImage_GetHeight(dib);
78 //if this somehow one of these failed (they shouldn't), return failure
79 if((bits == 0) || (width == 0) || (height == 0))
80 return false;
81
82 //if this texture ID is in use, unload the current texture
83 if(m_texID.find(texID) != m_texID.end())
84 glDeleteTextures(1, &(m_texID[texID]));
85
86 //generate an OpenGL texture ID for this texture
87 glGenTextures(1, &gl_texID);
88 //store the texture ID mapping
89 m_texID[texID] = gl_texID;
90 //bind to the new texture ID
91 glBindTexture(GL_TEXTURE_2D, gl_texID);
92 //store the texture data for OpenGL use
93 glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,
94 border, image_format, GL_UNSIGNED_BYTE, bits);
95
96 //Free FreeImage's copy of the data
97 FreeImage_Unload(dib);
98
99 //return success
100 return true;
101 }
102
UnloadTexture(const unsigned int texID)103 bool TextureManager::UnloadTexture(const unsigned int texID)
104 {
105 bool result(true);
106 //if this texture ID mapped, unload it's texture, and remove it from the map
107 if(m_texID.find(texID) != m_texID.end())
108 {
109 glDeleteTextures(1, &(m_texID[texID]));
110 m_texID.erase(texID);
111 }
112 //otherwise, unload failed
113 else
114 {
115 result = false;
116 }
117
118 return result;
119 }
120
BindTexture(const unsigned int texID)121 bool TextureManager::BindTexture(const unsigned int texID)
122 {
123 bool result(true);
124 //if this texture ID mapped, bind it's texture as current
125 if(m_texID.find(texID) != m_texID.end())
126 glBindTexture(GL_TEXTURE_2D, m_texID[texID]);
127 //otherwise, binding failed
128 else
129 result = false;
130
131 return result;
132 }
133
UnloadAllTextures()134 void TextureManager::UnloadAllTextures()
135 {
136 //start at the begginning of the texture map
137 std::map<unsigned int, GLuint>::iterator i = m_texID.begin();
138
139 //Unload the textures untill the end of the texture map is found
140 while(i != m_texID.end())
141 UnloadTexture(i->first);
142
143 //clear the texture map
144 m_texID.clear();
145 }