2
0

resource_package.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * Copyright (c) 2012-2023 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "core/containers/array.inl"
  6. #include "core/os.h"
  7. #include "core/strings/string_id.inl"
  8. #include "resource/package_resource.h"
  9. #include "resource/resource_id.inl"
  10. #include "resource/resource_manager.h"
  11. #include "resource/resource_package.h"
  12. #include "world/types.h"
  13. namespace crown
  14. {
  15. ResourcePackage::ResourcePackage(StringId64 id, ResourceManager &resman)
  16. : _marker(RESOURCE_PACKAGE_MARKER)
  17. , _resource_manager(&resman)
  18. , _package_resource_name(id)
  19. , _package_resource(NULL)
  20. , _num_resources_queued(0)
  21. , _package_resource_queued(false)
  22. , _loaded(false)
  23. {
  24. }
  25. ResourcePackage::~ResourcePackage()
  26. {
  27. _resource_manager->unload(RESOURCE_TYPE_PACKAGE, _package_resource_name);
  28. _marker = 0;
  29. }
  30. void ResourcePackage::load()
  31. {
  32. // Load the package resource itself.
  33. if (!_package_resource_queued) {
  34. _package_resource_queued = _resource_manager->try_load(PACKAGE_RESOURCE_NONE, RESOURCE_TYPE_PACKAGE, _package_resource_name);
  35. } else {
  36. if (_package_resource == NULL) {
  37. if (!_resource_manager->can_get(RESOURCE_TYPE_PACKAGE, _package_resource_name)) {
  38. _resource_manager->complete_requests();
  39. return;
  40. }
  41. _package_resource = (PackageResource *)_resource_manager->get(RESOURCE_TYPE_PACKAGE, _package_resource_name);
  42. }
  43. // Now that the package resource has been loaded, issue loading requests for all the
  44. // resources it contains.
  45. for (u32 ii = _num_resources_queued; ii < _package_resource->num_resources; ++ii) {
  46. const ResourceOffset *ro = package_resource::resource_offset(_package_resource, ii);
  47. if (!_resource_manager->try_load(_package_resource_name, ro->type, ro->name))
  48. break;
  49. ++_num_resources_queued;
  50. }
  51. }
  52. }
  53. void ResourcePackage::unload()
  54. {
  55. for (u32 ii = 0; ii < _package_resource->num_resources; ++ii) {
  56. const ResourceOffset *ro = package_resource::resource_offset(_package_resource, ii);
  57. _resource_manager->unload(ro->type, ro->name);
  58. }
  59. }
  60. void ResourcePackage::flush()
  61. {
  62. while (!has_loaded()) {
  63. _resource_manager->complete_requests();
  64. }
  65. }
  66. bool ResourcePackage::has_loaded()
  67. {
  68. if (_loaded)
  69. return _loaded;
  70. load();
  71. if (_package_resource == NULL)
  72. return false;
  73. for (u32 ii = 0; ii < _package_resource->num_resources; ++ii) {
  74. const ResourceOffset *ro = package_resource::resource_offset(_package_resource, ii);
  75. if (!_resource_manager->can_get(ro->type, ro->name))
  76. return false;
  77. }
  78. _loaded = true;
  79. return _loaded;
  80. }
  81. } // namespace crown