resource_loader.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "resource_loader.h"
  6. #include "config.h"
  7. #include "memory.h"
  8. #include "resource_registry.h"
  9. #include "queue.h"
  10. #include "filesystem.h"
  11. #include "temp_allocator.h"
  12. #include "path.h"
  13. namespace crown
  14. {
  15. ResourceLoader::ResourceLoader(Filesystem& fs, Allocator& resource_heap)
  16. : _fs(fs)
  17. , _resource_heap(resource_heap)
  18. , _requests(default_allocator())
  19. , _loaded(default_allocator())
  20. , _exit(false)
  21. {
  22. _thread.start(ResourceLoader::thread_proc, this);
  23. }
  24. ResourceLoader::~ResourceLoader()
  25. {
  26. _exit = true;
  27. _thread.stop();
  28. }
  29. void ResourceLoader::load(StringId64 type, StringId64 name)
  30. {
  31. add_request(type, name);
  32. }
  33. void ResourceLoader::flush()
  34. {
  35. while (num_requests()) {}
  36. }
  37. void ResourceLoader::add_request(StringId64 type, StringId64 name)
  38. {
  39. ScopedMutex sm(_mutex);
  40. queue::push_back(_requests, make_request(type, name));
  41. }
  42. uint32_t ResourceLoader::num_requests()
  43. {
  44. ScopedMutex sm(_mutex);
  45. return queue::size(_requests);
  46. }
  47. void ResourceLoader::add_loaded(ResourceData data)
  48. {
  49. ScopedMutex sm(_loaded_mutex);
  50. queue::push_back(_loaded, data);
  51. }
  52. void ResourceLoader::get_loaded(Array<ResourceData>& loaded)
  53. {
  54. ScopedMutex sm(_loaded_mutex);
  55. uint32_t num = queue::size(_loaded);
  56. for (uint32_t i = 0; i < num; i++)
  57. {
  58. array::push_back(loaded, queue::front(_loaded));
  59. queue::pop_front(_loaded);
  60. }
  61. }
  62. int32_t ResourceLoader::run()
  63. {
  64. while (!_exit)
  65. {
  66. _mutex.lock();
  67. if (queue::empty(_requests))
  68. {
  69. _mutex.unlock();
  70. continue;
  71. }
  72. ResourceRequest id = queue::front(_requests);
  73. _mutex.unlock();
  74. ResourceData rd;
  75. rd.type = id.type;
  76. rd.name = id.name;
  77. char name[1 + 2*StringId64::STRING_LENGTH];
  78. id.type.to_string(name);
  79. name[16] = '-';
  80. id.name.to_string(name + 17);
  81. TempAllocator256 alloc;
  82. DynamicString path(alloc);
  83. path::join(CROWN_DATA_DIRECTORY, name, path);
  84. File* file = _fs.open(path.c_str(), FOM_READ);
  85. rd.data = resource_on_load(id.type, *file, _resource_heap);
  86. _fs.close(file);
  87. add_loaded(rd);
  88. _mutex.lock();
  89. queue::pop_front(_requests);
  90. _mutex.unlock();
  91. }
  92. return 0;
  93. }
  94. } // namespace crown