resource_loader.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "resource_loader.h"
  6. #include "memory.h"
  7. #include "resource_registry.h"
  8. #include "log.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(ResourceId id)
  30. {
  31. add_request(id);
  32. }
  33. void ResourceLoader::flush()
  34. {
  35. while (num_requests()) {}
  36. }
  37. void ResourceLoader::add_request(ResourceId id)
  38. {
  39. ScopedMutex sm(_mutex);
  40. queue::push_back(_requests, id);
  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. ResourceId id = queue::front(_requests);
  73. _mutex.unlock();
  74. ResourceData rd;
  75. rd.id = id;
  76. char name[64];
  77. id.to_string(name);
  78. TempAllocator256 alloc;
  79. DynamicString path(alloc);
  80. path::join("data", name, path);
  81. File* file = _fs.open(path.c_str(), FOM_READ);
  82. rd.data = resource_on_load(id.type, *file, _resource_heap);
  83. _fs.close(file);
  84. add_loaded(rd);
  85. _mutex.lock();
  86. queue::pop_front(_requests);
  87. _mutex.unlock();
  88. }
  89. return 0;
  90. }
  91. } // namespace crown