Merge pull request #4717 from aws-lumberyard-dev/Atom/guthadam/shared_preview_renderer_as_interface
Replace multiple PreviewRenderer instances with single instance and AZ::Interface
This commit is contained in:
+1
@@ -9,6 +9,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Memory/Memory.h>
|
||||
#include <AzCore/Memory/SystemAllocator.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewContent.h>
|
||||
#include <AzCore/Memory/Memory.h>
|
||||
#include <AzCore/Memory/SystemAllocator.h>
|
||||
#include <AzCore/std/functional.h>
|
||||
#include <AzCore/std/smart_ptr/shared_ptr.h>
|
||||
|
||||
class QPixmap;
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
//! PreviewRendererCaptureRequest describes the size, content, and behavior of a scene to be rendered to an image
|
||||
struct PreviewRendererCaptureRequest final
|
||||
{
|
||||
AZ_CLASS_ALLOCATOR(PreviewRendererCaptureRequest, AZ::SystemAllocator, 0);
|
||||
|
||||
int m_size = 512;
|
||||
AZStd::shared_ptr<PreviewContent> m_content;
|
||||
AZStd::function<void()> m_captureFailedCallback;
|
||||
AZStd::function<void(const QPixmap&)> m_captureCompleteCallback;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Atom/RPI.Public/Base.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
struct PreviewRendererCaptureRequest;
|
||||
|
||||
//! Public interface for PreviewRenderer so that it can be used in other modules
|
||||
class PreviewRendererInterface
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(PreviewRendererInterface, "{C5B5E3D0-0055-4C08-9B98-FDBBB5F05BED}");
|
||||
|
||||
virtual ~PreviewRendererInterface() = default;
|
||||
virtual void AddCaptureRequest(const PreviewRendererCaptureRequest& captureRequest) = 0;
|
||||
virtual AZ::RPI::ScenePtr GetScene() const = 0;
|
||||
virtual AZ::RPI::ViewPtr GetView() const = 0;
|
||||
virtual AZ::Uuid GetEntityContextId() const = 0;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/EBus/EBus.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
//! PreviewRendererSystemRequests provides an interface for PreviewRendererSystemComponent
|
||||
class PreviewRendererSystemRequests : public AZ::EBusTraits
|
||||
{
|
||||
public:
|
||||
// Only a single handler is allowed
|
||||
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
|
||||
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
||||
};
|
||||
using PreviewRendererSystemRequestBus = AZ::EBus<PreviewRendererSystemRequests>;
|
||||
} // namespace AtomToolsFramework
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <AtomToolsFrameworkSystemComponent.h>
|
||||
#include <Document/AtomToolsDocumentSystemComponent.h>
|
||||
#include <Window/AtomToolsMainWindowSystemComponent.h>
|
||||
#include <PreviewRenderer/PreviewRendererSystemComponent.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
@@ -19,6 +20,7 @@ namespace AtomToolsFramework
|
||||
AtomToolsFrameworkSystemComponent::CreateDescriptor(),
|
||||
AtomToolsDocumentSystemComponent::CreateDescriptor(),
|
||||
AtomToolsMainWindowSystemComponent::CreateDescriptor(),
|
||||
PreviewRendererSystemComponent::CreateDescriptor(),
|
||||
});
|
||||
}
|
||||
|
||||
@@ -28,6 +30,7 @@ namespace AtomToolsFramework
|
||||
azrtti_typeid<AtomToolsFrameworkSystemComponent>(),
|
||||
azrtti_typeid<AtomToolsDocumentSystemComponent>(),
|
||||
azrtti_typeid<AtomToolsMainWindowSystemComponent>(),
|
||||
azrtti_typeid<PreviewRendererSystemComponent>(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,12 @@
|
||||
#include <Atom/RPI.Public/View.h>
|
||||
#include <Atom/RPI.Reflect/System/RenderPipelineDescriptor.h>
|
||||
#include <Atom/RPI.Reflect/System/SceneDescriptor.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <AzCore/Interface/Interface.h>
|
||||
#include <AzCore/Math/MatrixUtils.h>
|
||||
#include <AzCore/Math/Transform.h>
|
||||
#include <AzFramework/Scene/Scene.h>
|
||||
#include <AzFramework/Scene/SceneSystemInterface.h>
|
||||
#include <PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRendererCaptureState.h>
|
||||
#include <PreviewRenderer/PreviewRendererIdleState.h>
|
||||
#include <PreviewRenderer/PreviewRendererLoadState.h>
|
||||
@@ -80,6 +81,8 @@ namespace AtomToolsFramework
|
||||
m_renderPipeline->SetDefaultView(m_view);
|
||||
|
||||
m_state.reset(new PreviewRendererIdleState(this));
|
||||
|
||||
AZ::Interface<PreviewRendererInterface>::Register(this);
|
||||
}
|
||||
|
||||
PreviewRenderer::~PreviewRenderer()
|
||||
@@ -96,9 +99,11 @@ namespace AtomToolsFramework
|
||||
AZ::RPI::RPISystemInterface::Get()->UnregisterScene(m_scene);
|
||||
m_frameworkScene->UnsetSubsystem(m_scene);
|
||||
m_frameworkScene->UnsetSubsystem(m_entityContext.get());
|
||||
|
||||
AZ::Interface<PreviewRendererInterface>::Unregister(this);
|
||||
}
|
||||
|
||||
void PreviewRenderer::AddCaptureRequest(const CaptureRequest& captureRequest)
|
||||
void PreviewRenderer::AddCaptureRequest(const PreviewRendererCaptureRequest& captureRequest)
|
||||
{
|
||||
m_captureRequestQueue.push(captureRequest);
|
||||
}
|
||||
|
||||
+14
-24
@@ -11,41 +11,31 @@
|
||||
#include <Atom/RPI.Public/Base.h>
|
||||
#include <Atom/RPI.Public/Pass/AttachmentReadback.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewContent.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererState.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererCaptureRequest.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererInterface.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewerFeatureProcessorProviderBus.h>
|
||||
#include <AzFramework/Entity/GameEntityContextComponent.h>
|
||||
|
||||
namespace AzFramework
|
||||
{
|
||||
class Scene;
|
||||
}
|
||||
|
||||
class QPixmap;
|
||||
#include <PreviewRenderer/PreviewRendererState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
//! Processes requests for setting up content that gets rendered to a texture and captured to an image
|
||||
class PreviewRenderer final : public PreviewerFeatureProcessorProviderBus::Handler
|
||||
class PreviewRenderer final
|
||||
: public PreviewRendererInterface
|
||||
, public PreviewerFeatureProcessorProviderBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(PreviewRenderer, AZ::SystemAllocator, 0);
|
||||
AZ_RTTI(PreviewRenderer, "{60FCB7AB-2A94-417A-8C5E-5B588D17F5D1}", PreviewRendererInterface);
|
||||
|
||||
PreviewRenderer(const AZStd::string& sceneName, const AZStd::string& pipelineName);
|
||||
~PreviewRenderer();
|
||||
~PreviewRenderer() override;
|
||||
|
||||
struct CaptureRequest final
|
||||
{
|
||||
int m_size = 512;
|
||||
AZStd::shared_ptr<PreviewContent> m_content;
|
||||
AZStd::function<void()> m_captureFailedCallback;
|
||||
AZStd::function<void(const QPixmap&)> m_captureCompleteCallback;
|
||||
};
|
||||
void AddCaptureRequest(const PreviewRendererCaptureRequest& captureRequest) override;
|
||||
|
||||
void AddCaptureRequest(const CaptureRequest& captureRequest);
|
||||
|
||||
AZ::RPI::ScenePtr GetScene() const;
|
||||
AZ::RPI::ViewPtr GetView() const;
|
||||
AZ::Uuid GetEntityContextId() const;
|
||||
AZ::RPI::ScenePtr GetScene() const override;
|
||||
AZ::RPI::ViewPtr GetView() const override;
|
||||
AZ::Uuid GetEntityContextId() const override;
|
||||
|
||||
void ProcessCaptureRequests();
|
||||
void CancelCaptureRequest();
|
||||
@@ -77,8 +67,8 @@ namespace AtomToolsFramework
|
||||
AZStd::unique_ptr<AzFramework::EntityContext> m_entityContext;
|
||||
|
||||
//! Incoming requests are appended to this queue and processed one at a time in OnTick function.
|
||||
AZStd::queue<CaptureRequest> m_captureRequestQueue;
|
||||
CaptureRequest m_currentCaptureRequest;
|
||||
AZStd::queue<PreviewRendererCaptureRequest> m_captureRequestQueue;
|
||||
PreviewRendererCaptureRequest m_currentCaptureRequest;
|
||||
|
||||
AZStd::unique_ptr<PreviewRendererState> m_state;
|
||||
};
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRendererCaptureState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
|
||||
+1
-1
@@ -9,8 +9,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <Atom/Feature/Utils/FrameCaptureBus.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererState.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <PreviewRenderer/PreviewRendererState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRendererIdleState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
|
||||
+1
-1
@@ -8,8 +8,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererState.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <PreviewRenderer/PreviewRendererState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRenderer.h>
|
||||
#include <PreviewRenderer/PreviewRendererLoadState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererState.h>
|
||||
#include <PreviewRenderer/PreviewRendererState.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ namespace AtomToolsFramework
|
||||
{
|
||||
class PreviewRenderer;
|
||||
|
||||
//! PreviewRendererState decouples PreviewRenderer logic into easy-to-understand and debug pieces
|
||||
//! PreviewRendererState is an interface for defining states that manages the logic flow of the PreviewRenderer
|
||||
class PreviewRendererState
|
||||
{
|
||||
public:
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/EditContextConstants.inl>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <PreviewRenderer/PreviewRendererSystemComponent.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
void PreviewRendererSystemComponent::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serialize->Class<PreviewRendererSystemComponent, AZ::Component>()
|
||||
->Version(0);
|
||||
|
||||
if (AZ::EditContext* ec = serialize->GetEditContext())
|
||||
{
|
||||
ec->Class<PreviewRendererSystemComponent>("PreviewRendererSystemComponent", "System component that manages a global PreviewRenderer.")
|
||||
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
||||
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
|
||||
{
|
||||
provided.push_back(AZ_CRC_CE("PreviewRendererSystem"));
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
|
||||
{
|
||||
incompatible.push_back(AZ_CRC_CE("PreviewRendererSystem"));
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::Init()
|
||||
{
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::Activate()
|
||||
{
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusConnect();
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
|
||||
PreviewRendererSystemRequestBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::Deactivate()
|
||||
{
|
||||
PreviewRendererSystemRequestBus::Handler::BusDisconnect();
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
|
||||
m_previewRenderer.reset();
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::OnCatalogLoaded([[maybe_unused]] const char* catalogFile)
|
||||
{
|
||||
AZ::TickBus::QueueFunction([this](){
|
||||
m_previewRenderer.reset(aznew AtomToolsFramework::PreviewRenderer(
|
||||
"PreviewRendererSystemComponent Preview Scene", "PreviewRendererSystemComponent Preview Pipeline"));
|
||||
});
|
||||
}
|
||||
|
||||
void PreviewRendererSystemComponent::OnApplicationAboutToStop()
|
||||
{
|
||||
m_previewRenderer.reset();
|
||||
}
|
||||
} // namespace AtomToolsFramework
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererSystemRequestBus.h>
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
#include <AzCore/Component/Component.h>
|
||||
#include <AzFramework/Application/Application.h>
|
||||
#include <PreviewRenderer/PreviewRenderer.h>
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
//! System component that manages a global PreviewRenderer.
|
||||
class PreviewRendererSystemComponent final
|
||||
: public AZ::Component
|
||||
, public AzFramework::AssetCatalogEventBus::Handler
|
||||
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
|
||||
, public PreviewRendererSystemRequestBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(PreviewRendererSystemComponent, "{E9F79FD8-82F2-4C80-966D-95F28484F229}");
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
|
||||
|
||||
protected:
|
||||
// AZ::Component interface overrides...
|
||||
void Init() override;
|
||||
void Activate() override;
|
||||
void Deactivate() override;
|
||||
|
||||
private:
|
||||
// AzFramework::AssetCatalogEventBus::Handler overrides ...
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
|
||||
// AzFramework::ApplicationLifecycleEvents overrides...
|
||||
void OnApplicationAboutToStop() override;
|
||||
|
||||
AZStd::unique_ptr<AtomToolsFramework::PreviewRenderer> m_previewRenderer;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
@@ -59,14 +59,19 @@ set(FILES
|
||||
Source/Window/AtomToolsMainWindowSystemComponent.cpp
|
||||
Source/Window/AtomToolsMainWindowSystemComponent.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewContent.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewRenderer.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewRendererState.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewRendererCaptureRequest.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewRendererInterface.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewRendererSystemRequestBus.h
|
||||
Include/AtomToolsFramework/PreviewRenderer/PreviewerFeatureProcessorProviderBus.h
|
||||
Source/PreviewRenderer/PreviewRenderer.cpp
|
||||
Source/PreviewRenderer/PreviewRenderer.h
|
||||
Source/PreviewRenderer/PreviewRendererState.h
|
||||
Source/PreviewRenderer/PreviewRendererIdleState.cpp
|
||||
Source/PreviewRenderer/PreviewRendererIdleState.h
|
||||
Source/PreviewRenderer/PreviewRendererLoadState.cpp
|
||||
Source/PreviewRenderer/PreviewRendererLoadState.h
|
||||
Source/PreviewRenderer/PreviewRendererCaptureState.cpp
|
||||
Source/PreviewRenderer/PreviewRendererCaptureState.h
|
||||
Source/PreviewRenderer/PreviewRendererSystemComponent.cpp
|
||||
Source/PreviewRenderer/PreviewRendererSystemComponent.h
|
||||
)
|
||||
+20
-29
@@ -6,10 +6,12 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentNotificationBus.h>
|
||||
#include <Atom/RHI/Factory.h>
|
||||
#include <Atom/RPI.Reflect/Asset/AssetUtils.h>
|
||||
#include <AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentNotificationBus.h>
|
||||
#include <AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererCaptureRequest.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererInterface.h>
|
||||
#include <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/EditContextConstants.inl>
|
||||
@@ -59,7 +61,7 @@ namespace AZ
|
||||
{
|
||||
ec->Class<EditorMaterialSystemComponent>("EditorMaterialSystemComponent", "System component that manages launching and maintaining connections the material editor.")
|
||||
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
||||
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System", 0xc94d118b))
|
||||
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
;
|
||||
}
|
||||
@@ -68,12 +70,17 @@ namespace AZ
|
||||
|
||||
void EditorMaterialSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
|
||||
{
|
||||
provided.push_back(AZ_CRC("EditorMaterialSystem", 0x5c93bc4e));
|
||||
provided.push_back(AZ_CRC_CE("EditorMaterialSystem"));
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
|
||||
{
|
||||
incompatible.push_back(AZ_CRC("EditorMaterialSystem", 0x5c93bc4e));
|
||||
incompatible.push_back(AZ_CRC_CE("EditorMaterialSystem"));
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
|
||||
{
|
||||
required.push_back(AZ_CRC_CE("PreviewRendererSystem"));
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
|
||||
@@ -93,21 +100,18 @@ namespace AZ
|
||||
AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect();
|
||||
AzToolsFramework::EditorMenuNotificationBus::Handler::BusConnect();
|
||||
AzToolsFramework::EditorEvents::Bus::Handler::BusConnect();
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusConnect();
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
|
||||
|
||||
m_materialBrowserInteractions.reset(aznew MaterialBrowserInteractions);
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::Deactivate()
|
||||
{
|
||||
AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
|
||||
AzFramework::AssetCatalogEventBus::Handler::BusDisconnect();
|
||||
EditorMaterialSystemComponentNotificationBus::Handler::BusDisconnect();
|
||||
EditorMaterialSystemComponentRequestBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorMenuNotificationBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect();
|
||||
|
||||
m_previewRenderer.reset();
|
||||
m_materialBrowserInteractions.reset();
|
||||
|
||||
if (m_openMaterialEditorAction)
|
||||
@@ -160,7 +164,7 @@ namespace AZ
|
||||
static constexpr const char* DefaultModelPath = "models/sphere.azmodel";
|
||||
static constexpr const char* DefaultLightingPresetPath = "lightingpresets/thumbnail.lightingpreset.azasset";
|
||||
|
||||
if (m_previewRenderer)
|
||||
if (auto previewRenderer = AZ::Interface<AtomToolsFramework::PreviewRendererInterface>::Get())
|
||||
{
|
||||
AZ::Data::AssetId materialAssetId = {};
|
||||
MaterialComponentRequestBus::EventResult(
|
||||
@@ -180,15 +184,17 @@ namespace AZ
|
||||
propertyOverrides, entityId, &AZ::Render::MaterialComponentRequestBus::Events::GetPropertyOverrides,
|
||||
materialAssignmentId);
|
||||
|
||||
m_previewRenderer->AddCaptureRequest(
|
||||
previewRenderer->AddCaptureRequest(
|
||||
{ 128,
|
||||
AZStd::make_shared<AZ::LyIntegration::SharedPreviewContent>(
|
||||
m_previewRenderer->GetScene(), m_previewRenderer->GetView(), m_previewRenderer->GetEntityContextId(),
|
||||
previewRenderer->GetScene(), previewRenderer->GetView(), previewRenderer->GetEntityContextId(),
|
||||
AZ::RPI::AssetUtils::GetAssetIdForProductPath(DefaultModelPath), materialAssetId,
|
||||
AZ::RPI::AssetUtils::GetAssetIdForProductPath(DefaultLightingPresetPath), propertyOverrides),
|
||||
[]()
|
||||
[entityId, materialAssignmentId]()
|
||||
{
|
||||
// failed
|
||||
AZ_Warning(
|
||||
"EditorMaterialSystemComponent", false, "RenderMaterialPreview capture failed for entity %s slot %s.",
|
||||
entityId.ToString().c_str(), materialAssignmentId.ToString().c_str());
|
||||
},
|
||||
[entityId, materialAssignmentId](const QPixmap& pixmap)
|
||||
{
|
||||
@@ -264,21 +270,6 @@ namespace AZ
|
||||
"Material Property Inspector", LyViewPane::CategoryTools, inspectorOptions);
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::OnCatalogLoaded([[maybe_unused]] const char* catalogFile)
|
||||
{
|
||||
AZ::TickBus::QueueFunction([this](){
|
||||
m_materialBrowserInteractions.reset(aznew MaterialBrowserInteractions);
|
||||
m_previewRenderer.reset(aznew AtomToolsFramework::PreviewRenderer(
|
||||
"EditorMaterialSystemComponent Preview Scene", "EditorMaterialSystemComponent Preview Pipeline"));
|
||||
});
|
||||
}
|
||||
|
||||
void EditorMaterialSystemComponent::OnApplicationAboutToStop()
|
||||
{
|
||||
m_previewRenderer.reset();
|
||||
m_materialBrowserInteractions.reset();
|
||||
}
|
||||
|
||||
AzToolsFramework::AssetBrowser::SourceFileDetails EditorMaterialSystemComponent::GetSourceFileDetails(
|
||||
const char* fullSourceFileName)
|
||||
{
|
||||
|
||||
+2
-12
@@ -5,13 +5,12 @@
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
#include <AzCore/Component/Component.h>
|
||||
#include <AzFramework/Application/Application.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/Viewport/ActionBus.h>
|
||||
@@ -30,8 +29,6 @@ namespace AZ
|
||||
, public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler
|
||||
, public AzToolsFramework::EditorMenuNotificationBus::Handler
|
||||
, public AzToolsFramework::EditorEvents::Bus::Handler
|
||||
, public AzFramework::AssetCatalogEventBus::Handler
|
||||
, public AzFramework::ApplicationLifecycleEvents::Bus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(EditorMaterialSystemComponent, "{96652157-DA0B-420F-B49C-0207C585144C}");
|
||||
@@ -40,6 +37,7 @@ namespace AZ
|
||||
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
|
||||
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
|
||||
static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
|
||||
|
||||
protected:
|
||||
@@ -70,16 +68,8 @@ namespace AZ
|
||||
// AztoolsFramework::EditorEvents::Bus::Handler overrides...
|
||||
void NotifyRegisterViews() override;
|
||||
|
||||
|
||||
// AzFramework::AssetCatalogEventBus::Handler overrides ...
|
||||
void OnCatalogLoaded(const char* catalogFile) override;
|
||||
|
||||
// AzFramework::ApplicationLifecycleEvents overrides...
|
||||
void OnApplicationAboutToStop() override;
|
||||
|
||||
QAction* m_openMaterialEditorAction = nullptr;
|
||||
AZStd::unique_ptr<MaterialBrowserInteractions> m_materialBrowserInteractions;
|
||||
AZStd::unique_ptr<AtomToolsFramework::PreviewRenderer> m_previewRenderer;
|
||||
AZStd::unordered_map<AZ::EntityId, AZStd::unordered_map<AZ::Render::MaterialAssignmentId, QPixmap>> m_materialPreviews;
|
||||
};
|
||||
} // namespace Render
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace AZ
|
||||
|
||||
int SharedThumbnailCache::GetPriority() const
|
||||
{
|
||||
// Thumbnails override default source thumbnails, so carry higher priority
|
||||
// Custom thumbnails have a higher priority to override default source thumbnails
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,8 @@ namespace AZ
|
||||
{
|
||||
namespace LyIntegration
|
||||
{
|
||||
//! Custom thumbnail that detects when an asset changes and updates the thumbnail
|
||||
//! Custom thumbnail for most common Atom assets
|
||||
//! Detects asset changes and updates the thumbnail
|
||||
class SharedThumbnail final
|
||||
: public AzToolsFramework::Thumbnailer::Thumbnail
|
||||
, public AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler
|
||||
@@ -46,7 +47,7 @@ namespace AZ
|
||||
AZ::Uuid m_typeId;
|
||||
};
|
||||
|
||||
//! Cache configuration for large thumbnails
|
||||
//! Cache configuration for shared thumbnails
|
||||
class SharedThumbnailCache final : public AzToolsFramework::Thumbnailer::ThumbnailCache<SharedThumbnail>
|
||||
{
|
||||
public:
|
||||
@@ -56,7 +57,7 @@ namespace AZ
|
||||
int GetPriority() const override;
|
||||
const char* GetProviderName() const override;
|
||||
|
||||
static constexpr const char* ProviderName = "Common Feature Shared Thumbnail= Provider";
|
||||
static constexpr const char* ProviderName = "Common Feature Shared Thumbnail Provider";
|
||||
|
||||
protected:
|
||||
bool IsSupportedThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key) const override;
|
||||
|
||||
+23
-21
@@ -6,6 +6,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererCaptureRequest.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRendererInterface.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
#include <SharedPreview/SharedPreviewContent.h>
|
||||
@@ -18,9 +20,6 @@ namespace AZ
|
||||
{
|
||||
SharedThumbnailRenderer::SharedThumbnailRenderer()
|
||||
{
|
||||
m_previewRenderer.reset(aznew AtomToolsFramework::PreviewRenderer(
|
||||
"SharedThumbnailRenderer Preview Scene", "SharedThumbnailRenderer Preview Pipeline"));
|
||||
|
||||
m_defaultModelAsset.Create(DefaultModelAssetId, true);
|
||||
m_defaultMaterialAsset.Create(DefaultMaterialAssetId, true);
|
||||
m_defaultLightingPresetAsset.Create(DefaultLightingPresetAssetId, true);
|
||||
@@ -40,24 +39,27 @@ namespace AZ
|
||||
|
||||
void SharedThumbnailRenderer::RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize)
|
||||
{
|
||||
m_previewRenderer->AddCaptureRequest(
|
||||
{ thumbnailSize,
|
||||
AZStd::make_shared<SharedPreviewContent>(
|
||||
m_previewRenderer->GetScene(), m_previewRenderer->GetView(), m_previewRenderer->GetEntityContextId(),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::ModelAsset::RTTI_Type(), DefaultModelAssetId),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::MaterialAsset::RTTI_Type(), DefaultMaterialAssetId),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::AnyAsset::RTTI_Type(), DefaultLightingPresetAssetId),
|
||||
Render::MaterialPropertyOverrideMap()),
|
||||
[thumbnailKey]()
|
||||
{
|
||||
AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(
|
||||
thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender);
|
||||
},
|
||||
[thumbnailKey](const QPixmap& pixmap)
|
||||
{
|
||||
AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(
|
||||
thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, pixmap);
|
||||
} });
|
||||
if (auto previewRenderer = AZ::Interface<AtomToolsFramework::PreviewRendererInterface>::Get())
|
||||
{
|
||||
previewRenderer->AddCaptureRequest(
|
||||
{ thumbnailSize,
|
||||
AZStd::make_shared<SharedPreviewContent>(
|
||||
previewRenderer->GetScene(), previewRenderer->GetView(), previewRenderer->GetEntityContextId(),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::ModelAsset::RTTI_Type(), DefaultModelAssetId),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::MaterialAsset::RTTI_Type(), DefaultMaterialAssetId),
|
||||
SharedPreviewUtils::GetAssetId(thumbnailKey, RPI::AnyAsset::RTTI_Type(), DefaultLightingPresetAssetId),
|
||||
Render::MaterialPropertyOverrideMap()),
|
||||
[thumbnailKey]()
|
||||
{
|
||||
AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(
|
||||
thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailFailedToRender);
|
||||
},
|
||||
[thumbnailKey](const QPixmap& pixmap)
|
||||
{
|
||||
AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Event(
|
||||
thumbnailKey, &AzToolsFramework::Thumbnailer::ThumbnailerRendererNotifications::ThumbnailRendered, pixmap);
|
||||
} });
|
||||
}
|
||||
}
|
||||
|
||||
bool SharedThumbnailRenderer::Installed() const
|
||||
|
||||
+1
-4
@@ -12,7 +12,6 @@
|
||||
#include <Atom/RPI.Reflect/Material/MaterialAsset.h>
|
||||
#include <Atom/RPI.Reflect/Model/ModelAsset.h>
|
||||
#include <Atom/RPI.Reflect/System/AnyAsset.h>
|
||||
#include <AtomToolsFramework/PreviewRenderer/PreviewRenderer.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/Thumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
@@ -22,7 +21,7 @@ namespace AZ
|
||||
{
|
||||
namespace LyIntegration
|
||||
{
|
||||
//! Provides custom rendering thumbnails of supported asset types
|
||||
//! Provides custom thumbnail rendering of supported asset types
|
||||
class SharedThumbnailRenderer final
|
||||
: public AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::MultiHandler
|
||||
, public SystemTickBus::Handler
|
||||
@@ -53,8 +52,6 @@ namespace AZ
|
||||
static constexpr const char* DefaultMaterialPath = "";
|
||||
const Data::AssetId DefaultMaterialAssetId;
|
||||
Data::Asset<RPI::MaterialAsset> m_defaultMaterialAsset;
|
||||
|
||||
AZStd::unique_ptr<AtomToolsFramework::PreviewRenderer> m_previewRenderer;
|
||||
};
|
||||
} // namespace LyIntegration
|
||||
} // namespace AZ
|
||||
|
||||
Reference in New Issue
Block a user