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.     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  102.     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  103.     if(bLinear)
  104. {
  105. if(bMip)
  106. {
  107.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  108.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  109.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  110. }
  111. else
  112. {
  113.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  114.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  115.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  116. }
  117. }
  118. else
  119. {
  120. if(bMip)
  121. {
  122.            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  123.          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
  124.          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, 256, 256, GL_RGB, GL_UNSIGNED_BYTE, Image);
  125. }
  126. else
  127. {
  128.                 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  129.      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  130.              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, Image);
  131. }
  132. }
  133.     delete [] Image; // If Texture Image Exists
  134. return state;
  135. }
  136. /////////////////////////////////////////////////
  137. bool CTexture::MakeAlphaTextureBind(char* TextureFileName,unsigned int* TextureID)
  138. {
  139. bool status=true; // Status Indicator
  140. AUX_RGBImageRec *Image=NULL; // Create Storage Space For The Texture
  141. unsigned char *alpha=NULL;
  142. ////////////////////////////////////
  143. if (Image=auxDIBImageLoad(TextureFileName)) 
  144. {
  145. alpha=new unsigned char[4*Image->sizeX*Image->sizeY]; // Create Memory For RGBA8-Texture
  146. for (int a=0; a<Image->sizeX*Image->sizeY; a++)
  147. {
  148. alpha[4*a]=Image->data[a*3]; // R
  149. alpha[4*a+1]=Image->data[a*3+1]; // G
  150. alpha[4*a+2]=Image->data[a*3+2]; // B
  151.             ////////////Get max
  152.             alpha[4*a+3]=(alpha[4*a+0]<alpha[4*a+1])?alpha[4*a+0]:alpha[4*a+1];
  153.             if(alpha[4*a+2]<alpha[4*a+3])alpha[4*a+3]=alpha[4*a+2];
  154. }
  155. ///////////////////////////////////////////////
  156. glGenTextures(1, TextureID); // Create One Textures
  157. // Create Linear Filtered RGBA8-Texture
  158. glBindTexture(GL_TEXTURE_2D, *TextureID);
  159.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  160.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  161.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, Image->sizeX, Image->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
  162. delete [] alpha;
  163. }
  164. else status=false;
  165. if (Image) { // If Texture Exists
  166. if (Image->data) delete Image->data; // If Texture Image Exists
  167. delete Image;
  168. Image=NULL;
  169. }
  170. ///////////////////////////////////
  171.     return status;
  172. }
  173. bool CTexture::MakeAlphaTextureBind(char* TextureFileName,char *AlphaFileName,unsigned int* TextureID)
  174. {
  175. bool status=true; // Status Indicator
  176. AUX_RGBImageRec *Image=NULL; // Create Storage Space For The Texture
  177. unsigned char *alpha=NULL;
  178. ////////////////////////////////////
  179. if (Image=auxDIBImageLoad(TextureFileName)) 
  180. {
  181. alpha=new unsigned char[4*Image->sizeX*Image->sizeY]; // Create Memory For RGBA8-Texture
  182. for (int a=0; a<Image->sizeX*Image->sizeY; a++)
  183. {
  184. alpha[4*a]=Image->data[a*3]; // R
  185. alpha[4*a+1]=Image->data[a*3+1]; // G
  186. alpha[4*a+2]=Image->data[a*3+2]; // B
  187. }
  188. /////////////////make alpha chanal
  189.         if(AlphaFileName==NULL)return false;
  190.     FILE* file;
  191.         if((file= fopen(AlphaFileName, "rb"))==NULL)
  192.        return false;
  193. fseek(file,54,SEEK_SET);
  194. unsigned char temp[3];
  195. for ( a=0; a<Image->sizeX*Image->sizeY; a++)
  196. {
  197. fread(temp,sizeof(unsigned char),3,file);
  198.             alpha[4*a+3]=(temp[0]>temp[1])?temp[0]:temp[1];
  199.             if(temp[2]>alpha[4*a+3])alpha[4*a+3]=temp[2];
  200. //          alpha[4*a+3]=(temp[0]+temp[1]+temp[2])/3;
  201. if(alpha[4*a+3]>50)alpha[4*a+3]=255;
  202. }
  203. fclose(file);
  204. ///////////////////////////////////////////////
  205. glGenTextures(1, TextureID); // Create One Textures
  206. // Create Linear Filtered RGBA8-Texture
  207. glBindTexture(GL_TEXTURE_2D, *TextureID);
  208.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  209.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  210.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, Image->sizeX, Image->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, alpha);
  211. delete [] alpha;
  212. }
  213. else status=false;
  214. if (Image) { // If Texture Exists
  215. if (Image->data) delete Image->data; // If Texture Image Exists
  216. delete Image;
  217. Image=NULL;
  218. }
  219. ///////////////////////////////////
  220.     return status;
  221. }
  222. bool CTexture::MakeTGAAlphaBind(char* TextureFileName,unsigned int* TextureID)
  223. {
  224. FILE * fTGA; // File pointer to texture file
  225. fTGA = fopen(TextureFileName, "rb"); // Open file for reading
  226.     TGAHeader tgaheader; // TGA header
  227. Texture texture;
  228. if(fTGA == NULL) // If it didn't open....
  229. {
  230. MessageBox(NULL, "Could not open texture file", "ERROR", MB_OK); // Display an error message
  231. return false; // Exit function
  232. }
  233. if(fread(&tgaheader, sizeof(TGAHeader), 1, fTGA) == 0) // Attempt to read 12 byte header from file
  234. {
  235. MessageBox(NULL, "Could not read file header", "ERROR", MB_OK); // If it fails, display an error message 
  236. if(fTGA != NULL) // Check to seeiffile is still open
  237. {
  238. fclose(fTGA); // If it is, close it
  239. }
  240. return false; // Exit function
  241. }
  242.     GLubyte uTGAcompare[12] = {0,0,2, 0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
  243.     GLubyte cTGAcompare[12] = {0,0,10,0,0,0,0,0,0,0,0,0}; // Compressed TGA Header
  244. if(memcmp(uTGAcompare, &tgaheader, sizeof(tgaheader)) == 0) // See if header matches the predefined header of 
  245. { // an Uncompressed TGA image
  246. LoadUncompressedTGA(&texture, TextureFileName, fTGA); // If so, jump to Uncompressed TGA loading code
  247. }
  248. else if(memcmp(cTGAcompare, &tgaheader, sizeof(tgaheader)) == 0) // See if header matches the predefined header of
  249. { // an RLE compressed TGA image
  250. LoadCompressedTGA(&texture, TextureFileName, fTGA); // If so, jump to Compressed TGA loading code
  251. }
  252. else // If header matches neither type
  253. {
  254. MessageBox(NULL, "TGA file be type 2 or type 10 ", "Invalid Image", MB_OK); // Display an error
  255. fclose(fTGA);
  256. return false; // Exit function
  257. }
  258.     //////////////////////////////////////////////////////////
  259. glGenTextures(1, TextureID); // Create One Textures
  260. // Create Linear Filtered RGBA8-Texture
  261. glBindTexture(GL_TEXTURE_2D, *TextureID);
  262.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  263.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
  264.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, texture.width, texture.height, texture.type, GL_UNSIGNED_BYTE, texture.imageData);
  265. delete [] texture.imageData;
  266. return true;
  267. }
  268. bool CTexture::LoadUncompressedTGA(Texture * texture, char * filename, FILE * fTGA)
  269. {
  270.     TGA tga;
  271. if(fread(tga.header, sizeof(tga.header), 1, fTGA) == 0) // Read TGA header
  272. {
  273. MessageBox(NULL, "Could not read info header", "ERROR", MB_OK); // Display error
  274. if(fTGA != NULL) // if file is still open
  275. {
  276. fclose(fTGA); // Close it
  277. }
  278. return false; // Return failular
  279. }
  280. texture->width  = tga.header[1] * 256 + tga.header[0]; // Determine The TGA Width (highbyte*256+lowbyte)
  281. texture->height = tga.header[3] * 256 + tga.header[2]; // Determine The TGA Height (highbyte*256+lowbyte)
  282. texture->bpp = tga.header[4]; // Determine the bits per pixel
  283. tga.Width = texture->width; // Copy width into local structure
  284. tga.Height = texture->height; // Copy height into local structure
  285. tga.Bpp = texture->bpp; // Copy BPP into local structure
  286. if((texture->width <= 0) || (texture->height <= 0) || ((texture->bpp != 24) && (texture->bpp !=32))) // Make sure all information is valid
  287. {
  288. MessageBox(NULL, "Invalid texture information", "ERROR", MB_OK); // Display Error
  289. if(fTGA != NULL) // Check if file is still open
  290. {
  291. fclose(fTGA); // If so, close it
  292. }
  293. return false; // Return failed
  294. }
  295. if(texture->bpp == 24) //If the BPP of the image is 24...
  296. {
  297. texture->type = GL_RGB; // Set Image type to GL_RGB
  298. }
  299. else // Else if its 32 BPP
  300. {
  301. texture->type = GL_RGBA; // Set image type to GL_RGBA
  302. }
  303. tga.bytesPerPixel = (tga.Bpp / 8); // Compute the number of BYTES per pixel
  304. tga.imageSize = (tga.bytesPerPixel * tga.Width * tga.Height); // Compute the total amout ofmemory needed to store data
  305. texture->imageData =new  GLubyte[tga.imageSize]; // Allocate that much memory
  306. if(texture->imageData == NULL) // If no space was allocated
  307. {
  308. MessageBox(NULL, "Could not allocate memory for image", "ERROR", MB_OK); // Display Error
  309. fclose(fTGA); // Close the file
  310. return false; // Return failed
  311. }
  312. if(fread(texture->imageData, 1, tga.imageSize, fTGA) != tga.imageSize) // Attempt to read image data
  313. {
  314. MessageBox(NULL, "Could not read image data", "ERROR", MB_OK); // Display Error
  315. if(texture->imageData != NULL) // If imagedata has data in it
  316. {
  317. free(texture->imageData); // Delete data from memory
  318. }
  319. fclose(fTGA); // Close file
  320. return false; // Return failed
  321. }
  322. for(GLuint cswap = 0;  cswap < (int)tga.imageSize; cswap += tga.bytesPerPixel) // Swap color bytes from BGR to RGB
  323. {
  324. tga.temp = texture->imageData[cswap];
  325. texture->imageData[cswap] = texture->imageData[cswap + 2];
  326. texture->imageData[cswap + 2] = tga.temp;
  327. }
  328. fclose(fTGA);
  329.     return true;
  330. }
  331. bool CTexture::LoadCompressedTGA(Texture * texture, char * filename, FILE * fTGA)
  332. {
  333.     return false;
  334. }
  335. bool  CTexture::MakeScreenTextureBind(unsigned int* TextureID)
  336. {
  337. //
  338. if(glIsTexture(* TextureID)==GL_TRUE)
  339. {
  340. //    glBindTexture(GL_TEXTURE_2D, *TextureID);
  341. // glCopyTexSubImage2D(GL_TEXTURE_2D, 0,  0,0,   0,0,  512,512 );
  342. }
  343. else
  344. {
  345. GLint Viewport[4];
  346.         glGetIntegerv(GL_VIEWPORT, Viewport);
  347. int newWidth=128;
  348.         unsigned char *pData=new unsigned char[newWidth*newWidth*3+6]; // +6 for safe
  349. /////////////找到pData(x,y)对应屏幕上的象素点(sx,sy)
  350. int sx,sy;  //标记新的位置
  351.         unsigned char temp[6];
  352. for(int y=0;y<newWidth;y++)
  353. for(int x=0;x<newWidth;x++)
  354. {
  355.     sx=int(float(x*Viewport[2])/newWidth);
  356.     sy=int(float(y*Viewport[3])/newWidth);
  357.          glReadPixels(sx,sy,1,1,
  358.                  GL_RGB,GL_UNSIGNED_BYTE,temp);
  359.                 pData[y*newWidth*3+x*3+0]=unsigned char(temp[0]*0.8f);
  360.                 pData[y*newWidth*3+x*3+1]=unsigned char(temp[1]*0.8f);
  361.                 pData[y*newWidth*3+x*3+2]=unsigned char(temp[2]*0.8f);
  362. }
  363.         ////////////////////////////////////////////////////////////
  364. glGenTextures(1, TextureID); // Create one Texture
  365.     glBindTexture(GL_TEXTURE_2D, *TextureID);
  366.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  367.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  368.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, newWidth,newWidth, 0, GL_RGB, GL_UNSIGNED_BYTE,pData);
  369. delete [] pData;
  370. }
  371.     return true;
  372. }
  373. CTexture::~CTexture()
  374. {
  375. }