Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

olcPGE_ResourcePack.cpp 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "olcPGE_ResourcePack.h"
  2. namespace olc {
  3. ResourcePack::ResourcePack()
  4. {
  5. }
  6. ResourcePack::~ResourcePack()
  7. {
  8. ClearPack();
  9. }
  10. olc::rcode ResourcePack::AddToPack(std::string sFile)
  11. {
  12. std::ifstream ifs(sFile, std::ifstream::binary);
  13. if (!ifs.is_open()) return olc::FAIL;
  14. // Get File Size
  15. std::streampos p = 0;
  16. p = ifs.tellg();
  17. ifs.seekg(0, std::ios::end);
  18. p = ifs.tellg() - p;
  19. ifs.seekg(0, std::ios::beg);
  20. // Create entry
  21. sEntry e;
  22. e.data = nullptr;
  23. e.nFileSize = (uint32_t)p;
  24. // Read file into memory
  25. e.data = new uint8_t[(uint32_t)e.nFileSize];
  26. ifs.read((char*)e.data, e.nFileSize);
  27. ifs.close();
  28. // Add To Map
  29. mapFiles[sFile] = e;
  30. return olc::OK;
  31. }
  32. olc::rcode ResourcePack::RemoveFromPack(std::string sFile)
  33. {
  34. if (mapFiles.count(sFile) > 0) {
  35. sEntry e = mapFiles.at(sFile);
  36. if (e.data != nullptr) {
  37. delete[] e.data;
  38. }
  39. mapFiles.erase(sFile);
  40. return olc::OK;
  41. } else {
  42. return olc::FAIL;
  43. }
  44. }
  45. olc::rcode ResourcePack::SavePack(std::string sFile)
  46. {
  47. std::ofstream ofs(sFile, std::ofstream::binary);
  48. if (!ofs.is_open()) return olc::FAIL;
  49. // 1) Write Map
  50. size_t nMapSize = mapFiles.size();
  51. ofs.write((char*)&nMapSize, sizeof(size_t));
  52. for (auto &e : mapFiles)
  53. {
  54. size_t nPathSize = e.first.size();
  55. ofs.write((char*)&nPathSize, sizeof(size_t));
  56. ofs.write(e.first.c_str(), nPathSize);
  57. ofs.write((char*)&e.second.nID, sizeof(uint32_t));
  58. ofs.write((char*)&e.second.nFileSize, sizeof(uint32_t));
  59. ofs.write((char*)&e.second.nFileOffset, sizeof(uint32_t));
  60. }
  61. // 2) Write Data
  62. std::streampos offset = ofs.tellp();
  63. for (auto &e : mapFiles)
  64. {
  65. e.second.nFileOffset = (uint32_t)offset;
  66. ofs.write((char*)e.second.data, e.second.nFileSize);
  67. offset += e.second.nFileSize;
  68. }
  69. // 3) Rewrite Map (it has been updated with offsets now)
  70. ofs.seekp(std::ios::beg);
  71. ofs.write((char*)&nMapSize, sizeof(size_t));
  72. for (auto &e : mapFiles)
  73. {
  74. size_t nPathSize = e.first.size();
  75. ofs.write((char*)&nPathSize, sizeof(size_t));
  76. ofs.write(e.first.c_str(), nPathSize);
  77. ofs.write((char*)&e.second.nID, sizeof(uint32_t));
  78. ofs.write((char*)&e.second.nFileSize, sizeof(uint32_t));
  79. ofs.write((char*)&e.second.nFileOffset, sizeof(uint32_t));
  80. }
  81. ofs.close();
  82. return olc::OK;
  83. }
  84. olc::rcode ResourcePack::LoadPack(std::string sFile)
  85. {
  86. std::ifstream ifs(sFile, std::ifstream::binary);
  87. if (!ifs.is_open()) return olc::FAIL;
  88. // 1) Read Map
  89. size_t nMapEntries;
  90. ifs.read((char*)&nMapEntries, sizeof(size_t));
  91. for (size_t i = 0; i < nMapEntries; i++)
  92. {
  93. size_t nFilePathSize = 0;
  94. ifs.read((char*)&nFilePathSize, sizeof(size_t));
  95. std::string sFileName(nFilePathSize, ' ');
  96. for (size_t j = 0; j < nFilePathSize; j++)
  97. sFileName[j] = ifs.get();
  98. sEntry e;
  99. e.data = nullptr;
  100. ifs.read((char*)&e.nID, sizeof(uint32_t));
  101. ifs.read((char*)&e.nFileSize, sizeof(uint32_t));
  102. ifs.read((char*)&e.nFileOffset, sizeof(uint32_t));
  103. mapFiles[sFileName] = e;
  104. }
  105. // 2) Read Data
  106. for (auto &e : mapFiles)
  107. {
  108. e.second.data = new uint8_t[(uint32_t)e.second.nFileSize];
  109. ifs.seekg(e.second.nFileOffset);
  110. ifs.read((char*)e.second.data, e.second.nFileSize);
  111. e.second._config();
  112. }
  113. ifs.close();
  114. return olc::OK;
  115. }
  116. olc::ResourcePack::sEntry ResourcePack::GetStreamBuffer(std::string sFile)
  117. {
  118. return mapFiles[sFile];
  119. }
  120. std::vector<std::string> ResourcePack::GetEntries()
  121. {
  122. std::vector<std::string> result;
  123. result.reserve(mapFiles.size());
  124. for (auto& e: mapFiles) {
  125. result.push_back(e.first);
  126. }
  127. return result;
  128. }
  129. olc::rcode ResourcePack::ClearPack()
  130. {
  131. for (auto &e : mapFiles)
  132. {
  133. if (e.second.data != nullptr)
  134. delete[] e.second.data;
  135. }
  136. mapFiles.clear();
  137. return olc::OK;
  138. }
  139. }