3
0

Scanner.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 <AzFramework/StringFunc/StringFunc.h>
  9. #include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
  10. #include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
  11. #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
  12. #include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
  13. #include <Editor/View/Windows/Tools/UpgradeTool/LogTraits.h>
  14. #include <Editor/View/Windows/Tools/UpgradeTool/Scanner.h>
  15. #include <ScriptCanvas/Components/EditorUtils.h>
  16. #include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
  17. namespace ScannerCpp
  18. {
  19. void TraverseTree
  20. ( QModelIndex index
  21. , AzToolsFramework::AssetBrowser::AssetBrowserFilterModel& model
  22. , ScriptCanvasEditor::VersionExplorer::ScanResult& result)
  23. {
  24. using namespace ScriptCanvas;
  25. QModelIndex sourceIndex = model.mapToSource(index);
  26. AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry =
  27. reinterpret_cast<AzToolsFramework::AssetBrowser::AssetBrowserEntry*>(sourceIndex.internalPointer());
  28. if (entry
  29. && entry->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Source
  30. && azrtti_istypeof<const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry*>(entry)
  31. && entry->GetFullPath().ends_with(".scriptcanvas"))
  32. {
  33. auto sourceEntry = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry*>(entry);
  34. result.m_catalogAssets.push_back
  35. ( SourceHandle::MarkAbsolutePath
  36. ( SourceHandle::FromRelativePath(nullptr, sourceEntry->GetRelativePath()), sourceEntry->GetFullPath()));
  37. }
  38. const int rowCount = model.rowCount(index);
  39. for (int i = 0; i < rowCount; ++i)
  40. {
  41. TraverseTree(model.index(i, 0, index), model, result);
  42. }
  43. }
  44. }
  45. namespace ScriptCanvasEditor
  46. {
  47. namespace VersionExplorer
  48. {
  49. Scanner::Scanner(const ScanConfiguration& config, AZStd::function<void()> onComplete)
  50. : m_config(config)
  51. , m_onComplete(onComplete)
  52. {
  53. AzToolsFramework::AssetBrowser::AssetBrowserModel* assetBrowserModel = nullptr;
  54. AzToolsFramework::AssetBrowser::AssetBrowserComponentRequestBus::BroadcastResult
  55. ( assetBrowserModel, &AzToolsFramework::AssetBrowser::AssetBrowserComponentRequests::GetAssetBrowserModel);
  56. if (assetBrowserModel)
  57. {
  58. auto stringFilter = new AzToolsFramework::AssetBrowser::StringFilter();
  59. stringFilter->SetName("ScriptCanvas");
  60. stringFilter->SetFilterString(".scriptcanvas");
  61. stringFilter->SetFilterPropagation(AzToolsFramework::AssetBrowser::AssetBrowserEntryFilter::PropagateDirection::Down);
  62. AzToolsFramework::AssetBrowser::AssetBrowserFilterModel assetFilterModel;
  63. assetFilterModel.SetFilter(AzToolsFramework::AssetBrowser::FilterConstType(stringFilter));
  64. assetFilterModel.setSourceModel(assetBrowserModel);
  65. ScannerCpp::TraverseTree(QModelIndex(), assetFilterModel, m_result);
  66. ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanBegin, m_result.m_catalogAssets.size());
  67. }
  68. AZ::SystemTickBus::Handler::BusConnect();
  69. }
  70. void Scanner::FilterAsset(SourceHandle asset, bool isFromXMLSource)
  71. {
  72. if ((m_config.onlyIncludeLegacyXML && (!isFromXMLSource))
  73. || (m_config.filter && m_config.filter(asset) == ScanConfiguration::Filter::Exclude))
  74. {
  75. VE_LOG("Scanner: Excluded: %s ", ModCurrentAsset().RelativePath().c_str());
  76. m_result.m_filteredAssets.push_back(ModCurrentAsset().Describe());
  77. ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanFilteredGraph, ModCurrentAsset());
  78. }
  79. else
  80. {
  81. VE_LOG("Scanner: Included: %s ", ModCurrentAsset().RelativePath().c_str());
  82. m_result.m_unfiltered.push_back(ModCurrentAsset().Describe());
  83. ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanUnFilteredGraph, ModCurrentAsset());
  84. }
  85. }
  86. const ScanResult& Scanner::GetResult() const
  87. {
  88. return m_result;
  89. }
  90. AZStd::pair<SourceHandle, bool> Scanner::LoadSource()
  91. {
  92. auto result = LoadFromFile
  93. ( ModCurrentAsset().AbsolutePath().c_str()
  94. , ScriptCanvas::MakeInternalGraphEntitiesUnique::Yes
  95. , ScriptCanvas::LoadReferencedAssets::Yes);
  96. if (!result)
  97. {
  98. return { {}, result.m_deserializeResult.m_fromObjectStreamXML };
  99. }
  100. return { result.m_handle, result.m_deserializeResult.m_fromObjectStreamXML };
  101. }
  102. SourceHandle& Scanner::ModCurrentAsset()
  103. {
  104. return m_result.m_catalogAssets[m_catalogAssetIndex];
  105. }
  106. void Scanner::OnSystemTick()
  107. {
  108. if (m_catalogAssetIndex == m_result.m_catalogAssets.size())
  109. {
  110. VE_LOG("Scanner: Complete.");
  111. AZ::SystemTickBus::Handler::BusDisconnect();
  112. if (m_onComplete)
  113. {
  114. m_onComplete();
  115. }
  116. }
  117. else
  118. {
  119. auto sourceAndIsXML = LoadSource();
  120. auto asset = sourceAndIsXML.first;
  121. const bool isXML = sourceAndIsXML.second;
  122. if (asset.IsGraphValid())
  123. {
  124. VE_LOG("Scanner: Loaded: %s ", ModCurrentAsset().RelativePath().c_str());
  125. FilterAsset(asset, isXML);
  126. }
  127. else if (!m_config.onlyIncludeLegacyXML || isXML)
  128. {
  129. VE_LOG("Scanner: Failed to load: %s ", ModCurrentAsset().RelativePath().c_str());
  130. m_result.m_loadErrors.push_back(ModCurrentAsset().Describe());
  131. ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanLoadFailure, ModCurrentAsset());
  132. }
  133. VE_LOG("Scanner: scan of %s complete", ModCurrentAsset().RelativePath().c_str());
  134. ++m_catalogAssetIndex;
  135. }
  136. }
  137. ScanResult&& Scanner::TakeResult()
  138. {
  139. return AZStd::move(m_result);
  140. }
  141. }
  142. }