MultiSceneExampleComponent.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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 <CommonSampleComponentBase.h>
  10. #include <Atom/RPI.Public/Base.h>
  11. #include <Atom/RPI.Public/WindowContext.h>
  12. #include <AzCore/Asset/AssetCommon.h>
  13. #include <AzCore/Component/TickBus.h>
  14. #include <AzFramework/Scene/Scene.h>
  15. #include <AzFramework/Windowing/WindowBus.h>
  16. #include <AzFramework/Windowing/NativeWindow.h>
  17. #include <Atom/Feature/CoreLights/PointLightFeatureProcessorInterface.h>
  18. #include <Atom/Feature/CoreLights/DiskLightFeatureProcessorInterface.h>
  19. #include <Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h>
  20. #include <Atom/Feature/ReflectionProbe/ReflectionProbeFeatureProcessorInterface.h>
  21. #include <Utils/Utils.h>
  22. struct ImGuiContext;
  23. namespace AtomSampleViewer
  24. {
  25. class SecondWindowedScene
  26. : public AZ::TickBus::Handler
  27. , public AzFramework::WindowNotificationBus::Handler
  28. {
  29. using ModelChangedHandler = AZ::Render::MeshHandleDescriptor::ModelChangedEvent::Handler;
  30. using PointLightHandle = AZ::Render::PointLightFeatureProcessorInterface::LightHandle;
  31. using DiskLightHandle = AZ::Render::DiskLightFeatureProcessorInterface::LightHandle;
  32. using DirectionalLightHandle = AZ::Render::DirectionalLightFeatureProcessorInterface::LightHandle;
  33. using ReflectionProbeHandle = AZ::Render::ReflectionProbeHandle;
  34. static constexpr uint32_t ShaderBallCount = 12u;
  35. public:
  36. SecondWindowedScene(AZStd::string_view sceneName, class MultiSceneExampleComponent* parent);
  37. ~SecondWindowedScene();
  38. AzFramework::NativeWindowHandle GetNativeWindowHandle();
  39. void MoveCamera(bool enabled);
  40. // AZ::TickBus::Handler overrides ...
  41. void OnTick(float deltaTime, AZ::ScriptTimePoint timePoint) override;
  42. // AzFramework::WindowNotificationBus::Handler overrides ...
  43. void OnWindowClosed() override;
  44. private:
  45. AZStd::unique_ptr<AzFramework::NativeWindow> m_nativeWindow;
  46. AZStd::shared_ptr<AZ::RPI::WindowContext> m_windowContext;
  47. AZStd::unique_ptr<AzFramework::EntityContext> m_entityContext;
  48. AZStd::string m_sceneName;
  49. AZStd::shared_ptr<AzFramework::Scene> m_frameworkScene;
  50. AZ::RPI::ScenePtr m_scene;
  51. AZ::RPI::RenderPipelinePtr m_pipeline;
  52. // Entities
  53. AZ::Entity* m_cameraEntity = nullptr;
  54. AZ::Entity* m_depthOfFieldEntity = nullptr;
  55. // Feature Settings
  56. AZ::Render::DepthOfFieldSettingsInterface* m_depthOfFieldSettings = nullptr;
  57. // FeatureProcessors
  58. AZ::Render::MeshFeatureProcessorInterface* m_meshFeatureProcessor = nullptr;
  59. AZ::Render::SkyBoxFeatureProcessorInterface* m_skyBoxFeatureProcessor = nullptr;
  60. AZ::Render::PointLightFeatureProcessorInterface* m_pointLightFeatureProcessor = nullptr;
  61. AZ::Render::DiskLightFeatureProcessorInterface* m_diskLightFeatureProcessor = nullptr;
  62. AZ::Render::DirectionalLightFeatureProcessorInterface* m_directionalLightFeatureProcessor = nullptr;
  63. AZ::Render::PostProcessFeatureProcessorInterface* m_postProcessFeatureProcessor = nullptr;
  64. AZ::Render::ReflectionProbeFeatureProcessorInterface* m_reflectionProbeFeatureProcessor = nullptr;
  65. // Meshes
  66. AZStd::vector<AZ::Render::MeshFeatureProcessorInterface::MeshHandle> m_shaderBallMeshHandles;
  67. AZ::Render::MeshFeatureProcessorInterface::MeshHandle m_floorMeshHandle;
  68. // Various FeatureProcessor handles
  69. PointLightHandle m_pointLightHandle;
  70. DiskLightHandle m_diskLightHandle;
  71. DirectionalLightHandle m_directionalLightHandle;
  72. ReflectionProbeHandle m_reflectionProbeHandle;
  73. MultiSceneExampleComponent* m_parent = nullptr;
  74. const AZ::Vector3 m_cameraOffset{ 0.0f, -4.0f, 2.0f };
  75. AZ::Vector3 m_dynamicCameraOffset{ 3.73f, 0.0f, 0.0f };
  76. bool m_moveCamera = false;
  77. Utils::DefaultIBL m_defaultIbl;
  78. };
  79. //! A sample component to demonstrate multiple scenes.
  80. class MultiSceneExampleComponent final
  81. : public CommonSampleComponentBase
  82. , public AZ::TickBus::Handler
  83. {
  84. public:
  85. AZ_COMPONENT(MultiSceneExampleComponent, "{FB0F55AE-6708-47BE-87EB-DD1EB3EF5CD1}", CommonSampleComponentBase);
  86. static void Reflect(AZ::ReflectContext* context);
  87. MultiSceneExampleComponent();
  88. ~MultiSceneExampleComponent() override = default;
  89. // AZ::Component
  90. void Activate() override;
  91. void Deactivate() override;
  92. void OnChildWindowClosed();
  93. private:
  94. // AZ::TickBus::Handler overrides ...
  95. void OnTick(float deltaTime, AZ::ScriptTimePoint timePoint) override;
  96. // CommonSampleComponentBase overrides ...
  97. void OnAllAssetsReadyActivate() override;
  98. void OpenSecondSceneWindow();
  99. AZ::Render::MeshFeatureProcessorInterface::MeshHandle m_meshHandle;
  100. AZ::Component* m_mainCameraControlComponent = nullptr;
  101. AZStd::unique_ptr<SecondWindowedScene> m_windowedScene;
  102. // Lights
  103. Utils::DefaultIBL m_defaultIbl;
  104. };
  105. } // namespace AtomSampleViewer