00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ExCTexture.h"
00025
00026
00027 ExCTexture::ExCTexture(void)
00028 {
00029 Guard(ExCTexture::ExCTexture(void))
00030 SetName("ExCTexture");
00031 SetType(typeid(this).name());
00032 m_Anisotropy_level=-1;
00033 m_Anisotropy=true;
00034 m_SGIS_Mimap=true;
00035 m_ARB_Texture_Compression=true;
00036 UnGuard
00037 }
00038
00039 ExCTexture::ExCTexture(std::string FileName)
00040 {
00041 Guard(ExCTexture::ExCTexture(std::string FileName))
00042 SetName("ExCTexture");
00043 SetType(typeid(this).name());
00044 LoadFile(FileName);
00045 UnGuard
00046 }
00047
00048 ExCTexture::~ExCTexture(void)
00049 {
00050 Guard(ExCTexture::~ExCTexture(void))
00051 UnGuard
00052 }
00053
00054 void ExCTexture::SetName(std::string Name)
00055 {
00056 Guard(void ExCTexture::SetName(std::string Name))
00057 if(Name.find(".")<Name.length())
00058 {
00059 Name.erase(Name.find("."),Name.length()-Name.find("."));
00060 m_ObjectName=Name;
00061 }else
00062 {
00063 m_ObjectName=Name;
00064 }
00065 UnGuard
00066 }
00067
00068 void ExCTexture::SetActive(void)
00069 {
00070 Guard(ExCTexture::SetActive(void))
00071
00072 glBindTexture(GL_TEXTURE_2D,m_Texture);
00073 UnGuard
00074 }
00075
00076
00077 bool ExCTexture::SaveFile(std::string FileName,int width,int height)
00078 {
00079 Guard(ExCTexture::SaveFile(std::string FileName,int width,int height))
00080 m_Image= new ExCImageLoader;
00081 return m_Image->SaveImage(FileName,width,height);
00082 delete m_Image;
00083 UnGuard
00084 }
00085
00086 bool ExCTexture::LoadFile(std::string FileName)
00087 {
00088 Guard(ExCTexture::LoadFile(std::string FileName))
00089
00090 m_ObjectFileName=FileName;
00091 m_Image= new ExCImageLoader;
00092 int Type = GL_RGB;
00093 int offset = 0;
00094 int size=0;
00095 int blockSize =0;
00096 std::string StrPath;
00097 SetName(FileName);
00098 #ifdef UNIX_SRC
00099 StrPath=PREFIX "/ExNihilo/Data/Textures/";
00100 #else
00101 StrPath="../Data/Textures/";
00102 #endif
00103
00104
00105 glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)wglGetProcAddress("glCompressedTexImage3DARB");
00106 glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)wglGetProcAddress("glCompressedTexImage2DARB");
00107 glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)wglGetProcAddress("glCompressedTexImage1DARB");
00108 glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)wglGetProcAddress("glCompressedTexSubImage3DARB");
00109 glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)wglGetProcAddress("glCompressedTexSubImage2DARB");
00110 glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)wglGetProcAddress("glCompressedTexSubImage1DARB");
00111 glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)wglGetProcAddress("glGetCompressedTexImageARB");
00112
00113 if(m_Image->LoadImage(StrPath+FileName))
00114 {
00115 SetName(FileName);
00116 glGenTextures(1,&m_Texture);
00117 glBindTexture(GL_TEXTURE_2D,m_Texture);
00118
00119
00120 switch (m_Image->m_TextureType)
00121 {
00122 case BMP:
00123
00124 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_COMPRESSED_RGB_ARB, m_Image->m_sizeX, m_Image->m_sizeY,
00125 GL_RGB, GL_UNSIGNED_BYTE, m_Image->m_data);
00126 m_ARB_Texture_Compression=true;
00127 break;
00128 case PCX:
00129
00130 gluBuild2DMipmaps(GL_TEXTURE_2D, GL_COMPRESSED_RGBA_ARB, m_Image->m_sizeX,m_Image->m_sizeY,
00131 GL_RGBA, GL_UNSIGNED_BYTE, m_Image->m_data);
00132 break;
00133 case TGA:
00134
00135 gluBuild2DMipmaps(GL_TEXTURE_2D,
00136 (m_Image->m_channels == 4) ? GL_COMPRESSED_RGBA_ARB : GL_COMPRESSED_RGB_ARB,
00137 m_Image->m_sizeX, m_Image->m_sizeY,
00138 Type, GL_UNSIGNED_BYTE, m_Image->m_data);
00139 m_ARB_Texture_Compression=true;
00140 break;
00141 case PPM:
00142
00143 gluBuild2DMipmaps(GL_TEXTURE_2D,GL_COMPRESSED_RGB_ARB, m_Image->m_sizeX, m_Image->m_sizeY,
00144 GL_RGB, GL_UNSIGNED_BYTE, m_Image->m_data);
00145 break;
00146 case DDS:
00147
00148
00149 blockSize = (m_Image->m_ddsFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
00150 for (int i = 0; i < m_Image->m_ddsNumMipmaps&& (m_Image->m_sizeX || m_Image->m_sizeY); ++i)
00151 {
00152
00153 if (m_Image->m_sizeX == 0)m_Image->m_sizeX = 1;
00154 if (m_Image->m_sizeY == 0)m_Image->m_sizeY = 1;
00155 size = ((m_Image->m_sizeX+3)/4)*((m_Image->m_sizeY+3)/4)*blockSize;
00156
00157 glCompressedTexImage2DARB(GL_TEXTURE_2D, i, m_Image->m_ddsFormat, m_Image->m_sizeX, m_Image->m_sizeY,
00158 0, size, m_Image->m_data );
00159
00160 offset += size;
00161 m_Image->m_sizeX>>= 1;
00162 m_Image->m_sizeY >>= 1;
00163 m_ARB_Texture_Compression=false;
00164
00165 }
00166 break;
00167 default:
00168 break;
00169 }
00170 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
00171 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
00172 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
00173
00174
00175
00176 if(m_SGIS_Mimap)
00177 {
00178 glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST);
00179
00180 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, true);
00181
00182 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
00183
00184 }else
00185 {
00186 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
00187 }
00188
00189
00190
00191
00192
00193
00194
00195 if(m_Anisotropy)
00196 {
00197 glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT,&m_Anisotropy_level);
00198 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_Anisotropy_level);
00199
00200 }
00201
00202
00203
00204
00205
00206 if(m_ARB_Texture_Compression)
00207 {
00208
00209 int compressed_size;
00210 int num_compressed_format;
00211 int * compressed_format = NULL;
00212 int compressed;
00213 int internalformat;
00214 unsigned char * img = NULL;
00215 glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, &num_compressed_format);
00216 compressed_format = (int*)malloc(num_compressed_format * sizeof(int));
00217 glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS_ARB, compressed_format);
00218
00219
00220 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &compressed);
00221
00222
00223 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internalformat);
00224
00225
00226
00227 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &compressed_size);
00228
00229
00230
00231 img = (unsigned char *)malloc(compressed_size * sizeof(unsigned char));
00232
00233
00234 glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, img);
00235
00236 glCompressedTexImage2DARB(GL_TEXTURE_2D, 0, internalformat, m_Image->m_sizeX, m_Image->m_sizeY, 0, compressed_size, img);
00237
00238 delete img;
00239 delete compressed_format;
00240
00241 }
00242 delete m_Image->m_data;
00243
00244
00245 return true;
00246 }
00247
00248 *Consol<<"ExCTexture Exception::unable to load file "<<FileName<<std::endl;
00249 delete m_Image;
00250 return false;
00251 UnGuard
00252 }
00253