You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
3.7 KiB
145 lines
3.7 KiB
//**********************************************
|
|
//Singleton Texture Manager class
|
|
//Written by Ben English
|
|
//benjamin.english@oit.edu
|
|
//
|
|
//For use with OpenGL and the FreeImage library
|
|
//**********************************************
|
|
|
|
#include "TextureManager.h"
|
|
|
|
TextureManager* TextureManager::m_inst(0);
|
|
|
|
TextureManager* TextureManager::Inst()
|
|
{
|
|
if(!m_inst)
|
|
m_inst = new TextureManager();
|
|
|
|
return m_inst;
|
|
}
|
|
|
|
TextureManager::TextureManager()
|
|
{
|
|
// call this ONLY when linking with FreeImage as a static library
|
|
#ifdef FREEIMAGE_LIB
|
|
FreeImage_Initialise();
|
|
#endif
|
|
}
|
|
|
|
//these should never be called
|
|
//TextureManager::TextureManager(const TextureManager& tm){}
|
|
//TextureManager& TextureManager::operator=(const TextureManager& tm){}
|
|
|
|
TextureManager::~TextureManager()
|
|
{
|
|
// call this ONLY when linking with FreeImage as a static library
|
|
#ifdef FREEIMAGE_LIB
|
|
FreeImage_DeInitialise();
|
|
#endif
|
|
|
|
UnloadAllTextures();
|
|
m_inst = 0;
|
|
}
|
|
|
|
bool TextureManager::LoadTexture(const char* filename, const unsigned int texID, GLenum image_format, GLint internal_format, GLint level, GLint border)
|
|
{
|
|
//image format
|
|
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
|
|
//pointer to the image, once loaded
|
|
FIBITMAP *dib(0);
|
|
//pointer to the image data
|
|
BYTE* bits(0);
|
|
//image width and height
|
|
unsigned int width(0), height(0);
|
|
//OpenGL's image ID to map to
|
|
GLuint gl_texID;
|
|
|
|
//check the file signature and deduce its format
|
|
fif = FreeImage_GetFileType(filename, 0);
|
|
//if still unknown, try to guess the file format from the file extension
|
|
if(fif == FIF_UNKNOWN)
|
|
fif = FreeImage_GetFIFFromFilename(filename);
|
|
//if still unkown, return failure
|
|
if(fif == FIF_UNKNOWN)
|
|
return false;
|
|
|
|
//check that the plugin has reading capabilities and load the file
|
|
if(FreeImage_FIFSupportsReading(fif))
|
|
dib = FreeImage_Load(fif, filename);
|
|
//if the image failed to load, return failure
|
|
if(!dib)
|
|
return false;
|
|
|
|
//retrieve the image data
|
|
bits = FreeImage_GetBits(dib);
|
|
//get the image width and height
|
|
width = FreeImage_GetWidth(dib);
|
|
height = FreeImage_GetHeight(dib);
|
|
//if this somehow one of these failed (they shouldn't), return failure
|
|
if((bits == 0) || (width == 0) || (height == 0))
|
|
return false;
|
|
|
|
//if this texture ID is in use, unload the current texture
|
|
if(m_texID.find(texID) != m_texID.end())
|
|
glDeleteTextures(1, &(m_texID[texID]));
|
|
|
|
//generate an OpenGL texture ID for this texture
|
|
glGenTextures(1, &gl_texID);
|
|
//store the texture ID mapping
|
|
m_texID[texID] = gl_texID;
|
|
//bind to the new texture ID
|
|
glBindTexture(GL_TEXTURE_2D, gl_texID);
|
|
//store the texture data for OpenGL use
|
|
glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,
|
|
border, image_format, GL_UNSIGNED_BYTE, bits);
|
|
|
|
//Free FreeImage's copy of the data
|
|
FreeImage_Unload(dib);
|
|
|
|
//return success
|
|
return true;
|
|
}
|
|
|
|
bool TextureManager::UnloadTexture(const unsigned int texID)
|
|
{
|
|
bool result(true);
|
|
//if this texture ID mapped, unload it's texture, and remove it from the map
|
|
if(m_texID.find(texID) != m_texID.end())
|
|
{
|
|
glDeleteTextures(1, &(m_texID[texID]));
|
|
m_texID.erase(texID);
|
|
}
|
|
//otherwise, unload failed
|
|
else
|
|
{
|
|
result = false;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool TextureManager::BindTexture(const unsigned int texID)
|
|
{
|
|
bool result(true);
|
|
//if this texture ID mapped, bind it's texture as current
|
|
if(m_texID.find(texID) != m_texID.end())
|
|
glBindTexture(GL_TEXTURE_2D, m_texID[texID]);
|
|
//otherwise, binding failed
|
|
else
|
|
result = false;
|
|
|
|
return result;
|
|
}
|
|
|
|
void TextureManager::UnloadAllTextures()
|
|
{
|
|
//start at the begginning of the texture map
|
|
std::map<unsigned int, GLuint>::iterator i = m_texID.begin();
|
|
|
|
//Unload the textures untill the end of the texture map is found
|
|
while(i != m_texID.end())
|
|
UnloadTexture(i->first);
|
|
|
|
//clear the texture map
|
|
m_texID.clear();
|
|
} |