3
0

ImageThumbnail.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 <AssetBrowser/Thumbnails/ProductThumbnail.h>
  9. #include <AssetBrowser/Thumbnails/SourceThumbnail.h>
  10. #include <Atom/RPI.Reflect/Image/StreamingImageAsset.h>
  11. #include <AzToolsFramework/API/EditorAssetSystemAPI.h>
  12. #include <QtConcurrent/QtConcurrent>
  13. #include <Source/ImageLoader/ImageLoaders.h>
  14. #include <Source/Thumbnail/ImageThumbnail.h>
  15. namespace ImageProcessingAtom
  16. {
  17. namespace Thumbnails
  18. {
  19. static constexpr const int ImageThumbnailSize = 256;
  20. //////////////////////////////////////////////////////////////////////////
  21. // ImageThumbnail
  22. //////////////////////////////////////////////////////////////////////////
  23. ImageThumbnail::ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key)
  24. : Thumbnail(key)
  25. {
  26. auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(key.data());
  27. if (sourceKey)
  28. {
  29. bool foundIt = false;
  30. AZStd::vector<AZ::Data::AssetInfo> productAssetInfo;
  31. AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
  32. foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetAssetsProducedBySourceUUID, sourceKey->GetSourceUuid(),
  33. productAssetInfo);
  34. for (const auto& assetInfo : productAssetInfo)
  35. {
  36. m_assetIds.insert(assetInfo.m_assetId);
  37. }
  38. }
  39. auto productKey = azrtti_cast<const AzToolsFramework::AssetBrowser::ProductThumbnailKey*>(key.data());
  40. if (productKey && productKey->GetAssetType() == AZ::RPI::StreamingImageAsset::RTTI_Type())
  41. {
  42. m_assetIds.insert(productKey->GetAssetId());
  43. }
  44. AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusConnect(key);
  45. AzFramework::AssetCatalogEventBus::Handler::BusConnect();
  46. }
  47. ImageThumbnail::~ImageThumbnail()
  48. {
  49. AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect();
  50. AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
  51. }
  52. void ImageThumbnail::Load()
  53. {
  54. m_state = State::Loading;
  55. AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent(
  56. AZ::RPI::StreamingImageAsset::RTTI_Type(), &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail,
  57. m_key, ImageThumbnailSize);
  58. }
  59. void ImageThumbnail::ThumbnailRendered(const QPixmap& thumbnailImage)
  60. {
  61. m_pixmap = thumbnailImage;
  62. m_state = State::Ready;
  63. QueueThumbnailUpdated();
  64. }
  65. void ImageThumbnail::ThumbnailFailedToRender()
  66. {
  67. m_state = State::Failed;
  68. QueueThumbnailUpdated();
  69. }
  70. void ImageThumbnail::OnCatalogAssetChanged([[maybe_unused]] const AZ::Data::AssetId& assetId)
  71. {
  72. if (m_assetIds.contains(assetId) && (m_state == State::Ready || m_state == State::Failed))
  73. {
  74. m_state = State::Unloaded;
  75. Load();
  76. }
  77. }
  78. //////////////////////////////////////////////////////////////////////////
  79. // ImageThumbnailCache
  80. //////////////////////////////////////////////////////////////////////////
  81. ImageThumbnailCache::ImageThumbnailCache()
  82. : ThumbnailCache<ImageThumbnail>()
  83. {
  84. }
  85. ImageThumbnailCache::~ImageThumbnailCache() = default;
  86. int ImageThumbnailCache::GetPriority() const
  87. {
  88. // Image thumbnails override default source thumbnails, so carry higher priority
  89. return 1;
  90. }
  91. const char* ImageThumbnailCache::GetProviderName() const
  92. {
  93. return ProviderName;
  94. }
  95. bool ImageThumbnailCache::IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const
  96. {
  97. auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(key.data());
  98. if (sourceKey)
  99. {
  100. bool foundIt = false;
  101. AZ::Data::AssetInfo assetInfo;
  102. AZStd::string watchFolder;
  103. AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
  104. foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(),
  105. assetInfo, watchFolder);
  106. if (foundIt)
  107. {
  108. AZStd::string ext;
  109. AZ::StringFunc::Path::GetExtension(assetInfo.m_relativePath.c_str(), ext, false);
  110. return IsExtensionSupported(ext.c_str());
  111. }
  112. }
  113. auto productKey = azrtti_cast<const AzToolsFramework::AssetBrowser::ProductThumbnailKey*>(key.data());
  114. return productKey && productKey->GetAssetType() == AZ::RPI::StreamingImageAsset::RTTI_Type();
  115. }
  116. } // namespace Thumbnails
  117. } // namespace ImageProcessingAtom