diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2010-05-09 19:17:52 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-01-05 17:17:48 +0100 |
commit | 1d595f048c9e59bbff14217e2fe3821ee3e1aaa1 (patch) | |
tree | fe92fea4e73324bd3645afb52c681d103624b853 /src/base/texture.cpp | |
parent | 3ca6e32a9ecaa8514b9a30711cec20cf80722c23 (diff) | |
download | usdx-1d595f048c9e59bbff14217e2fe3821ee3e1aaa1.tar.gz usdx-1d595f048c9e59bbff14217e2fe3821ee3e1aaa1.tar.xz usdx-1d595f048c9e59bbff14217e2fe3821ee3e1aaa1.zip |
changed from SDL rendering to OpenGL
draw, repaint methods do not have the SDL_Surface* parameter anymore
Diffstat (limited to 'src/base/texture.cpp')
-rw-r--r-- | src/base/texture.cpp | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/src/base/texture.cpp b/src/base/texture.cpp index ace2857f..1b9ed970 100644 --- a/src/base/texture.cpp +++ b/src/base/texture.cpp @@ -28,5 +28,86 @@ namespace usdx { - + log4cxx::LoggerPtr Texture::log = + log4cxx::Logger::getLogger("usdx.base.texture"); + + Texture::Texture(boost::filesystem::wpath filename) : + filename(filename), texture(0), size(0, 0), rotation(0) + { + Image image(filename); + + size.set_width(image.get_surface()->w); + size.set_height(image.get_surface()->h); + + // // Check that the image dimensions are a power of 2 + // if ((image.get_surface()->w & (image.get_surface()->w - 1)) != 0 ) { + // LOG4CXX_ERROR(log, L"" << filename << L" has a width of " << image.get_surface()->w << L" that is not a power of 2"); + // throw TextureSizeException(size); + // } + + // if ((image.get_surface()->h & (image.get_surface()->h - 1)) != 0 ) { + // LOG4CXX_ERROR(log, L"" << filename << L" has a height of " << image.get_surface()->h << L" that is not a power of 2"); + // throw TextureSizeException(size); + // } + + + switch (image.get_surface()->format->BytesPerPixel) { + case 4: + if (image.get_surface()->format->Rmask == 0x000000ff) { + texture_format = GL_RGBA; + } + else { + texture_format = GL_BGRA; + } + + break; + + case 3: + if (image.get_surface()->format->Rmask == 0x000000ff) { + texture_format = GL_RGB; + } + else { + texture_format = GL_BGR; + } + + break; + + default: + LOG4CXX_ERROR(log, L"" << filename << L" is not in true color! Could not handle that!"); + throw TextureColorDepthException(image.get_surface()->format->BytesPerPixel); + } + + // Have OpenGL generate a texture object handle for us + glGenTextures(1, &texture); + + // Bind the texture object + glBindTexture(GL_TEXTURE_2D, texture); + + // Set the texture's stretching properties + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // Edit the texture object's image data using the information SDL_Surface gives us + glTexImage2D(GL_TEXTURE_2D, + 0, + image.get_surface()->format->BytesPerPixel, + image.get_surface()->w, + image.get_surface()->h, + 0, + texture_format, + GL_UNSIGNED_BYTE, + image.get_surface()->pixels); + } + + Texture::~Texture() + { + if (glIsTexture(texture)) { + glDeleteTextures(1, &texture); + } + } + + GLuint Texture::get_texture(void) const + { + return texture; + } }; |