BootstrapSystemComponent.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. #pragma once
  9. #include <AzCore/Component/Component.h>
  10. #include <AzCore/Component/TickBus.h>
  11. #include <AzCore/Settings/SettingsRegistry.h>
  12. #include <AzCore/std/smart_ptr/shared_ptr.h>
  13. #include <AzFramework/API/ApplicationAPI.h>
  14. #include <AzFramework/Scene/Scene.h>
  15. #include <AzFramework/Scene/SceneSystemInterface.h>
  16. #include <AzFramework/Windowing/NativeWindow.h>
  17. #include <AzFramework/Windowing/WindowBus.h>
  18. #include <AtomCore/Instance/Instance.h>
  19. #include <Atom/RPI.Public/Base.h>
  20. #include <Atom/RPI.Public/Scene.h>
  21. #include <Atom/RPI.Public/ViewportContext.h>
  22. #include <Atom/RPI.Public/WindowContext.h>
  23. #include <Atom/RPI.Public/Image/AttachmentImage.h>
  24. #include <Atom/RPI.Public/Pass/Specific/SwapChainPass.h>
  25. #include <Atom/Bootstrap/DefaultWindowBus.h>
  26. #include <Atom/Bootstrap/BootstrapRequestBus.h>
  27. namespace AZ
  28. {
  29. namespace Render
  30. {
  31. namespace Bootstrap
  32. {
  33. class BootstrapSystemComponent
  34. : public Component
  35. , public TickBus::Handler
  36. , public AzFramework::ApplicationLifecycleEvents::Bus::Handler
  37. , public AzFramework::WindowNotificationBus::Handler
  38. , public AzFramework::WindowSystemNotificationBus::Handler
  39. , public AzFramework::WindowSystemRequestBus::Handler
  40. , public Render::Bootstrap::DefaultWindowBus::Handler
  41. , public Render::Bootstrap::RequestBus::Handler
  42. {
  43. public:
  44. AZ_COMPONENT(BootstrapSystemComponent, "{1EAFD87D-A64A-4612-93D8-B3AFFA70F09B}");
  45. BootstrapSystemComponent();
  46. ~BootstrapSystemComponent() override;
  47. static void Reflect(ReflectContext* context);
  48. static void GetProvidedServices(ComponentDescriptor::DependencyArrayType& provided);
  49. static void GetIncompatibleServices(ComponentDescriptor::DependencyArrayType& incompatible);
  50. static void GetRequiredServices(ComponentDescriptor::DependencyArrayType& required);
  51. static void GetDependentServices(ComponentDescriptor::DependencyArrayType& required);
  52. // AzFramework::WindowSystemRequestBus::Handler overrides ...
  53. AzFramework::NativeWindowHandle GetDefaultWindowHandle() override;
  54. // Render::Bootstrap::DefaultWindowBus::Handler overrides ...
  55. AZStd::shared_ptr<RPI::WindowContext> GetDefaultWindowContext() override;
  56. void SetCreateDefaultScene(bool create) override;
  57. // Render::Bootstrap::RequestBus::Handler overrides ...
  58. AZ::RPI::ScenePtr GetOrCreateAtomSceneFromAzScene(AzFramework::Scene* scene) override;
  59. bool EnsureDefaultRenderPipelineInstalledForScene(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext) override;
  60. void SwitchRenderPipeline(const AZ::RPI::RenderPipelineDescriptor& newRenderPipelineDesc, AZ::RPI::ViewportContextPtr viewportContext) override;
  61. void SwitchAntiAliasing(const AZStd::string& newAntiAliasing, AZ::RPI::ViewportContextPtr viewportContext) override;
  62. void SwitchMultiSample(const uint16_t newSampleCount, AZ::RPI::ViewportContextPtr viewportContext) override;
  63. void RefreshWindowResolution() override;
  64. protected:
  65. // Component overrides ...
  66. void Activate() override;
  67. void Deactivate() override;
  68. // WindowNotificationBus::Handler overrides ...
  69. void OnWindowClosed() override;
  70. void OnWindowResized(uint32_t width, uint32_t height) override;
  71. // TickBus::Handler overrides ...
  72. void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
  73. int GetTickOrder() override;
  74. // AzFramework::WindowSystemNotificationBus::Handler overrides ...
  75. void OnWindowCreated(AzFramework::NativeWindowHandle windowHandle) override;
  76. // AzFramework::ApplicationLifecycleEvents::Bus::Handler overrides ...
  77. void OnApplicationWindowCreated() override;
  78. void OnApplicationWindowDestroy() override;
  79. private:
  80. void Initialize();
  81. void CreateDefaultRenderPipeline();
  82. void CreateDefaultScene();
  83. void DestroyDefaultScene();
  84. void RemoveRenderPipeline();
  85. void CreateViewportContext();
  86. void SetWindowResolution();
  87. //! Run the BRDF pipeline to generate the BRDF texture
  88. void RunBRDFPipeline(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext);
  89. //! Load a render pipeline from disk and add it to the scene
  90. RPI::RenderPipelinePtr LoadPipeline(
  91. const AZ::RPI::ScenePtr scene,
  92. const AZ::RPI::ViewportContextPtr viewportContext,
  93. AZStd::string_view xrPipelineName,
  94. AZ::RPI::ViewType viewType,
  95. AZ::RHI::MultisampleState& multisampleState);
  96. AzFramework::Scene::RemovalEvent::Handler m_sceneRemovalHandler;
  97. AZStd::unique_ptr<AzFramework::NativeWindow> m_nativeWindow;
  98. AzFramework::NativeWindowHandle m_windowHandle = nullptr;
  99. RPI::ViewportContextPtr m_viewportContext;
  100. RPI::ScenePtr m_defaultScene = nullptr;
  101. AZStd::shared_ptr<AzFramework::Scene> m_defaultFrameworkScene = nullptr;
  102. bool m_isInitialized = false;
  103. // The id of the render pipeline created by this component
  104. RPI::RenderPipelineId m_renderPipelineId;
  105. // Save a reference to the image created by the BRDF pipeline so it doesn't get auto deleted if it's ref count goes to zero
  106. // For example, if we delete all the passes, we won't have to recreate the BRDF pipeline to recreate the BRDF texture
  107. Data::Instance<RPI::AttachmentImage> m_brdfTexture;
  108. bool m_createDefaultScene = true;
  109. bool m_defaultSceneReady = false;
  110. // Maps AZ scenes to RPI scene weak pointers to allow looking up a ScenePtr instead of a raw Scene*
  111. AZStd::unordered_map<AzFramework::Scene*, AZStd::weak_ptr<AZ::RPI::Scene>> m_azSceneToAtomSceneMap;
  112. AZ::SettingsRegistryInterface::NotifyEventHandler m_componentApplicationLifecycleHandler;
  113. };
  114. } // namespace Bootstrap
  115. } // namespace Render
  116. } // namespace AZ