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

游戏引擎

开发平台:

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. /* for(int y=0;y<Image->sizeY;y+=2)
  21. for(int x=0;x<Image->sizeX;x++)
  22. {
  23. Image->data[y*Image->sizeY*3+x*3+0]=0;
  24. Image->data[y*Image->sizeY*3+x*3+1]=0;
  25. Image->data[y*Image->sizeY*3+x*3+2]=0;
  26. }*/
  27. glGenTextures(1, TextureID); // Create one Texture
  28.     glBindTexture(GL_TEXTURE_2D, *TextureID);
  29.         if(bLinear)
  30. {
  31. ///////////////////////////////
  32. if(bMip)
  33. {
  34.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  35.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  36.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  37.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  38.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, Image->sizeX, Image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  39. }
  40. else
  41. {
  42.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  43.                 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  44.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  45.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  46.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Image->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  47. }
  48. }
  49. else
  50. {
  51. if(bMip)
  52. {
  53.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  54.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  55.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, Image->sizeX, Image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  56. }
  57. else
  58. {
  59.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  60.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  61.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Image->sizeX, Image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Image->data);
  62. }
  63. }
  64. }
  65. else status=false;
  66. if (Image) { // If Texture Exists
  67. if (Image->data) delete Image->data; // If Texture Image Exists
  68. delete Image;
  69. }
  70. return status;
  71. }
  72. bool CTexture::MakeSkinTextureBind(char* TextureFileName,unsigned int* TextureID,
  73.    bool bLinear,bool bMip)
  74. {
  75. bool state=true; // Status Indicator
  76. unsigned char *Image=new unsigned char [256*256*3];
  77. FILE* file;
  78.     if((file= fopen(TextureFileName, "rb"))==NULL)
  79. {
  80.     state=false;
  81. return state;
  82. }
  83. char id[10],version;
  84. fread(id,     sizeof(char),10,  file);
  85. fread(&version,sizeof(char),1,  file);
  86. if ( strncmp( id, "Hunter3D00", 10 ) != 0 )
  87. {
  88.     fclose(file);
  89.     return false; // "Not a valid .skn file."
  90. }
  91. if ( version !=1 )
  92. {
  93.     fclose(file);
  94.     return false; // "Not a valid .skn file."
  95. }
  96. fread(Image,sizeof(unsigned char),256*256*3,file);
  97.     fclose(file);
  98.     file=NULL;
  99. glGenTextures(1, TextureID); // Create one Texture
  100. glBindTexture(GL_TEXTURE_2D, *TextureID);
  101.     if(bLinear)
  102. {
  103. if(bMip)
  104. {
  105.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  106.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  107.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  108. }
  109. else
  110. {
  111.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  112.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  113.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  114. }
  115. }
  116. else
  117. {
  118. if(bMip)
  119. {
  120.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  121.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  122.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  123. }
  124. else
  125. {
  126.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  127.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  128.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  129. }
  130. }
  131.     delete [] Image; // If Texture Image Exists
  132. return state;
  133. }
  134. /////////////////////////////////////////////////
  135. bool CTexture::MakeAlphaTextureBind(char* TextureFileName,unsigned int* TextureID)
  136. {
  137. bool status=true; // Status Indicator
  138. AUX_RGBImageRec *Image=NULL; // Create Storage Space For The Texture
  139. unsigned char *alpha=NULL;
  140. ////////////////////////////////////
  141. if (Image=auxDIBImageLoad(TextureFileName)) 
  142. {
  143. alpha=new unsigned char[4*Image->sizeX*Image->sizeY]; // Create Memory For RGBA8-Texture
  144. for (int a=0; a<Image->sizeX*Image->sizeY; a++)
  145. {
  146. alpha[4*a]=Image->data[a*3]; // R
  147. alpha[4*a+1]=Image->data[a*3+1]; // G
  148. alpha[4*a+2]=Image->data[a*3+2]; // B
  149.             ////////////Get max
  150.             alpha[4*a+3]=(alpha[4*a+0]<alpha[4*a+1])?alpha[4*a+0]:alpha[4*a+1];
  151.             if(alpha[4*a+2]<alpha[4*a+3])alpha[4*a+3]=alpha[4*a+2];
  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. bool  CTexture::MakeScreenTextureBind(unsigned int* TextureID)
  334. {
  335. //
  336. if(glIsTexture(* TextureID)==GL_TRUE)
  337. {
  338. //    glBindTexture(GL_TEXTURE_2D, *TextureID);
  339. // glCopyTexSubImage2D(GL_TEXTURE_2D, 0,  0,0,   0,0,  512,512 );
  340. }
  341. else
  342. {
  343. GLint Viewport[4];
  344.         glGetIntegerv(GL_VIEWPORT, Viewport);
  345. int newWidth=128;
  346.         unsigned char *pData=new unsigned char[newWidth*newWidth*3+6]; // +6 for safe
  347. /////////////找到pData(x,y)对应屏幕上的象素点(sx,sy)
  348. int sx,sy;  //标记新的位置
  349.         unsigned char temp[6];
  350. for(int y=0;y<newWidth;y++)
  351. for(int x=0;x<newWidth;x++)
  352. {
  353.     sx=int(float(x*Viewport[2])/newWidth);
  354.     sy=int(float(y*Viewport[3])/newWidth);
  355.          glReadPixels(sx,sy,1,1,
  356.                  GL_RGB,GL_UNSIGNED_BYTE,temp);
  357.                 pData[y*newWidth*3+x*3+0]=unsigned char(temp[0]*0.8f);
  358.                 pData[y*newWidth*3+x*3+1]=unsigned char(temp[1]*0.8f);
  359.                 pData[y*newWidth*3+x*3+2]=unsigned char(temp[2]*0.8f);
  360. }
  361.         ////////////////////////////////////////////////////////////
  362. glGenTextures(1, TextureID); // Create one Texture
  363.     glBindTexture(GL_TEXTURE_2D, *TextureID);
  364.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  365.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  366.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, newWidth,newWidth, 0, GL_RGB, GL_UNSIGNED_BYTE,pData);
  367. delete [] pData;
  368. }
  369.     return true;
  370. }
  371. CTexture::~CTexture()
  372. {
  373. }