Texture.cpp
上传用户:hkb425
上传日期:2007-06-16
资源大小:34191k
文件大小:14k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. // Texture.cpp: implementation of the CTexture class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Texture.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. CTexture::CTexture()
  10. {
  11. }
  12. bool CTexture::MakeTextureBind(char* TextureFileName,unsigned int* TextureID,
  13.    bool bLinear,bool bMip)
  14. {
  15. bool status=true; // Status Indicator
  16. AUX_RGBImageRec *Image=NULL;
  17.      ///////////////////load wall tex
  18. if (Image=auxDIBImageLoad(TextureFileName))
  19. {
  20. glGenTextures(1, TextureID); // Create one Texture
  21.     glBindTexture(GL_TEXTURE_2D, *TextureID);
  22.         if(bLinear)
  23. {
  24. if(bMip)
  25. {
  26. //                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  27. //                glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  28.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  29.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  30.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, Image->sizeX, Image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  31. }
  32. else
  33. {
  34.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  35.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  36.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  37.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  38.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Image->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  39. }
  40. }
  41. else
  42. {
  43. if(bMip)
  44. {
  45.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  46.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  47.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, Image->sizeX, Image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  48. }
  49. else
  50. {
  51.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  52.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  53.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Image->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  54. }
  55. }
  56. }
  57. else status=false;
  58. if (Image) { // If Texture Exists
  59. if (Image->data) delete Image->data; // If Texture Image Exists
  60. delete Image;
  61. }
  62. return status;
  63. }
  64. bool CTexture::MakeSkinTextureBind(char* TextureFileName,unsigned int* TextureID,
  65.    bool bLinear,bool bMip)
  66. {
  67. bool state=true; // Status Indicator
  68. unsigned char *Image=new unsigned char [256*256*3];
  69. FILE* file;
  70.     if((file= fopen(TextureFileName, "rb"))==NULL)
  71. {
  72.     state=false;
  73. return state;
  74. }
  75. char id[10],version;
  76. fread(id,     sizeof(char),10,  file);
  77. fread(&version,sizeof(char),1,  file);
  78. if ( strncmp( id, "Hunter3D00", 10 ) != 0 )
  79. {
  80.     fclose(file);
  81.     return false; // "Not a valid .skn file."
  82. }
  83. if ( version !=1 )
  84. {
  85.     fclose(file);
  86.     return false; // "Not a valid .skn file."
  87. }
  88. fread(Image,sizeof(unsigned char),256*256*3,file);
  89.     fclose(file);
  90.     file=NULL;
  91. glGenTextures(1, TextureID); // Create one Texture
  92. glBindTexture(GL_TEXTURE_2D, *TextureID);
  93.     if(bLinear)
  94. {
  95. if(bMip)
  96. {
  97.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  98.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  99.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  100. }
  101. else
  102. {
  103.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  104.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  105.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  106. }
  107. }
  108. else
  109. {
  110. if(bMip)
  111. {
  112.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  113.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  114.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  115. }
  116. else
  117. {
  118.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  119.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  120.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  121. }
  122. }
  123.     delete [] Image; // If Texture Image Exists
  124. return state;
  125. }
  126. /////////////////////////////////////////////////
  127. bool CTexture::MakeAlphaTextureBind(char* TextureFileName,unsigned int* TextureID)
  128. {
  129. bool status=true; // Status Indicator
  130. AUX_RGBImageRec *Image=NULL; // Create Storage Space For The Texture
  131. unsigned char *alpha=NULL;
  132. ////////////////////////////////////
  133. if (Image=auxDIBImageLoad(TextureFileName)) 
  134. {
  135. alpha=new unsigned char[4*Image->sizeX*Image->sizeY]; // Create Memory For RGBA8-Texture
  136. for (int a=0; a<Image->sizeX*Image->sizeY; a++)
  137. {
  138. alpha[4*a]=Image->data[a*3]; // R
  139. alpha[4*a+1]=Image->data[a*3+1]; // G
  140. alpha[4*a+2]=Image->data[a*3+2]; // B
  141. ////////////Get max
  142.             alpha[4*a+3]=(alpha[4*a+0]<alpha[4*a+1])?alpha[4*a+0]:alpha[4*a+1];
  143.             if(alpha[4*a+2]<alpha[4*a+3])alpha[4*a+3]=alpha[4*a+2];
  144. //            alpha[4*a+3]=255-alpha[4*a+3];
  145.             /////////// get average
  146. // alpha[4*a+3]=unsigned char((alpha[4*a]+alpha[4*a+1]+alpha[4*a+2])/3);
  147. // alpha[4*a+3]=255-alpha[4*a+3];
  148. // if(alpha[4*a+3]>60)alpha[4*a+3]=255;
  149. // if(alpha[4*a+0]==255 && alpha[4*a+1]==255 &&alpha[4*a+2]==255)alpha[4*a+3]=0;
  150. // else alpha[4*a+3]=255;
  151. }
  152. ////////////////均色处理///////////////////
  153. ///////////////////////////////////////////////
  154. glGenTextures(1, TextureID); // Create One Textures
  155. // Create Linear Filtered RGBA8-Texture
  156. glBindTexture(GL_TEXTURE_2D, *TextureID);
  157.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  158.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  159.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, Image->sizeX, Image->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
  160. delete [] alpha;
  161. }
  162. else status=false;
  163. if (Image) { // If Texture Exists
  164. if (Image->data) delete Image->data; // If Texture Image Exists
  165. delete Image;
  166. Image=NULL;
  167. }
  168. ///////////////////////////////////
  169.     return status;
  170. }
  171. bool CTexture::MakeAlphaTextureBind(char* TextureFileName,char *AlphaFileName,unsigned int* TextureID)
  172. {
  173. bool status=true; // Status Indicator
  174. AUX_RGBImageRec *Image=NULL; // Create Storage Space For The Texture
  175. unsigned char *alpha=NULL;
  176. ////////////////////////////////////
  177. if (Image=auxDIBImageLoad(TextureFileName)) 
  178. {
  179. alpha=new unsigned char[4*Image->sizeX*Image->sizeY]; // Create Memory For RGBA8-Texture
  180. for (int a=0; a<Image->sizeX*Image->sizeY; a++)
  181. {
  182. alpha[4*a]=Image->data[a*3]; // R
  183. alpha[4*a+1]=Image->data[a*3+1]; // G
  184. alpha[4*a+2]=Image->data[a*3+2]; // B
  185. }
  186. /////////////////make alpha chanal
  187.         if(AlphaFileName==NULL)return false;
  188.     FILE* file;
  189.         if((file= fopen(AlphaFileName, "rb"))==NULL)
  190.        return false;
  191. fseek(file,54,SEEK_SET);
  192. unsigned char temp[3];
  193. for ( a=0; a<Image->sizeX*Image->sizeY; a++)
  194. {
  195. fread(temp,sizeof(unsigned char),3,file);
  196.             alpha[4*a+3]=(temp[0]>temp[1])?temp[0]:temp[1];
  197.             if(temp[2]>alpha[4*a+3])alpha[4*a+3]=temp[2];
  198. //          alpha[4*a+3]=(temp[0]+temp[1]+temp[2])/3;
  199. if(alpha[4*a+3]>50)alpha[4*a+3]=255;
  200. }
  201. fclose(file);
  202. ///////////////////////////////////////////////
  203. glGenTextures(1, TextureID); // Create One Textures
  204. // Create Linear Filtered RGBA8-Texture
  205. glBindTexture(GL_TEXTURE_2D, *TextureID);
  206.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  207.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  208.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, Image->sizeX, Image->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
  209. delete [] alpha;
  210. }
  211. else status=false;
  212. if (Image) { // If Texture Exists
  213. if (Image->data) delete Image->data; // If Texture Image Exists
  214. delete Image;
  215. Image=NULL;
  216. }
  217. ///////////////////////////////////
  218.     return status;
  219. }
  220. bool CTexture::MakeTGAAlphaBind(char* TextureFileName,unsigned int* TextureID)
  221. {
  222. FILE * fTGA; // File pointer to texture file
  223. fTGA = fopen(TextureFileName, "rb"); // Open file for reading
  224.     TGAHeader tgaheader; // TGA header
  225. Texture texture;
  226. if(fTGA == NULL) // If it didn't open....
  227. {
  228. MessageBox(NULL, "Could not open texture file", "ERROR", MB_OK); // Display an error message
  229. return false; // Exit function
  230. }
  231. if(fread(&tgaheader, sizeof(TGAHeader), 1, fTGA) == 0) // Attempt to read 12 byte header from file
  232. {
  233. MessageBox(NULL, "Could not read file header", "ERROR", MB_OK); // If it fails, display an error message 
  234. if(fTGA != NULL) // Check to seeiffile is still open
  235. {
  236. fclose(fTGA); // If it is, close it
  237. }
  238. return false; // Exit function
  239. }
  240.     GLubyte uTGAcompare[12] = {0,0,2, 0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
  241.     GLubyte cTGAcompare[12] = {0,0,10,0,0,0,0,0,0,0,0,0}; // Compressed TGA Header
  242. if(memcmp(uTGAcompare, &tgaheader, sizeof(tgaheader)) == 0) // See if header matches the predefined header of 
  243. { // an Uncompressed TGA image
  244. LoadUncompressedTGA(&texture, TextureFileName, fTGA); // If so, jump to Uncompressed TGA loading code
  245. }
  246. else if(memcmp(cTGAcompare, &tgaheader, sizeof(tgaheader)) == 0) // See if header matches the predefined header of
  247. { // an RLE compressed TGA image
  248. LoadCompressedTGA(&texture, TextureFileName, fTGA); // If so, jump to Compressed TGA loading code
  249. }
  250. else // If header matches neither type
  251. {
  252. MessageBox(NULL, "TGA file be type 2 or type 10 ", "Invalid Image", MB_OK); // Display an error
  253. fclose(fTGA);
  254. return false; // Exit function
  255. }
  256.     //////////////////////////////////////////////////////////
  257. glGenTextures(1, TextureID); // Create One Textures
  258. // Create Linear Filtered RGBA8-Texture
  259. glBindTexture(GL_TEXTURE_2D, *TextureID);
  260.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  261.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  262.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, texture.width, texture.height, texture.type, GL_UNSIGNED_BYTE, texture.imageData);
  263. delete [] texture.imageData;
  264. return true;
  265. }
  266. bool CTexture::LoadUncompressedTGA(Texture * texture, char * filename, FILE * fTGA)
  267. {
  268.     TGA tga;
  269. if(fread(tga.header, sizeof(tga.header), 1, fTGA) == 0) // Read TGA header
  270. {
  271. MessageBox(NULL, "Could not read info header", "ERROR", MB_OK); // Display error
  272. if(fTGA != NULL) // if file is still open
  273. {
  274. fclose(fTGA); // Close it
  275. }
  276. return false; // Return failular
  277. }
  278. texture->width  = tga.header[1] * 256 + tga.header[0]; // Determine The TGA Width (highbyte*256+lowbyte)
  279. texture->height = tga.header[3] * 256 + tga.header[2]; // Determine The TGA Height (highbyte*256+lowbyte)
  280. texture->bpp = tga.header[4]; // Determine the bits per pixel
  281. tga.Width = texture->width; // Copy width into local structure
  282. tga.Height = texture->height; // Copy height into local structure
  283. tga.Bpp = texture->bpp; // Copy BPP into local structure
  284. if((texture->width <= 0) || (texture->height <= 0) || ((texture->bpp != 24) && (texture->bpp !=32))) // Make sure all information is valid
  285. {
  286. MessageBox(NULL, "Invalid texture information", "ERROR", MB_OK); // Display Error
  287. if(fTGA != NULL) // Check if file is still open
  288. {
  289. fclose(fTGA); // If so, close it
  290. }
  291. return false; // Return failed
  292. }
  293. if(texture->bpp == 24) //If the BPP of the image is 24...
  294. {
  295. texture->type = GL_RGB; // Set Image type to GL_RGB
  296. }
  297. else // Else if its 32 BPP
  298. {
  299. texture->type = GL_RGBA; // Set image type to GL_RGBA
  300. }
  301. tga.bytesPerPixel = (tga.Bpp / 8); // Compute the number of BYTES per pixel
  302. tga.imageSize = (tga.bytesPerPixel * tga.Width * tga.Height); // Compute the total amout ofmemory needed to store data
  303. texture->imageData =new  GLubyte[tga.imageSize]; // Allocate that much memory
  304. if(texture->imageData == NULL) // If no space was allocated
  305. {
  306. MessageBox(NULL, "Could not allocate memory for image", "ERROR", MB_OK); // Display Error
  307. fclose(fTGA); // Close the file
  308. return false; // Return failed
  309. }
  310. if(fread(texture->imageData, 1, tga.imageSize, fTGA) != tga.imageSize) // Attempt to read image data
  311. {
  312. MessageBox(NULL, "Could not read image data", "ERROR", MB_OK); // Display Error
  313. if(texture->imageData != NULL) // If imagedata has data in it
  314. {
  315. free(texture->imageData); // Delete data from memory
  316. }
  317. fclose(fTGA); // Close file
  318. return false; // Return failed
  319. }
  320. for(GLuint cswap = 0;  cswap < (int)tga.imageSize; cswap += tga.bytesPerPixel) // Swap color bytes from BGR to RGB
  321. {
  322. tga.temp = texture->imageData[cswap];
  323. texture->imageData[cswap] = texture->imageData[cswap + 2];
  324. texture->imageData[cswap + 2] = tga.temp;
  325. }
  326. fclose(fTGA);
  327.     return true;
  328. }
  329. bool CTexture::LoadCompressedTGA(Texture * texture, char * filename, FILE * fTGA)
  330. {
  331.     return false;
  332. }
  333. CTexture::~CTexture()
  334. {
  335. }