StarsFeatureProcessor.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 <Stars/StarsFeatureProcessorInterface.h>
  10. #include <Atom/RPI.Public/Buffer/Buffer.h>
  11. #include <Atom/RPI.Public/PipelineState.h>
  12. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  13. #include <Atom/RPI.Public/ViewportContextBus.h>
  14. namespace AZ::Render
  15. {
  16. class Scene;
  17. class Shader;
  18. class StarsFeatureProcessor final
  19. : public StarsFeatureProcessorInterface
  20. , protected RPI::ViewportContextIdNotificationBus::Handler
  21. , protected Data::AssetBus::Handler
  22. {
  23. public:
  24. AZ_RTTI(AZ::Render::StarsFeatureProcessor, "{34B9EE52-2893-4D02-AC19-8C5DCAFFE608}", AZ::Render::StarsFeatureProcessorInterface);
  25. static void Reflect(AZ::ReflectContext* context);
  26. StarsFeatureProcessor() = default;
  27. virtual ~StarsFeatureProcessor() = default;
  28. //! FeatureProcessor
  29. void Activate() override;
  30. void Deactivate() override;
  31. void Simulate(const FeatureProcessor::SimulatePacket& packet) override;
  32. void Render(const FeatureProcessor::RenderPacket& packet) override;
  33. //! StarsFeatureProcessorInterface
  34. void SetStars(const AZStd::vector<StarVertex>& starVertexData) override;
  35. void SetExposure(float exposure) override;
  36. void SetRadiusFactor(float radius) override;
  37. void SetOrientation(AZ::Quaternion orientation) override;
  38. void SetTwinkleRate(float twinkleRate) override;
  39. protected:
  40. //! RPI::SceneNotificationBus
  41. void OnRenderPipelineAdded(RPI::RenderPipelinePtr renderPipeline) override;
  42. void OnRenderPipelinePassesChanged(RPI::RenderPipeline* renderPipeline) override;
  43. //! RPI::ViewportContextIdNotificationBus
  44. void OnViewportSizeChanged(AzFramework::WindowSize size) override;
  45. //! Data::AssetBus
  46. void OnAssetReloaded(Data::Asset<Data::AssetData> asset) override;
  47. private:
  48. static constexpr const char* FeatureProcessorName = "StarsFeatureProcessor";
  49. StarsFeatureProcessor(const StarsFeatureProcessor&) = delete;
  50. void UpdateShaderConstants();
  51. void UpdateDrawPacket();
  52. void UpdateBackgroundClearColor();
  53. //! build a draw packet to draw the star mesh
  54. RHI::ConstPtr<RHI::DrawPacket> BuildDrawPacket(
  55. const Data::Instance<RPI::ShaderResourceGroup>& srg,
  56. const RPI::Ptr<RPI::PipelineStateForDraw>& pipelineState,
  57. const RHI::DrawListTag& drawListTag,
  58. const AZStd::span<const AZ::RHI::StreamBufferView>& streamBufferViews,
  59. uint32_t vertexCount);
  60. RPI::Ptr<RPI::PipelineStateForDraw> m_meshPipelineState;
  61. AZStd::array<AZ::RHI::StreamBufferView, 1> m_meshStreamBufferViews;
  62. Data::Instance<RPI::ShaderResourceGroup> m_drawSrg = nullptr;
  63. Data::Instance<RPI::Shader> m_shader = nullptr;
  64. RHI::ShaderInputNameIndex m_starParamsIndex = "m_starParams";
  65. RHI::ShaderInputNameIndex m_rotationIndex = "m_rotation";
  66. Data::Instance<RPI::Buffer> m_starsVertexBuffer = nullptr;
  67. RHI::DrawListTag m_drawListTag;
  68. RHI::ConstPtr<RHI::DrawPacket> m_drawPacket;
  69. bool m_updateShaderConstants = false;
  70. AZ::Matrix3x3 m_orientation = AZ::Matrix3x3::CreateIdentity();
  71. float m_exposure = StarsDefaultExposure;
  72. float m_radiusFactor = StarsDefaultRadiusFactor;
  73. struct StarShaderConstants
  74. {
  75. float m_scaleX = 1.f;
  76. float m_scaleY = 1.f;
  77. float m_scaledExposure = StarsDefaultExposure;
  78. float m_twinkleRate = StarsDefaultTwinkleRate;
  79. };
  80. StarShaderConstants m_shaderConstants;
  81. AZStd::vector<StarVertex> m_starsMeshData;
  82. uint32_t m_numStarsVertices = 0;
  83. AzFramework::WindowSize m_viewportSize{0,0};
  84. };
  85. } // namespace AZ::Render