3
0

AuxGeomFeatureProcessor.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. #include <Atom/Feature/AuxGeom/AuxGeomFeatureProcessor.h>
  9. #include "AuxGeomDrawQueue.h"
  10. #include "DynamicPrimitiveProcessor.h"
  11. #include "FixedShapeProcessor.h"
  12. #include <Atom/RHI/RHISystemInterface.h>
  13. #include <Atom/RPI.Public/View.h>
  14. namespace AZ
  15. {
  16. namespace Render
  17. {
  18. const char* AuxGeomFeatureProcessor::s_featureProcessorName = "AuxGeomFeatureProcessor";
  19. void AuxGeomFeatureProcessor::Reflect(ReflectContext* context)
  20. {
  21. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  22. {
  23. serializeContext
  24. ->Class<AuxGeomFeatureProcessor, FeatureProcessor>()
  25. ->Version(1);
  26. }
  27. }
  28. void AuxGeomFeatureProcessor::Activate()
  29. {
  30. AZ::RPI::Scene* scene = GetParentScene();
  31. // create an AuxGeomDrawQueue object for this scene and register it with the AuxGeomSystemComponent
  32. m_sceneDrawQueue = RPI::AuxGeomDrawPtr(aznew AuxGeomDrawQueue);
  33. RHI::RHISystemInterface* rhiSystem = RHI::RHISystemInterface::Get();
  34. // initialize the dynamic primitive processor
  35. m_dynamicPrimitiveProcessor = AZStd::make_unique<DynamicPrimitiveProcessor>();
  36. if (!m_dynamicPrimitiveProcessor->Initialize(scene))
  37. {
  38. AZ_Error(s_featureProcessorName, false, "Failed to init AuxGeom DynamicPrimitiveProcessor");
  39. return;
  40. }
  41. // initialize the fixed shape processor
  42. m_fixedShapeProcessor = AZStd::make_unique<FixedShapeProcessor>();
  43. if (!m_fixedShapeProcessor->Initialize(*rhiSystem->GetDevice(), scene))
  44. {
  45. AZ_Error(s_featureProcessorName, false, "Failed to init AuxGeom FixedShapeProcessor");
  46. return;
  47. }
  48. EnableSceneNotification();
  49. }
  50. void AuxGeomFeatureProcessor::Deactivate()
  51. {
  52. DisableSceneNotification();
  53. m_viewDrawDataMap.clear();
  54. m_dynamicPrimitiveProcessor->Release();
  55. m_dynamicPrimitiveProcessor = nullptr;
  56. m_fixedShapeProcessor->Release();
  57. m_fixedShapeProcessor = nullptr;
  58. // release the AuxGeomDrawQueue object for this scene
  59. m_sceneDrawQueue = nullptr;
  60. }
  61. void AuxGeomFeatureProcessor::Render(const FeatureProcessor::RenderPacket& fpPacket)
  62. {
  63. AZ_PROFILE_SCOPE(AzRender, "AuxGeomFeatureProcessor: Render");
  64. // Get the scene data and switch buffers so that other threads can continue to queue requests
  65. AuxGeomBufferData* bufferData = static_cast<AuxGeomDrawQueue*>(m_sceneDrawQueue.get())->Commit();
  66. // Process the dynamic primitives
  67. m_dynamicPrimitiveProcessor->PrepareFrame();
  68. m_dynamicPrimitiveProcessor->ProcessDynamicPrimitives(bufferData, fpPacket);
  69. // Process the objects (draw requests using fixed shape buffers)
  70. m_fixedShapeProcessor->PrepareFrame();
  71. m_fixedShapeProcessor->ProcessObjects(bufferData, fpPacket);
  72. if (m_viewDrawDataMap.size())
  73. {
  74. FeatureProcessor::RenderPacket perViewRP;
  75. perViewRP.m_drawListMask = fpPacket.m_drawListMask;
  76. for (auto& view : fpPacket.m_views)
  77. {
  78. auto it = m_viewDrawDataMap.find(view.get());
  79. if (it != m_viewDrawDataMap.end())
  80. {
  81. bufferData = static_cast<AuxGeomDrawQueue*>(it->second.get())->Commit();
  82. perViewRP.m_views.push_back(view);
  83. // Process the dynamic primitives
  84. m_dynamicPrimitiveProcessor->ProcessDynamicPrimitives(bufferData, perViewRP);
  85. // Process the objects (draw requests using fixed shape buffers)
  86. m_fixedShapeProcessor->ProcessObjects(bufferData, perViewRP);
  87. perViewRP.m_views.clear();
  88. }
  89. }
  90. }
  91. }
  92. void AuxGeomFeatureProcessor::OnRenderEnd()
  93. {
  94. m_dynamicPrimitiveProcessor->FrameEnd();
  95. m_fixedShapeProcessor->FrameEnd();
  96. }
  97. RPI::AuxGeomDrawPtr AuxGeomFeatureProcessor::GetDrawQueueForView(const RPI::View* view)
  98. {
  99. if (view)
  100. {
  101. auto drawDataIterator = m_viewDrawDataMap.find(view);
  102. if (drawDataIterator != m_viewDrawDataMap.end())
  103. {
  104. return drawDataIterator->second;
  105. }
  106. }
  107. AZ_Warning("AuxGeomFeatureProcessor", false, "Draw Queue requested for unknown view");
  108. return RPI::AuxGeomDrawPtr(nullptr);
  109. }
  110. RPI::AuxGeomDrawPtr AuxGeomFeatureProcessor::GetOrCreateDrawQueueForView(const RPI::View* view)
  111. {
  112. if (!view)
  113. {
  114. return RPI::AuxGeomDrawPtr(nullptr);
  115. }
  116. auto drawQueueIterator = m_viewDrawDataMap.find(view);
  117. if (drawQueueIterator == m_viewDrawDataMap.end())
  118. {
  119. RPI::AuxGeomDrawPtr drawQueue = RPI::AuxGeomDrawPtr(aznew AuxGeomDrawQueue());
  120. m_viewDrawDataMap.emplace(view, AZStd::move(drawQueue));
  121. return m_viewDrawDataMap[view];
  122. }
  123. return drawQueueIterator->second;
  124. }
  125. void AuxGeomFeatureProcessor::ReleaseDrawQueueForView(const RPI::View* view)
  126. {
  127. m_viewDrawDataMap.erase(view);
  128. }
  129. void AuxGeomFeatureProcessor::OnSceneRenderPipelinesChanged()
  130. {
  131. m_dynamicPrimitiveProcessor->SetUpdatePipelineStates();
  132. m_fixedShapeProcessor->SetUpdatePipelineStates();
  133. }
  134. void AuxGeomFeatureProcessor::OnRenderPipelineChanged([[maybe_unused]] RPI::RenderPipeline* pipeline,
  135. [[maybe_unused]] RPI::SceneNotification::RenderPipelineChangeType changeType)
  136. {
  137. OnSceneRenderPipelinesChanged();
  138. }
  139. } // namespace Render
  140. } // namespace AZ