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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.81
  3. ** Copyright (C) 2003-2008, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** Texture Assembler
  7. */
  8. #include "texasm.h"
  9. #include "texture_assembler.h"
  10. #include "....includehgeresource.h"
  11. #include <direct.h>
  12. HGE *hge = 0;
  13. void SysLog(const char *format, ...);
  14. bool ParseTask(char *task, int *resgroup, char *mask, bool *inclusive);
  15. int main(int argc, char* argv[])
  16. {
  17. hgeResourceManager *rm;
  18. CTextureAssembler  *ta;
  19. char    cwd[MAX_PATH];
  20. hge=hgeCreate(HGE_VERSION);
  21. hge->System_SetState(HGE_SHOWSPLASH, false);
  22. hge->System_SetState(HGE_USESOUND, false);
  23. hge->System_SetState(HGE_WINDOWED, true);
  24. hge->System_SetState(HGE_SCREENWIDTH, 320);
  25. hge->System_SetState(HGE_SCREENHEIGHT, 200);
  26. hge->System_SetState(HGE_LOGFILE, "texasm.log");
  27. // try to initiate HGE
  28. if(!hge->System_Initiate())
  29. {
  30. SysLog("Can't initiate HGE.n");
  31. hge->System_Shutdown();
  32. hge->Release();
  33. return 1;
  34. }
  35. SysLog("nTexture Assembler v0.1nCopyright (C) 2003-2008, Relish Gamesnn");
  36. // check for args count and display help
  37. if(argc != 3 && argc != 4)
  38. {
  39. SysLog("Usage: TEXASM.EXE <res-file>|<wildcard> <output-wildcard> [<task>]nnn");
  40. SysLog("<res-file> - resource script to process.n");
  41. SysLog("To be able to locate the resources, texasm.exe mustn");
  42. SysLog("be run from the folder of the main project executable.nn");
  43. SysLog("<wildcard> - a wildcard to search image files for processing.n");
  44. SysLog("Either <res-file> or <wildcard> should be specified, not both.n");
  45. SysLog("All image formats supported by HGE can be handled.nn");
  46. SysLog("<output-wildcard> - wildcard to store the result to.n");
  47. SysLog("For example, "opt_textures\TitleTex" will generate the following files:n");
  48. SysLog("  opt_textures\TitleTex1.png, opt_textures\TitleTex1.resn");
  49. SysLog("  opt_textures\TitleTex2.png, opt_textures\TitleTex2.resn");
  50. SysLog("  ...nn");
  51. SysLog("<task> - optional resource filter.n");
  52. SysLog("If omitted, all resources found in the script/folder will be processed.n");
  53. SysLog("The default resgroup assigned to folder resources is 0.n");
  54. SysLog("Example tasks:nn");
  55. SysLog("  2n");
  56. SysLog("  Process all resources from resgroup 2nn");
  57. SysLog("  7+sprFlower/sprLeaf/sprTrunkn");
  58. SysLog("  Process resources from resgroup 7 whosen  names start with sprFlower, sprLeaf or sprTrunknn");
  59. SysLog("  3-gui\menu\titlen");
  60. SysLog("  Process resources from resgroup 3 whosen  names DON'T start with gui, menu or titlenn");
  61. SysLog("  +mars/earth/mercuryn");
  62. SysLog("  Process all resources whose names startn  with mars, earth or mercurynn");
  63. SysLog("  -gui\menu\titlen");
  64. SysLog("  Process all resources whose names DON'Tn  start with gui, menu or titlenn");
  65. SysLog("nCurrently only Sprite resources and only 32bit PNG output are supported.nn");
  66. hge->System_Shutdown();
  67. hge->Release();
  68. return 0;
  69. }
  70. // test if we should process a resource script or a folder
  71. bool bScript;
  72. void *script = hge->Resource_Load(argv[1]);
  73. if(script)
  74. bScript = true;
  75. else
  76. bScript = false;
  77. hge->Resource_Free(script);
  78. // parse task argument if present
  79. int resgroup = 0;
  80. bool inclusive = true;
  81. char mask[256] = "";
  82. if(argc == 4)
  83. if(!ParseTask(argv[3], &resgroup, mask, &inclusive))
  84. {
  85. SysLog("Invalid task: %sn", argv[3]);
  86. hge->System_Shutdown();
  87. hge->Release();
  88. return 1;
  89. }
  90. // create resource manager & texture assember
  91. rm = new hgeResourceManager();
  92. ta = new CTextureAssembler();
  93. // (possible enhancement: pass maximum texture size and margin from command line)
  94. ta->SetMaxTextureSize(1024, 1024);
  95. ta->SetMargin(1);
  96. // make the search/output path consistent with texture
  97. // loading, i.e. relative to the main executable
  98. _getcwd(cwd, sizeof(cwd));
  99. _chdir(hge->Resource_MakePath());
  100. // Add a task into texture assembler. There may be more than one
  101. // call to AccumulateRMResources() and/or AccumulateFileResources().
  102. if(bScript)
  103. {
  104. rm->ChangeScript(argv[1]);
  105. ta->AccumulateRMResources(rm, resgroup, mask, inclusive);
  106. }
  107. else
  108. {
  109. ta->AccumulateFileResources(argv[1], resgroup, mask, inclusive);
  110. }
  111. // Generate and save PNG and RES files. The processing includes:
  112. // - pack sprites as tight as possible onto minimal number of textures
  113. // - ensure no distortion when scaling or rotating sprites:
  114. //   a) all sprites have empty 1-pixel border outside
  115. //   b) texture data is corrected along the alpha channel border
  116. // - all extra info is removed from the saved PNGs
  117. bool success = ta->GenerateTextures(argv[2]);
  118. // restore current working directory
  119. _chdir(cwd);
  120. delete ta;
  121. delete rm;
  122. if(success)
  123. SysLog("nSuccess.n");
  124. else
  125. SysLog("nAborted.n");
  126. hge->System_Shutdown();
  127. hge->Release();
  128. return (int)success;
  129. }
  130. void SysLog(const char *format, ...)
  131. {
  132. char buf[256];
  133. va_list ap;
  134. va_start(ap, format);
  135. vsprintf(buf, format, ap);
  136. va_end(ap);
  137. printf(buf);
  138. hge->System_Log(buf);
  139. }
  140. bool ParseTask(char *task, int *resgroup, char *mask, bool *inclusive)
  141. {
  142. *resgroup = 0;
  143. *inclusive = true;
  144. mask[0] = 0;
  145. char *p = task;
  146. // parse resgroup
  147. while(isdigit(*p))
  148. {
  149. *resgroup *= 10;
  150. *resgroup += *p - '0';
  151. p++;
  152. }
  153. if(!*p) return true;
  154. // parse inclusiveness
  155. if(*p == '-')
  156. *inclusive = false;
  157. else
  158. {
  159. if(*p != '+') return false;
  160. }
  161. p++;
  162. if(!*p) return false;
  163. // parse mask
  164. strcpy(mask, p);
  165. p = mask;
  166. while(*p)
  167. {
  168. if(*p == '\' || *p == '/') *p = 0;
  169. p++;
  170. }
  171. p++;
  172. *p = 0;
  173. return true;
  174. }