package_resource.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "file.h"
  6. #include "filesystem.h"
  7. #include "json_parser.h"
  8. #include "package_resource.h"
  9. #include "temp_allocator.h"
  10. #include "reader_writer.h"
  11. #include "compile_options.h"
  12. namespace crown
  13. {
  14. namespace package_resource
  15. {
  16. void compile(const char* path, CompileOptions& opts)
  17. {
  18. static const uint32_t VERSION = 1;
  19. Buffer buf = opts.read(path);
  20. JSONParser json(array::begin(buf));
  21. JSONElement root = json.root();
  22. JSONElement texture = root.key_or_nil("texture");
  23. JSONElement script = root.key_or_nil("lua");
  24. JSONElement sound = root.key_or_nil("sound");
  25. JSONElement mesh = root.key_or_nil("mesh");
  26. JSONElement unit = root.key_or_nil("unit");
  27. JSONElement sprite = root.key_or_nil("sprite");
  28. JSONElement physics = root.key_or_nil("physics");
  29. JSONElement material = root.key_or_nil("material");
  30. JSONElement font = root.key_or_nil("font");
  31. JSONElement level = root.key_or_nil("level");
  32. JSONElement phyconf = root.key_or_nil("physics_config");
  33. JSONElement shader = root.key_or_nil("shader");
  34. JSONElement sprite_animation = root.key_or_nil("sprite_animation");
  35. const uint32_t num_textures = texture.is_nil() ? 0 : texture.size();
  36. const uint32_t num_scripts = script.is_nil() ? 0 : script.size();
  37. const uint32_t num_sounds = sound.is_nil() ? 0 : sound.size();
  38. const uint32_t num_meshes = mesh.is_nil() ? 0 : mesh.size();
  39. const uint32_t num_units = unit.is_nil() ? 0 : unit.size();
  40. const uint32_t num_sprites = sprite.is_nil() ? 0 : sprite.size();
  41. const uint32_t num_physics = physics.is_nil() ? 0 : physics.size();
  42. const uint32_t num_materials = material.is_nil() ? 0 : material.size();
  43. const uint32_t num_fonts = font.is_nil() ? 0 : font.size();
  44. const uint32_t num_levels = level.is_nil() ? 0 : level.size();
  45. const uint32_t num_phyconfs = phyconf.is_nil() ? 0 : phyconf.size();
  46. const uint32_t num_shaders = shader.is_nil() ? 0 : shader.size();
  47. const uint32_t num_sprite_animations = sprite_animation.is_nil() ? 0 : sprite_animation.size();
  48. // Write header
  49. opts.write(VERSION);
  50. opts.write(num_textures);
  51. uint32_t offt = sizeof(PackageResource);
  52. opts.write(offt);
  53. opts.write(num_scripts);
  54. offt += sizeof(StringId64) * num_textures;
  55. opts.write(offt);
  56. opts.write(num_sounds);
  57. offt += sizeof(StringId64) * num_scripts;
  58. opts.write(offt);
  59. opts.write(num_meshes);
  60. offt += sizeof(StringId64) * num_sounds;
  61. opts.write(offt);
  62. opts.write(num_units);
  63. offt += sizeof(StringId64) * num_meshes;
  64. opts.write(offt);
  65. opts.write(num_sprites);
  66. offt += sizeof(StringId64) * num_units;
  67. opts.write(offt);
  68. opts.write(num_physics);
  69. offt += sizeof(StringId64) * num_sprites;
  70. opts.write(offt);
  71. opts.write(num_materials);
  72. offt += sizeof(StringId64) * num_physics;
  73. opts.write(offt);
  74. opts.write(num_fonts);
  75. offt += sizeof(StringId64) * num_materials;
  76. opts.write(offt);
  77. opts.write(num_levels);
  78. offt += sizeof(StringId64) * num_fonts;
  79. opts.write(offt);
  80. opts.write(num_phyconfs);
  81. offt += sizeof(StringId64) * num_levels;
  82. opts.write(offt);
  83. opts.write(num_shaders);
  84. offt += sizeof(StringId64) * num_phyconfs;
  85. opts.write(offt);
  86. opts.write(num_sprite_animations);
  87. offt += sizeof(StringId64) * num_shaders;
  88. opts.write(offt);
  89. // Write resource ids
  90. for (uint32_t i = 0; i < num_textures; i++)
  91. opts.write(texture[i].to_resource_id("texture").name);
  92. for (uint32_t i = 0; i < num_scripts; i++)
  93. opts.write(script[i].to_resource_id("lua").name);
  94. for (uint32_t i = 0; i < num_sounds; i++)
  95. opts.write(sound[i].to_resource_id("sound").name);
  96. for (uint32_t i = 0; i < num_meshes; i++)
  97. opts.write(mesh[i].to_resource_id("mesh").name);
  98. for (uint32_t i = 0; i < num_units; i++)
  99. opts.write(unit[i].to_resource_id("unit").name);
  100. for (uint32_t i = 0; i < num_sprites; i++)
  101. opts.write(sprite[i].to_resource_id("sprite").name);
  102. for (uint32_t i = 0; i < num_physics; i++)
  103. opts.write(physics[i].to_resource_id("physics").name);
  104. for (uint32_t i = 0; i < num_materials; i++)
  105. opts.write(material[i].to_resource_id("material").name);
  106. for (uint32_t i = 0; i < num_fonts; i++)
  107. opts.write(font[i].to_resource_id("font").name);
  108. for (uint32_t i = 0; i < num_levels; i++)
  109. opts.write(level[i].to_resource_id("level").name);
  110. for (uint32_t i = 0; i < num_phyconfs; i++)
  111. opts.write(phyconf[i].to_resource_id("physics_config").name);
  112. for (uint32_t i = 0; i < num_shaders; i++)
  113. opts.write(shader[i].to_resource_id("shader").name);
  114. for (uint32_t i = 0; i < num_sprite_animations; i++)
  115. opts.write(sprite_animation[i].to_resource_id("sprite_animation").name);
  116. }
  117. void* load(File& file, Allocator& a)
  118. {
  119. const size_t file_size = file.size();
  120. void* res = a.allocate(file_size);
  121. file.read(res, file_size);
  122. return res;
  123. }
  124. void online(StringId64 /*id*/, ResourceManager& /*rm*/)
  125. {
  126. }
  127. void offline(StringId64 /*id*/, ResourceManager& /*rm*/)
  128. {
  129. }
  130. void unload(Allocator& allocator, void* resource)
  131. {
  132. allocator.deallocate(resource);
  133. }
  134. uint32_t num_textures(const PackageResource* pr)
  135. {
  136. return pr->num_textures;
  137. }
  138. uint32_t num_scripts(const PackageResource* pr)
  139. {
  140. return pr->num_scripts;
  141. }
  142. uint32_t num_sounds(const PackageResource* pr)
  143. {
  144. return pr->num_sounds;
  145. }
  146. uint32_t num_meshes(const PackageResource* pr)
  147. {
  148. return pr->num_meshes;
  149. }
  150. uint32_t num_units(const PackageResource* pr)
  151. {
  152. return pr->num_units;
  153. }
  154. uint32_t num_sprites(const PackageResource* pr)
  155. {
  156. return pr->num_sprites;
  157. }
  158. uint32_t num_physics(const PackageResource* pr)
  159. {
  160. return pr->num_physics;
  161. }
  162. uint32_t num_materials(const PackageResource* pr)
  163. {
  164. return pr->num_materials;
  165. }
  166. uint32_t num_fonts(const PackageResource* pr)
  167. {
  168. return pr->num_fonts;
  169. }
  170. uint32_t num_levels(const PackageResource* pr)
  171. {
  172. return pr->num_levels;
  173. }
  174. uint32_t num_physics_configs(const PackageResource* pr)
  175. {
  176. return pr->num_physics_configs;
  177. }
  178. uint32_t num_shaders(const PackageResource* pr)
  179. {
  180. return pr->num_shaders;
  181. }
  182. uint32_t num_sprite_animations(const PackageResource* pr)
  183. {
  184. return pr->num_sprite_animations;
  185. }
  186. StringId64 get_texture_id(const PackageResource* pr, uint32_t i)
  187. {
  188. CE_ASSERT(i < num_textures(pr), "Index out of bounds");
  189. StringId64* begin = (StringId64*) ((char*)pr + pr->textures_offset);
  190. return begin[i];
  191. }
  192. StringId64 get_script_id(const PackageResource* pr, uint32_t i)
  193. {
  194. CE_ASSERT(i < num_scripts(pr), "Index out of bounds");
  195. StringId64* begin = (StringId64*) ((char*)pr + pr->scripts_offset);
  196. return begin[i];
  197. }
  198. StringId64 get_sound_id(const PackageResource* pr, uint32_t i)
  199. {
  200. CE_ASSERT(i < num_sounds(pr), "Index out of bounds");
  201. StringId64* begin = (StringId64*) ((char*)pr + pr->sounds_offset);
  202. return begin[i];
  203. }
  204. StringId64 get_mesh_id(const PackageResource* pr, uint32_t i)
  205. {
  206. CE_ASSERT(i < num_meshes(pr), "Index out of bounds");
  207. StringId64* begin = (StringId64*) ((char*)pr + pr->meshes_offset);
  208. return begin[i];
  209. }
  210. StringId64 get_unit_id(const PackageResource* pr, uint32_t i)
  211. {
  212. CE_ASSERT(i < num_units(pr), "Index out of bounds");
  213. StringId64* begin = (StringId64*) ((char*)pr + pr->units_offset);
  214. return begin[i];
  215. }
  216. StringId64 get_sprite_id(const PackageResource* pr, uint32_t i)
  217. {
  218. CE_ASSERT(i < num_sprites(pr), "Index out of bounds");
  219. StringId64* begin = (StringId64*) ((char*)pr + pr->sprites_offset);
  220. return begin[i];
  221. }
  222. StringId64 get_physics_id(const PackageResource* pr, uint32_t i)
  223. {
  224. CE_ASSERT(i < num_physics(pr), "Index out of bounds");
  225. StringId64* begin = (StringId64*) ((char*)pr + pr->physics_offset);
  226. return begin[i];
  227. }
  228. StringId64 get_material_id(const PackageResource* pr, uint32_t i)
  229. {
  230. CE_ASSERT(i < num_materials(pr), "Index out of bounds");
  231. StringId64* begin = (StringId64*) ((char*)pr + pr->materials_offset);
  232. return begin[i];
  233. }
  234. StringId64 get_font_id(const PackageResource* pr, uint32_t i)
  235. {
  236. CE_ASSERT(i < num_fonts(pr), "Index out of bounds");
  237. StringId64* begin = (StringId64*) ((char*)pr + pr->fonts_offset);
  238. return begin[i];
  239. }
  240. StringId64 get_level_id(const PackageResource* pr, uint32_t i)
  241. {
  242. CE_ASSERT(i < num_levels(pr), "Index out of bounds");
  243. StringId64* begin = (StringId64*) ((char*)pr + pr->levels_offset);
  244. return begin[i];
  245. }
  246. StringId64 get_physics_config_id(const PackageResource* pr, uint32_t i)
  247. {
  248. CE_ASSERT(i < num_physics_configs(pr), "Index out of bounds");
  249. StringId64* begin = (StringId64*) ((char*)pr + pr->physics_configs_offset);
  250. return begin[i];
  251. }
  252. StringId64 get_shader_id(const PackageResource* pr, uint32_t i)
  253. {
  254. CE_ASSERT(i < num_shaders(pr), "Index out of bounds");
  255. StringId64* begin = (StringId64*) ((char*)pr + pr->shaders_offset);
  256. return begin[i];
  257. }
  258. StringId64 get_sprite_animation_id(const PackageResource* pr, uint32_t i)
  259. {
  260. CE_ASSERT(i < num_sprite_animations(pr), "Index out of bounds");
  261. StringId64* begin = (StringId64*) ((char*)pr + pr->sprite_animations_offset);
  262. return begin[i];
  263. }
  264. } // namespace package_resource
  265. } // namespace crown