00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "flexilog.h"
00013 #include "imagecommon.h"
00014 #include <GL/glext.h>
00015
00016 using namespace VRUT;
00017
00018
00019 ImageCommon::ImageCommon() : Image(), image((wxImage *)NULL)
00020 {
00021 }
00022
00023
00024 ImageCommon::~ImageCommon()
00025 {
00026 SAFE_DELETE(image);
00027 }
00028
00029
00030 bool ImageCommon::IsOk() const
00031 {
00032 return image && image->IsOk();
00033 }
00034
00035
00036 bool ImageCommon::Load(const wxString & fname)
00037 {
00038 if (Image::Load(fname))
00039 {
00040 wxImage im(fname);
00041 if (im.IsOk())
00042 {
00043 SAFE_DELETE(image);
00044 image = new wxImage(im.Mirror(false));
00045 return true;
00046 }
00047 }
00048 return false;
00049 }
00050
00051
00052 GLuint ImageCommon::BuildOglTexture() const
00053 {
00054 GLuint texID = GL_ID_NONE;
00055 if (IsOk())
00056 {
00057 glEnable(GL_TEXTURE_2D);
00058 glGenTextures( 1, &texID );
00059 glBindTexture( GL_TEXTURE_2D, texID );
00060 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
00061 glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE );
00062 if (image->HasAlpha())
00063 {
00065 unsigned pixels = image->GetWidth() * image->GetHeight();
00066 GLubyte * rgbaData = new GLubyte[pixels * 4];
00067 unsigned char * tmpRGBA = rgbaData;
00068 unsigned char * rgbData = image->GetData();
00069 unsigned char * alphaData = image->GetAlpha();
00070 for (unsigned pix = 0; pix < pixels; pix++)
00071 {
00072 *tmpRGBA++ = *rgbData++;
00073 *tmpRGBA++ = *rgbData++;
00074 *tmpRGBA++ = *rgbData++;
00075 *tmpRGBA++ = *alphaData++;
00076 }
00077 gluBuild2DMipmaps(GL_TEXTURE_2D,
00078 4,
00079 image->GetWidth(),
00080 image->GetHeight(),
00081 GL_RGBA,
00082 GL_UNSIGNED_BYTE,
00083 rgbaData);
00084 delete [] rgbaData;
00085 }
00086 else
00087 gluBuild2DMipmaps(GL_TEXTURE_2D,
00088 3,
00089 image->GetWidth(),
00090 image->GetHeight(),
00091 GL_RGB,
00092 GL_UNSIGNED_BYTE,
00093 image->GetData());
00094 }
00095 return texID;
00096 }
00097
00098
00099 bool ImageCommon::HasTransparency() const
00100 {
00101 return IsOk() && (image->HasAlpha() || image->HasMask());
00102 }
00103
00104 int ImageCommon::GetWidth() const
00105 {
00106 return (IsOk()?image->GetWidth():0);
00107 }
00108
00109 int ImageCommon::GetHeight() const
00110 {
00111 return (IsOk()?image->GetHeight():0);
00112 }