Replacing preset preview images with thumbnail widget to improve load times

Signed-off-by: Guthrie Adams <guthadam@amazon.com>
monroegm-disable-blank-issue-2
Guthrie Adams 4 years ago
parent 9f9aa8f2a6
commit 5311878e87

@ -62,15 +62,6 @@ namespace MaterialEditor
//! Get set of lighting preset names //! Get set of lighting preset names
virtual MaterialViewportPresetNameSet GetLightingPresetNames() const = 0; virtual MaterialViewportPresetNameSet GetLightingPresetNames() const = 0;
//! Set lighting preset preview image
//! @param preset used to set preview image
//! @param preview image
virtual void SetLightingPresetPreview(AZ::Render::LightingPresetPtr preset, const QImage& image) = 0;
//! Get lighting preset preview image
//! @param preset used to find preview image
virtual QImage GetLightingPresetPreview(AZ::Render::LightingPresetPtr preset) const = 0;
//! Get model preset last save path //! Get model preset last save path
//! @param preset to lookup last save path //! @param preset to lookup last save path
virtual AZStd::string GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const = 0; virtual AZStd::string GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const = 0;
@ -108,15 +99,6 @@ namespace MaterialEditor
//! Get set of model preset names //! Get set of model preset names
virtual MaterialViewportPresetNameSet GetModelPresetNames() const = 0; virtual MaterialViewportPresetNameSet GetModelPresetNames() const = 0;
//! Set model preset preview image
//! @param preset used to set preview image
//! @param preview image
virtual void SetModelPresetPreview(AZ::Render::ModelPresetPtr preset, const QImage& image) = 0;
//! Get model preset preview image
//! @param preset used to find preview image
virtual QImage GetModelPresetPreview(AZ::Render::ModelPresetPtr preset) const = 0;
//! Get model preset last save path //! Get model preset last save path
//! @param preset to lookup last save path //! @param preset to lookup last save path
virtual AZStd::string GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const = 0; virtual AZStd::string GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const = 0;

@ -162,12 +162,6 @@ namespace MaterialEditor
m_viewportSettings = m_viewportSettings =
AZ::UserSettings::CreateFind<MaterialViewportSettings>(AZ::Crc32("MaterialViewportSettings"), AZ::UserSettings::CT_GLOBAL); AZ::UserSettings::CreateFind<MaterialViewportSettings>(AZ::Crc32("MaterialViewportSettings"), AZ::UserSettings::CT_GLOBAL);
m_lightingPresetPreviewImageDefault = QImage(180, 90, QImage::Format::Format_RGBA8888);
m_lightingPresetPreviewImageDefault.fill(Qt::GlobalColor::black);
m_modelPresetPreviewImageDefault = QImage(90, 90, QImage::Format::Format_RGBA8888);
m_modelPresetPreviewImageDefault.fill(Qt::GlobalColor::black);
MaterialViewportRequestBus::Handler::BusConnect(); MaterialViewportRequestBus::Handler::BusConnect();
AzFramework::AssetCatalogEventBus::Handler::BusConnect(); AzFramework::AssetCatalogEventBus::Handler::BusConnect();
} }
@ -177,12 +171,10 @@ namespace MaterialEditor
AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
MaterialViewportRequestBus::Handler::BusDisconnect(); MaterialViewportRequestBus::Handler::BusDisconnect();
m_lightingPresetPreviewImages.clear();
m_lightingPresetVector.clear(); m_lightingPresetVector.clear();
m_lightingPresetLastSavePathMap.clear(); m_lightingPresetLastSavePathMap.clear();
m_lightingPresetSelection.reset(); m_lightingPresetSelection.reset();
m_modelPresetPreviewImages.clear();
m_modelPresetVector.clear(); m_modelPresetVector.clear();
m_modelPresetLastSavePathMap.clear(); m_modelPresetLastSavePathMap.clear();
m_modelPresetSelection.reset(); m_modelPresetSelection.reset();
@ -286,14 +278,6 @@ namespace MaterialEditor
SelectLightingPreset(presetPtr); SelectLightingPreset(presetPtr);
} }
const auto& imagePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(presetPtr->m_skyboxImageAsset.GetId());
LoadImageAsync(imagePath, [presetPtr](const QImage& image) {
QImage imageScaled = image.scaled(180, 90, Qt::AspectRatioMode::KeepAspectRatio);
AZ::TickBus::QueueFunction([presetPtr, imageScaled]() {
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SetLightingPresetPreview, presetPtr, imageScaled);
});
});
return presetPtr; return presetPtr;
} }
@ -353,17 +337,6 @@ namespace MaterialEditor
return names; return names;
} }
void MaterialViewportComponent::SetLightingPresetPreview(AZ::Render::LightingPresetPtr preset, const QImage& image)
{
m_lightingPresetPreviewImages[preset] = image;
}
QImage MaterialViewportComponent::GetLightingPresetPreview(AZ::Render::LightingPresetPtr preset) const
{
auto imageItr = m_lightingPresetPreviewImages.find(preset);
return imageItr != m_lightingPresetPreviewImages.end() ? imageItr->second : m_lightingPresetPreviewImageDefault;
}
AZStd::string MaterialViewportComponent::GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const AZStd::string MaterialViewportComponent::GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const
{ {
auto pathItr = m_lightingPresetLastSavePathMap.find(preset); auto pathItr = m_lightingPresetLastSavePathMap.find(preset);
@ -382,14 +355,6 @@ namespace MaterialEditor
SelectModelPreset(presetPtr); SelectModelPreset(presetPtr);
} }
const auto& imagePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(presetPtr->m_previewImageAsset.GetId());
LoadImageAsync(imagePath, [presetPtr](const QImage& image) {
QImage imageScaled = image.scaled(90, 90, Qt::AspectRatioMode::KeepAspectRatio);
AZ::TickBus::QueueFunction([presetPtr, imageScaled]() {
MaterialViewportRequestBus::Broadcast(&MaterialViewportRequestBus::Events::SetModelPresetPreview, presetPtr, imageScaled);
});
});
return presetPtr; return presetPtr;
} }
@ -449,17 +414,6 @@ namespace MaterialEditor
return names; return names;
} }
void MaterialViewportComponent::SetModelPresetPreview(AZ::Render::ModelPresetPtr preset, const QImage& image)
{
m_modelPresetPreviewImages[preset] = image;
}
QImage MaterialViewportComponent::GetModelPresetPreview(AZ::Render::ModelPresetPtr preset) const
{
auto imageItr = m_modelPresetPreviewImages.find(preset);
return imageItr != m_modelPresetPreviewImages.end() ? imageItr->second : m_modelPresetPreviewImageDefault;
}
AZStd::string MaterialViewportComponent::GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const AZStd::string MaterialViewportComponent::GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const
{ {
auto pathItr = m_modelPresetLastSavePathMap.find(preset); auto pathItr = m_modelPresetLastSavePathMap.find(preset);

@ -58,8 +58,6 @@ namespace MaterialEditor
void SelectLightingPreset(AZ::Render::LightingPresetPtr preset) override; void SelectLightingPreset(AZ::Render::LightingPresetPtr preset) override;
void SelectLightingPresetByName(const AZStd::string& name) override; void SelectLightingPresetByName(const AZStd::string& name) override;
MaterialViewportPresetNameSet GetLightingPresetNames() const override; MaterialViewportPresetNameSet GetLightingPresetNames() const override;
void SetLightingPresetPreview(AZ::Render::LightingPresetPtr preset, const QImage& image) override;
QImage GetLightingPresetPreview(AZ::Render::LightingPresetPtr preset) const override;
AZStd::string GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const override; AZStd::string GetLightingPresetLastSavePath(AZ::Render::LightingPresetPtr preset) const override;
AZ::Render::ModelPresetPtr AddModelPreset(const AZ::Render::ModelPreset& preset) override; AZ::Render::ModelPresetPtr AddModelPreset(const AZ::Render::ModelPreset& preset) override;
@ -70,8 +68,6 @@ namespace MaterialEditor
void SelectModelPreset(AZ::Render::ModelPresetPtr preset) override; void SelectModelPreset(AZ::Render::ModelPresetPtr preset) override;
void SelectModelPresetByName(const AZStd::string& name) override; void SelectModelPresetByName(const AZStd::string& name) override;
MaterialViewportPresetNameSet GetModelPresetNames() const override; MaterialViewportPresetNameSet GetModelPresetNames() const override;
void SetModelPresetPreview(AZ::Render::ModelPresetPtr preset, const QImage& image) override;
QImage GetModelPresetPreview(AZ::Render::ModelPresetPtr preset) const override;
AZStd::string GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const override; AZStd::string GetModelPresetLastSavePath(AZ::Render::ModelPresetPtr preset) const override;
void SetShadowCatcherEnabled(bool enable) override; void SetShadowCatcherEnabled(bool enable) override;
@ -97,12 +93,6 @@ namespace MaterialEditor
AZ::Render::ModelPresetPtrVector m_modelPresetVector; AZ::Render::ModelPresetPtrVector m_modelPresetVector;
AZ::Render::ModelPresetPtr m_modelPresetSelection; AZ::Render::ModelPresetPtr m_modelPresetSelection;
AZStd::map<AZ::Render::LightingPresetPtr, QImage> m_lightingPresetPreviewImages;
AZStd::map<AZ::Render::ModelPresetPtr, QImage> m_modelPresetPreviewImages;
QImage m_lightingPresetPreviewImageDefault;
QImage m_modelPresetPreviewImageDefault;
mutable AZStd::map<AZ::Render::LightingPresetPtr, AZStd::string> m_lightingPresetLastSavePathMap; mutable AZStd::map<AZ::Render::LightingPresetPtr, AZStd::string> m_lightingPresetLastSavePathMap;
mutable AZStd::map<AZ::Render::ModelPresetPtr, AZStd::string> m_modelPresetLastSavePathMap; mutable AZStd::map<AZ::Render::ModelPresetPtr, AZStd::string> m_modelPresetLastSavePathMap;

@ -7,6 +7,7 @@
*/ */
#include <Atom/Feature/Utils/LightingPreset.h> #include <Atom/Feature/Utils/LightingPreset.h>
#include <Atom/RPI.Edit/Common/AssetUtils.h>
#include <Atom/Viewport/MaterialViewportRequestBus.h> #include <Atom/Viewport/MaterialViewportRequestBus.h>
#include <AtomToolsFramework/Util/Util.h> #include <AtomToolsFramework/Util/Util.h>
#include <AzFramework/Application/Application.h> #include <AzFramework/Application/Application.h>
@ -30,10 +31,10 @@ namespace MaterialEditor
QListWidgetItem* selectedItem = nullptr; QListWidgetItem* selectedItem = nullptr;
for (const auto& preset : presets) for (const auto& preset : presets)
{ {
QImage image; AZStd::string path;
MaterialViewportRequestBus::BroadcastResult(image, &MaterialViewportRequestBus::Events::GetLightingPresetPreview, preset); MaterialViewportRequestBus::BroadcastResult(path, &MaterialViewportRequestBus::Events::GetLightingPresetLastSavePath, preset);
QListWidgetItem* item =
QListWidgetItem* item = CreateListItem(preset->m_displayName.c_str(), image); CreateListItem(preset->m_displayName.c_str(), AZ::RPI::AssetUtils::MakeAssetId(path, 0).GetValue(), QSize(180, 180));
m_listItemToPresetMap[item] = preset; m_listItemToPresetMap[item] = preset;

@ -30,10 +30,7 @@ namespace MaterialEditor
QListWidgetItem* selectedItem = nullptr; QListWidgetItem* selectedItem = nullptr;
for (const auto& preset : presets) for (const auto& preset : presets)
{ {
QImage image; QListWidgetItem* item = CreateListItem(preset->m_displayName.c_str(), preset->m_modelAsset.GetId(), QSize(90, 90));
MaterialViewportRequestBus::BroadcastResult(image, &MaterialViewportRequestBus::Events::GetModelPresetPreview, preset);
QListWidgetItem* item = CreateListItem(preset->m_displayName.c_str(), image);
m_listItemToPresetMap[item] = preset; m_listItemToPresetMap[item] = preset;

@ -12,6 +12,10 @@
#include <AzQtComponents/Components/Widgets/ElidingLabel.h> #include <AzQtComponents/Components/Widgets/ElidingLabel.h>
#include <AzQtComponents/Components/Widgets/LineEdit.h> #include <AzQtComponents/Components/Widgets/LineEdit.h>
#include <AzQtComponents/Components/Widgets/Text.h> #include <AzQtComponents/Components/Widgets/Text.h>
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
#include <AzToolsFramework/Thumbnails/ThumbnailWidget.h>
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
#include <Window/PresetBrowserDialogs/PresetBrowserDialog.h> #include <Window/PresetBrowserDialogs/PresetBrowserDialog.h>
#include <QLabel> #include <QLabel>
@ -41,35 +45,36 @@ namespace MaterialEditor
m_ui->m_presetList->setGridSize(QSize(0, 0)); m_ui->m_presetList->setGridSize(QSize(0, 0));
m_ui->m_presetList->setWrapping(true); m_ui->m_presetList->setWrapping(true);
QObject::connect(m_ui->m_presetList, &QListWidget::currentItemChanged, [this]() { SelectCurrentPreset(); }); QObject::connect(m_ui->m_presetList, &QListWidget::currentItemChanged, [this](){ SelectCurrentPreset(); });
} }
QListWidgetItem* PresetBrowserDialog::CreateListItem(const QString& title, const QImage& image) QListWidgetItem* PresetBrowserDialog::CreateListItem(const QString& title, const AZ::Data::AssetId& assetId, const QSize& size)
{ {
const QSize gridSize = m_ui->m_presetList->gridSize(); const QSize gridSize = m_ui->m_presetList->gridSize();
m_ui->m_presetList->setGridSize( m_ui->m_presetList->setGridSize(
QSize(AZStd::max(gridSize.width(), image.width() + 10), AZStd::max(gridSize.height(), image.height() + 10))); QSize(AZStd::max(gridSize.width(), size.width() + 10), AZStd::max(gridSize.height(), size.height() + 10)));
QListWidgetItem* item = new QListWidgetItem(m_ui->m_presetList); QListWidgetItem* item = new QListWidgetItem(m_ui->m_presetList);
item->setData(Qt::UserRole, title); item->setData(Qt::UserRole, title);
item->setSizeHint(image.size() + QSize(4, 4)); item->setSizeHint(size + QSize(4, 4));
m_ui->m_presetList->addItem(item); m_ui->m_presetList->addItem(item);
QLabel* previewImage = new QLabel(m_ui->m_presetList); AzToolsFramework::Thumbnailer::ThumbnailWidget* thumbnail = new AzToolsFramework::Thumbnailer::ThumbnailWidget(m_ui->m_presetList);
previewImage->setFixedSize(image.size()); thumbnail->setFixedSize(size);
previewImage->setMargin(0); thumbnail->SetThumbnailKey(
previewImage->setPixmap(QPixmap::fromImage(image)); MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, assetId),
previewImage->updateGeometry(); AzToolsFramework::Thumbnailer::ThumbnailContext::DefaultContext);
thumbnail->updateGeometry();
AzQtComponents::ElidingLabel* previewLabel = new AzQtComponents::ElidingLabel(previewImage); AzQtComponents::ElidingLabel* previewLabel = new AzQtComponents::ElidingLabel(thumbnail);
previewLabel->setText(title); previewLabel->setText(title);
previewLabel->setFixedSize(QSize(image.width(), 15)); previewLabel->setFixedSize(QSize(size.width(), 15));
previewLabel->setMargin(0); previewLabel->setMargin(0);
previewLabel->setStyleSheet("background-color: rgb(35, 35, 35)"); previewLabel->setStyleSheet("background-color: rgb(35, 35, 35)");
AzQtComponents::Text::addPrimaryStyle(previewLabel); AzQtComponents::Text::addPrimaryStyle(previewLabel);
AzQtComponents::Text::addLabelStyle(previewLabel); AzQtComponents::Text::addLabelStyle(previewLabel);
m_ui->m_presetList->setItemWidget(item, previewImage); m_ui->m_presetList->setItemWidget(item, thumbnail);
return item; return item;
} }
@ -79,15 +84,15 @@ namespace MaterialEditor
m_ui->m_searchWidget->setReadOnly(false); m_ui->m_searchWidget->setReadOnly(false);
m_ui->m_searchWidget->setContextMenuPolicy(Qt::CustomContextMenu); m_ui->m_searchWidget->setContextMenuPolicy(Qt::CustomContextMenu);
AzQtComponents::LineEdit::applySearchStyle(m_ui->m_searchWidget); AzQtComponents::LineEdit::applySearchStyle(m_ui->m_searchWidget);
connect(m_ui->m_searchWidget, &QLineEdit::textChanged, this, [this]() { ApplySearchFilter(); }); connect(m_ui->m_searchWidget, &QLineEdit::textChanged, this, [this](){ ApplySearchFilter(); });
connect(m_ui->m_searchWidget, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos) { ShowSearchMenu(pos); }); connect(m_ui->m_searchWidget, &QWidget::customContextMenuRequested, this, [this](const QPoint& pos){ ShowSearchMenu(pos); });
} }
void PresetBrowserDialog::SetupDialogButtons() void PresetBrowserDialog::SetupDialogButtons()
{ {
connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(m_ui->m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(m_ui->m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
connect(this, &QDialog::rejected, this, [this]() { SelectInitialPreset(); }); connect(this, &QDialog::rejected, this, [this](){ SelectInitialPreset(); });
} }
void PresetBrowserDialog::ApplySearchFilter() void PresetBrowserDialog::ApplySearchFilter()

@ -9,12 +9,12 @@
#pragma once #pragma once
#if !defined(Q_MOC_RUN) #if !defined(Q_MOC_RUN)
#include <AzCore/Asset/AssetCommon.h>
#include <AzCore/std/containers/vector.h> #include <AzCore/std/containers/vector.h>
#include <QDialog> #include <QDialog>
#endif #endif
#include <Source/Window/PresetBrowserDialogs/ui_PresetBrowserDialog.h> #include <Window/PresetBrowserDialogs/ui_PresetBrowserDialog.h>
class QImage; class QImage;
class QListWidgetItem; class QListWidgetItem;
@ -32,7 +32,7 @@ namespace MaterialEditor
protected: protected:
void SetupPresetList(); void SetupPresetList();
QListWidgetItem* CreateListItem(const QString& title, const QImage& image); QListWidgetItem* CreateListItem(const QString& title, const AZ::Data::AssetId& assetId, const QSize& size);
void SetupSearchWidget(); void SetupSearchWidget();
void SetupDialogButtons(); void SetupDialogButtons();

Loading…
Cancel
Save