GameResourcesExporter.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "EditorDefs.h"
  9. #include "GameResourcesExporter.h"
  10. // Qt
  11. #include <QFileDialog>
  12. // Editor
  13. #include "UsedResources.h"
  14. #include "GameEngine.h"
  15. #include "Include/IObjectManager.h"
  16. #include "WaitProgress.h"
  17. //////////////////////////////////////////////////////////////////////////
  18. // Static data.
  19. //////////////////////////////////////////////////////////////////////////
  20. CGameResourcesExporter::Files CGameResourcesExporter::m_files;
  21. //////////////////////////////////////////////////////////////////////////
  22. void CGameResourcesExporter::ChooseDirectoryAndSave()
  23. {
  24. ChooseDirectory();
  25. if (!m_path.isEmpty())
  26. {
  27. Save(m_path);
  28. }
  29. }
  30. //////////////////////////////////////////////////////////////////////////
  31. void CGameResourcesExporter::ChooseDirectory()
  32. {
  33. m_path = QFileDialog::getExistingDirectory(nullptr, QObject::tr("Choose Target (root/PrimaryCD) Folder"));
  34. }
  35. //////////////////////////////////////////////////////////////////////////
  36. void CGameResourcesExporter::GatherAllLoadedResources()
  37. {
  38. m_files.clear();
  39. m_files.reserve(100000); // count from GetResourceList, GetFilesFromObjects ... is unknown
  40. auto pResList = gEnv->pCryPak->GetResourceList(AZ::IO::IArchive::RFOM_Level);
  41. {
  42. for (const char* filename = pResList->GetFirst(); filename; filename = pResList->GetNext())
  43. {
  44. m_files.push_back(filename);
  45. }
  46. }
  47. GetFilesFromObjects();
  48. }
  49. //////////////////////////////////////////////////////////////////////////
  50. void CGameResourcesExporter::SetUsedResources(CUsedResources& resources)
  51. {
  52. for (CUsedResources::TResourceFiles::const_iterator it = resources.files.begin(); it != resources.files.end(); it++)
  53. {
  54. m_files.push_back(*it);
  55. }
  56. }
  57. //////////////////////////////////////////////////////////////////////////
  58. void CGameResourcesExporter::Save(const QString& outputDirectory)
  59. {
  60. CMemoryBlock data;
  61. int numFiles = m_files.size();
  62. CLogFile::WriteLine("===========================================================================");
  63. CLogFile::FormatLine("Exporting Level %s resources, %d files", GetIEditor()->GetGameEngine()->GetLevelName().toUtf8().data(), numFiles);
  64. CLogFile::WriteLine("===========================================================================");
  65. // Needed files.
  66. CWaitProgress wait("Exporting Resources");
  67. for (int i = 0; i < numFiles; i++)
  68. {
  69. QString srcFilename = m_files[i];
  70. if (!wait.Step((i * 100) / numFiles))
  71. {
  72. break;
  73. }
  74. wait.SetText(srcFilename.toUtf8().data());
  75. CLogFile::WriteLine(srcFilename.toUtf8().data());
  76. CCryFile file;
  77. if (file.Open(srcFilename.toUtf8().data(), "rb"))
  78. {
  79. // Save this file in target folder.
  80. QString trgFilename = Path::Make(outputDirectory, srcFilename);
  81. int fsize = static_cast<int>(file.GetLength());
  82. if (fsize > data.GetSize())
  83. {
  84. data.Allocate(fsize + 16);
  85. }
  86. // Read data.
  87. file.ReadRaw(data.GetBuffer(), fsize);
  88. // Save this data to target file.
  89. QString trgFileDir = Path::GetPath(trgFilename);
  90. CFileUtil::CreateDirectory(trgFileDir.toUtf8().data());
  91. // Create a file.
  92. FILE* trgFile = nullptr;
  93. azfopen(&trgFile, trgFilename.toUtf8().data(), "wb");
  94. if (trgFile)
  95. {
  96. // Save data to new file.
  97. fwrite(data.GetBuffer(), fsize, 1, trgFile);
  98. fclose(trgFile);
  99. }
  100. }
  101. }
  102. CLogFile::WriteLine("===========================================================================");
  103. m_files.clear();
  104. }
  105. //////////////////////////////////////////////////////////////////////////
  106. //
  107. // Go through all editor objects and gathers files from thier properties.
  108. //
  109. //////////////////////////////////////////////////////////////////////////
  110. void CGameResourcesExporter::GetFilesFromObjects()
  111. {
  112. CUsedResources rs;
  113. GetIEditor()->GetObjectManager()->GatherUsedResources(rs);
  114. AZStd::copy(rs.files.begin(), rs.files.end(), AZStd::back_inserter(m_files));
  115. }