texture_assembler.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "texture_assembler.h"
  2. #include "sprite_object.h"
  3. #include "hgesprite.h"
  4. void CTextureAssembler::ClearResources()
  5. {
  6. GfxObjIterator it;
  7. for(it = obj_list.begin( ); it != obj_list.end( ); it++)
  8. delete *it;
  9. obj_list.clear();
  10. }
  11. bool CTextureAssembler::CheckMask(char *name, char *mask_set, bool bMaskInclusive)
  12. {
  13. char *mask;
  14. int mask_len;
  15. int name_len;
  16. bool match;
  17. if(!mask_set || !*mask_set) return true;
  18. mask = mask_set;
  19. name_len = strlen(name);
  20. while(*mask)
  21. {
  22. mask_len = strlen(mask);
  23. match = (name_len >= mask_len) && !memcmp(name, mask, mask_len);
  24. if(match && bMaskInclusive) return true;
  25. if(!match && !bMaskInclusive) return true;
  26. mask += strlen(mask) + 1;
  27. }
  28. return false;
  29. }
  30. CGfxObject *CTextureAssembler::FindObj(GfxObjList objlist, char *name)
  31. {
  32. GfxObjIterator it;
  33. for(it = obj_list.begin( ); it != obj_list.end( ); it++)
  34. if(!strcmp((*it)->GetName(), name)) return *it;
  35. return 0;
  36. }
  37. void CTextureAssembler::AccumulateRMResources(hgeResourceManager *rm, int resgroup, char *mask_set, bool bMaskInclusive)
  38. {
  39. ResDesc *resdesc;
  40. // RES_SPRITE
  41. resdesc = rm->res[7];
  42. while(resdesc)
  43. {
  44. if(!resgroup || resdesc->resgroup == resgroup)
  45. if(CheckMask(resdesc->name, mask_set, bMaskInclusive))
  46. if(!FindObj(obj_list, resdesc->name))
  47. {
  48. obj_list.push_back(new CSpriteObject((hgeSprite *)resdesc->Get(rm), resdesc->name, resdesc->resgroup, false));
  49. }
  50. resdesc = resdesc->next;
  51. }
  52. }
  53. void CTextureAssembler::AccumulateFileResources(char *wildcard, int resgroup, char *mask_set, bool bMaskInclusive)
  54. {
  55. HANDLE hSearch;
  56. WIN32_FIND_DATA SearchData;
  57. char filename[MAX_PATH];
  58. char temp[MAX_PATH];
  59. char *buf;
  60. HTEXTURE tex;
  61. hgeSprite *spr;
  62. hSearch = FindFirstFile(wildcard, &SearchData);
  63. if(hSearch == INVALID_HANDLE_VALUE)
  64. {
  65. SysLog("Can't find the path: %sn", wildcard);
  66. return;
  67. }
  68. do
  69. {
  70. // recurse subfolders
  71. if(SearchData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  72. {
  73. if(SearchData.cFileName[0] == '.') continue;
  74. strcpy(filename, wildcard);
  75. buf=strrchr(filename, '\');
  76. if(!buf) buf=filename; else buf++;
  77. strcpy(temp, buf);
  78. strcpy(buf, SearchData.cFileName);
  79. strcat(filename, "\");
  80. strcat(filename, temp);
  81. AccumulateFileResources(filename, resgroup, mask_set, bMaskInclusive);
  82. }
  83. // process a file
  84. else
  85. {
  86. if(CheckMask(SearchData.cFileName, mask_set, bMaskInclusive))
  87. if(!FindObj(obj_list, SearchData.cFileName))
  88. {
  89. strcpy(filename, wildcard);
  90. buf=strrchr(filename, '\');
  91. if(!buf) buf=filename; else buf++;
  92. strcpy(buf, SearchData.cFileName);
  93. tex = hge->Texture_Load(filename);
  94. if(!tex)
  95. {
  96. SysLog("Can't load texture: %sn", filename);
  97. continue;
  98. }
  99. spr = new hgeSprite(tex, 0, 0,
  100. (float)hge->Texture_GetWidth(tex, true),
  101. (float)hge->Texture_GetHeight(tex, true));
  102. buf = new char[strlen(SearchData.cFileName)+1];
  103. strcpy(buf, SearchData.cFileName);
  104. obj_list.push_back(new CSpriteObject(spr, buf, resgroup, true));
  105. }
  106. }
  107. } while(FindNextFile(hSearch, &SearchData));
  108. FindClose(hSearch);
  109. }
  110. bool CTextureAssembler::GenerateTextures(char *wildcard)
  111. {
  112. GfxObjIterator it;
  113. char texfile[MAX_PATH];
  114. char resfile[MAX_PATH];
  115. char texname[128];
  116. char *name;
  117. int pathlen;
  118. int nTexture;
  119. // extract texture name from wildcard
  120. name = strrchr(wildcard,'\');
  121. if(name != NULL)
  122. name++;
  123. else
  124. name = wildcard;
  125. pathlen = name - wildcard;
  126. if(!strlen(name))
  127. {
  128. SysLog("Invalid wildcard: %sn", wildcard);
  129. return false;
  130. }
  131. // check if we have something to process
  132. if(!obj_list.size())
  133. {
  134. SysLog("No resources in task.n");
  135. return false;
  136. }
  137. // sort objects
  138. obj_list.sort(ByLargestDimensionDescending());
  139. // process objects without texture data
  140. texture.Reset();
  141. for(it = obj_list.begin(); it != obj_list.end(); it++)
  142. if(!(*it)->GetTexture())
  143. texture.AddNoTextureObject(*it);
  144. if(texture.GetNumPlaced())
  145. {
  146. if(pathlen) memcpy(resfile, wildcard, pathlen);
  147. resfile[pathlen] = 0;
  148. strcat(resfile, "NoTexture.res");
  149. texture.SaveDescriptions(resfile, 0, 0);
  150. SysLog("%d object(s) without texture stored.n", texture.GetNumPlaced());
  151. }
  152. // process objects with texture data
  153. nTexture = 1;
  154. for(;;)
  155. {
  156. texture.Reset();
  157. for(it = obj_list.begin(); it != obj_list.end(); it++)
  158. if(!(*it)->IsPlaced())
  159. texture.PlaceObject(*it);
  160. if(!texture.GetNumPlaced()) break;
  161. SysLog("Texture %d ... ", nTexture);
  162. sprintf(texfile, "%s%d.png", wildcard, nTexture);
  163. sprintf(resfile, "%s%d.res", wildcard, nTexture);
  164. sprintf(texname, "%s%d", name, nTexture);
  165. if(!texture.Create() ||
  166.    !texture.CopyData() ||
  167.    !texture.OptimizeAlpha() ||
  168.    !texture.Save(texfile) ||
  169.    !texture.SaveDescriptions(resfile, texfile, texname))
  170. {
  171. texture.Reset();
  172. return false;
  173. }
  174. SysLog("%d object(s) placed.n", texture.GetNumPlaced());
  175. nTexture++;
  176. }
  177. return true;
  178. }