afResourceManager.cpp
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:4k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "d3dx9tex.h"
  3. #include "afApplication.h"
  4. #include "afResourceManager.h"
  5. #include "afLog.h"
  6. #include "afSettings.h"
  7. #include "afTexture.h"
  8. #include <direct.h>
  9. static LPDIRECT3DDEVICE9 pd3dDevice = NULL;
  10. static afTexture* textures[afResourceManager::MAX_TEXTURES];
  11. static afPtrList<afImage> imageList;
  12. afTexture* getLoadedTexture(int nID);
  13. afTexture* getLoadedTexture(const afString& nName);
  14. int getLoadedTextureID(const afString& nName);
  15. void afResourceManager::init()
  16. {
  17. for(int i=0; i<MAX_TEXTURES; i++)
  18. textures[i] = NULL;
  19. pd3dDevice =g_pApp->m_pd3dDevice;
  20. if(pd3dDevice==NULL)
  21. afLog::error("afResourceManager::init failed: d3d device not available");
  22. }
  23. void afResourceManager::deinit()
  24. {
  25.  for(int i=0;i<MAX_TEXTURES;i++)
  26.  {
  27.  SAFE_DELETE(textures[i]);
  28.  }
  29.  for(i=0;i<imageList.getSize();i++)
  30.  {
  31.  afImage* p=imageList[i];
  32.  SAFE_DELETE(p);
  33.  }
  34. }
  35. afImage* afResourceManager::getRawImage(const afString& nFileName, int nWidth, int nHeight, afImage::FORMAT nFormat)
  36. {
  37. int size = nWidth * nHeight * afImage::getPixelSize(nFormat), read;
  38. FILE* fp;
  39. unsigned char* data;
  40. afImage* img;
  41. afString fullName;
  42. fullName = afSettings::tmpFullPath(nFileName, ".raw");
  43. if(size==0)
  44. {
  45. afLog::error("can not load raw image '%s': illegal image properties", nFileName);
  46. return NULL;
  47. }
  48. fp=fopen(fullName, "rb");
  49. if(fp==NULL)
  50. {
  51. afLog::error("can not load raw image '%s': file not found", nFileName);
  52. return NULL;
  53. }
  54. data = new unsigned char[size];
  55. read = fread(data, 1, size, fp);
  56. if(read!=size)
  57. {
  58. afLog::error("loading raw image '%s' with %d x %d pixels (%d bytes) failed: file not large enough", nFileName, nWidth, nHeight, size);
  59. fclose(fp);
  60. return NULL;
  61. }
  62. img = new afImage(nWidth, nHeight, nFormat, nFileName, data, false);
  63. imageList.addTail(img);
  64. fclose(fp);
  65. afLog::info("raw image '%s' (%dx%d %dbits) loaded", nFileName, nWidth, nHeight, 8*afImage::getPixelSize(nFormat));
  66. return img;
  67. }
  68. afTexture* afResourceManager::getTexture(const afString& nFileName, afImage::FORMAT nFormat)
  69. {
  70. afString fName0, fName1, fName2, fName3;
  71. int i;
  72. if(pd3dDevice==NULL)
  73. {
  74. afLog::error("can not load texture '%s': d3d device not set yet",nFileName);
  75. return NULL;
  76. }
  77.     afTexture* tex = getLoadedTexture(nFileName);
  78. if(tex!=NULL) // already loaded ???
  79. return tex;
  80. for(i=0; i<MAX_TEXTURES; i++)
  81. if(textures[i] == NULL)
  82. {
  83. LPDIRECT3DTEXTURE9 tex = NULL;
  84. D3DXIMAGE_INFO imgInfo;
  85. fName0 = afSettings::tmpFullPath(nFileName, ".dds");
  86. fName1 = afSettings::tmpFullPath(nFileName, ".tga");
  87. fName2 = afSettings::tmpFullPath(nFileName, ".jpg");
  88. fName3 = afSettings::tmpFullPath(nFileName, ".bmp");
  89. D3DFORMAT fmt = afImage::getD3DFormat(nFormat);
  90. if(FAILED(D3DXCreateTextureFromFileEx(pd3dDevice,fName0,D3DX_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0,fmt,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,0,&imgInfo,NULL,&tex)))
  91. if(FAILED(D3DXCreateTextureFromFileEx(pd3dDevice,fName1,D3DX_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0,fmt,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,0,&imgInfo,NULL,&tex)))
  92. if(FAILED(D3DXCreateTextureFromFileEx(pd3dDevice,fName2,D3DX_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0,fmt,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,0,&imgInfo,NULL,&tex)))
  93. if(FAILED(D3DXCreateTextureFromFileEx(pd3dDevice,fName3,D3DX_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0,fmt,D3DPOOL_MANAGED,D3DX_DEFAULT,D3DX_DEFAULT,0,&imgInfo,NULL,&tex)))
  94. {
  95. afLog::error("texture '%s' not found: using 'texture_not_found'", nFileName);
  96. return NULL;
  97. }
  98. textures[i] = new afTexture(nFileName, tex, imgInfo.Width, imgInfo.Height,
  99. (afImage::FORMAT)imgInfo.Format);
  100. afLog::info("texture '%s' (%dx%d %s) loaded", nFileName, imgInfo.Width, imgInfo.Height, afImage::getFormatString((afImage::FORMAT)imgInfo.Format));
  101. return textures[i];
  102. }
  103. afLog::error("can not load texture '%s': too many textures in memory (%d)", nFileName, MAX_TEXTURES);
  104. return NULL;
  105. }
  106. afTexture* getLoadedTexture(int nID)
  107. {
  108. if(nID>=afResourceManager::MAX_TEXTURES || nID<0)
  109. return NULL;
  110. return textures[nID];
  111. }
  112. afTexture* getLoadedTexture(const afString& nName)
  113. {
  114. return getLoadedTexture(getLoadedTextureID(nName));
  115. }
  116. int getLoadedTextureID(const afString& nName)
  117. {
  118. for(int i=0; i<afResourceManager::MAX_TEXTURES; i++)
  119. if(textures[i]!=NULL && textures[i]->getName()==nName)
  120. return i;
  121. return -1;
  122. }