3
0

OcclusionCullingPlaneFeatureProcessor.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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 <OcclusionCullingPlane/OcclusionCullingPlaneFeatureProcessor.h>
  9. #include <AzCore/std/smart_ptr/make_shared.h>
  10. #include <AzCore/std/smart_ptr/intrusive_ptr.h>
  11. #include <Atom/RPI.Public/Scene.h>
  12. #include <Atom/RPI.Public/Culling.h>
  13. namespace AZ
  14. {
  15. namespace Render
  16. {
  17. void OcclusionCullingPlaneFeatureProcessor::Reflect(ReflectContext* context)
  18. {
  19. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  20. {
  21. serializeContext
  22. ->Class<OcclusionCullingPlaneFeatureProcessor, FeatureProcessor>()
  23. ->Version(1);
  24. }
  25. }
  26. void OcclusionCullingPlaneFeatureProcessor::Activate()
  27. {
  28. m_occlusionCullingPlanes.reserve(InitialOcclusionCullingPlanesAllocationSize);
  29. m_rpiOcclusionPlanes.reserve(InitialOcclusionCullingPlanesAllocationSize);
  30. EnableSceneNotification();
  31. }
  32. void OcclusionCullingPlaneFeatureProcessor::Deactivate()
  33. {
  34. AZ_Warning("OcclusionCullingPlaneFeatureProcessor", m_occlusionCullingPlanes.size() == 0,
  35. "Deactivating the OcclusionCullingPlaneFeatureProcessor, but there are still outstanding occlusion planes. Components\n"
  36. "using OcclusionCullingPlaneHandles should free them before the OcclusionCullingPlaneFeatureProcessor is deactivated.\n"
  37. );
  38. DisableSceneNotification();
  39. }
  40. void OcclusionCullingPlaneFeatureProcessor::OnBeginPrepareRender()
  41. {
  42. if (m_rpiListNeedsUpdate)
  43. {
  44. // rebuild the RPI occlusion list
  45. m_rpiOcclusionPlanes.clear();
  46. for (auto& occlusionCullingPlane : m_occlusionCullingPlanes)
  47. {
  48. if (!occlusionCullingPlane->GetEnabled())
  49. {
  50. continue;
  51. }
  52. RPI::CullingScene::OcclusionPlane rpiOcclusionPlane;
  53. static const Vector3 BL = Vector3(-0.5f, 0.0f, -0.5f);
  54. static const Vector3 TL = Vector3(-0.5f, 0.0f, 0.5f);
  55. static const Vector3 TR = Vector3( 0.5f, 0.0f, 0.5f);
  56. static const Vector3 BR = Vector3( 0.5f, 0.0f, -0.5f);
  57. const AZ::Transform& transform = occlusionCullingPlane->GetTransform();
  58. // convert corners to world space
  59. rpiOcclusionPlane.m_cornerBL = transform.TransformPoint(BL);
  60. rpiOcclusionPlane.m_cornerTL = transform.TransformPoint(TL);
  61. rpiOcclusionPlane.m_cornerTR = transform.TransformPoint(TR);
  62. rpiOcclusionPlane.m_cornerBR = transform.TransformPoint(BR);
  63. // build world space AABB
  64. AZ::Vector3 aabbMin = rpiOcclusionPlane.m_cornerBL.GetMin(rpiOcclusionPlane.m_cornerTR);
  65. AZ::Vector3 aabbMax = rpiOcclusionPlane.m_cornerBL.GetMax(rpiOcclusionPlane.m_cornerTR);
  66. rpiOcclusionPlane.m_aabb = Aabb::CreateFromMinMax(aabbMin, aabbMax);
  67. m_rpiOcclusionPlanes.push_back(rpiOcclusionPlane);
  68. }
  69. GetParentScene()->GetCullingScene()->SetOcclusionPlanes(m_rpiOcclusionPlanes);
  70. m_rpiListNeedsUpdate = false;
  71. }
  72. }
  73. OcclusionCullingPlaneHandle OcclusionCullingPlaneFeatureProcessor::AddOcclusionCullingPlane(const AZ::Transform& transform)
  74. {
  75. AZStd::shared_ptr<OcclusionCullingPlane> occlusionCullingPlane = AZStd::make_shared<OcclusionCullingPlane>();
  76. occlusionCullingPlane->Init(GetParentScene());
  77. occlusionCullingPlane->SetTransform(transform);
  78. m_occlusionCullingPlanes.push_back(occlusionCullingPlane);
  79. m_rpiListNeedsUpdate = true;
  80. return occlusionCullingPlane;
  81. }
  82. void OcclusionCullingPlaneFeatureProcessor::RemoveOcclusionCullingPlane(OcclusionCullingPlaneHandle& occlusionCullingPlane)
  83. {
  84. AZ_Assert(occlusionCullingPlane.get(), "RemoveOcclusionCullingPlane called with an invalid handle");
  85. auto itEntry = AZStd::find_if(m_occlusionCullingPlanes.begin(), m_occlusionCullingPlanes.end(), [&](AZStd::shared_ptr<OcclusionCullingPlane> const& entry)
  86. {
  87. return (entry == occlusionCullingPlane);
  88. });
  89. AZ_Assert(itEntry != m_occlusionCullingPlanes.end(), "RemoveOcclusionCullingPlane called with an occlusion plane that is not in the occlusion plane list");
  90. m_occlusionCullingPlanes.erase(itEntry);
  91. occlusionCullingPlane = nullptr;
  92. m_rpiListNeedsUpdate = true;
  93. }
  94. void OcclusionCullingPlaneFeatureProcessor::SetTransform(const OcclusionCullingPlaneHandle& occlusionCullingPlane, const AZ::Transform& transform)
  95. {
  96. AZ_Assert(occlusionCullingPlane.get(), "SetTransform called with an invalid handle");
  97. occlusionCullingPlane->SetTransform(transform);
  98. m_rpiListNeedsUpdate = true;
  99. }
  100. void OcclusionCullingPlaneFeatureProcessor::SetEnabled(const OcclusionCullingPlaneHandle& occlusionCullingPlane, bool enabled)
  101. {
  102. AZ_Assert(occlusionCullingPlane.get(), "Enable called with an invalid handle");
  103. occlusionCullingPlane->SetEnabled(enabled);
  104. m_rpiListNeedsUpdate = true;
  105. }
  106. void OcclusionCullingPlaneFeatureProcessor::ShowVisualization(const OcclusionCullingPlaneHandle& occlusionCullingPlane, bool showVisualization)
  107. {
  108. AZ_Assert(occlusionCullingPlane.get(), "ShowVisualization called with an invalid handle");
  109. occlusionCullingPlane->ShowVisualization(showVisualization);
  110. }
  111. void OcclusionCullingPlaneFeatureProcessor::SetTransparentVisualization(const OcclusionCullingPlaneHandle& occlusionCullingPlane, bool transparentVisualization)
  112. {
  113. AZ_Assert(occlusionCullingPlane.get(), "SetTransparentVisualization called with an invalid handle");
  114. occlusionCullingPlane->SetTransparentVisualization(transparentVisualization);
  115. }
  116. } // namespace Render
  117. } // namespace AZ