CameraComponent.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Scene/Components/CameraComponent.h>
  6. #include <AnKi/Scene/Components/MoveComponent.h>
  7. #include <AnKi/Scene/SceneNode.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. #include <AnKi/Core/App.h>
  10. namespace anki {
  11. static NumericCVar<U8> g_shadowCascadeCountCVar(CVarSubsystem::kScene, "ShadowCascadeCount", (ANKI_PLATFORM_MOBILE) ? 2 : kMaxShadowCascades, 1,
  12. kMaxShadowCascades, "Max number of shadow cascades for directional lights");
  13. static NumericCVar<F32> g_shadowCascade0DistanceCVar(CVarSubsystem::kScene, "ShadowCascade0Distance", 18.0, 1.0, kMaxF32,
  14. "The distance of the 1st cascade");
  15. static NumericCVar<F32> g_shadowCascade1DistanceCVar(CVarSubsystem::kScene, "ShadowCascade1Distance", 40.0, 1.0, kMaxF32,
  16. "The distance of the 2nd cascade");
  17. static NumericCVar<F32> g_shadowCascade2DistanceCVar(CVarSubsystem::kScene, "ShadowCascade2Distance", 80.0, 1.0, kMaxF32,
  18. "The distance of the 3rd cascade");
  19. static NumericCVar<F32> g_shadowCascade3DistanceCVar(CVarSubsystem::kScene, "ShadowCascade3Distance", 200.0, 1.0, kMaxF32,
  20. "The distance of the 4th cascade");
  21. static NumericCVar<F32> g_earyZDistanceCVar(CVarSubsystem::kScene, "EarlyZDistance", (ANKI_PLATFORM_MOBILE) ? 0.0f : 10.0f, 0.0f, kMaxF32,
  22. "Objects with distance lower than that will be used in early Z");
  23. BoolCVar g_rayTracedShadowsCVar(CVarSubsystem::kScene, "RayTracedShadows", true, "Enable or not ray traced shadows. Ignored if RT is not supported");
  24. static NumericCVar<F32>
  25. g_rayTracingExtendedFrustumDistanceCVar(CVarSubsystem::kScene, "RayTracingExtendedFrustumDistance", 100.0f, 10.0f, 10000.0f,
  26. "Every object that its distance from the camera is bellow that value will take part in ray tracing");
  27. CameraComponent::CameraComponent(SceneNode* node)
  28. : SceneComponent(node, getStaticClassId())
  29. {
  30. // Init main frustum
  31. m_frustum.init(FrustumType::kPerspective);
  32. m_frustum.setLodDistance(0, g_lod0MaxDistanceCVar.get());
  33. m_frustum.setLodDistance(1, g_lod1MaxDistanceCVar.get());
  34. m_frustum.setShadowCascadeCount(g_shadowCascadeCountCVar.get());
  35. static_assert(kMaxShadowCascades == 4);
  36. m_frustum.setShadowCascadeDistance(0, g_shadowCascade0DistanceCVar.get());
  37. m_frustum.setShadowCascadeDistance(1, g_shadowCascade1DistanceCVar.get());
  38. m_frustum.setShadowCascadeDistance(2, g_shadowCascade2DistanceCVar.get());
  39. m_frustum.setShadowCascadeDistance(3, g_shadowCascade3DistanceCVar.get());
  40. m_frustum.setWorldTransform(node->getWorldTransform());
  41. m_frustum.setEarlyZDistance(g_earyZDistanceCVar.get());
  42. m_frustum.update();
  43. // Init extended frustum
  44. m_usesExtendedFrustum = GrManager::getSingleton().getDeviceCapabilities().m_rayTracingEnabled && g_rayTracedShadowsCVar.get();
  45. if(m_usesExtendedFrustum)
  46. {
  47. m_extendedFrustum.init(FrustumType::kOrthographic);
  48. const F32 dist = g_rayTracingExtendedFrustumDistanceCVar.get();
  49. m_extendedFrustum.setOrthographic(0.1f, dist * 2.0f, dist, -dist, dist, -dist);
  50. m_extendedFrustum.setWorldTransform(computeExtendedFrustumTransform(node->getWorldTransform()));
  51. m_extendedFrustum.update();
  52. }
  53. }
  54. CameraComponent::~CameraComponent()
  55. {
  56. }
  57. Error CameraComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
  58. {
  59. if(info.m_node->movedThisFrame())
  60. {
  61. m_frustum.setWorldTransform(info.m_node->getWorldTransform());
  62. if(m_usesExtendedFrustum)
  63. {
  64. m_extendedFrustum.setWorldTransform(computeExtendedFrustumTransform(info.m_node->getWorldTransform()));
  65. }
  66. }
  67. updated = m_frustum.update();
  68. if(m_usesExtendedFrustum)
  69. {
  70. const Bool extendedUpdated = m_extendedFrustum.update();
  71. updated = updated || extendedUpdated;
  72. }
  73. return Error::kNone;
  74. }
  75. Transform CameraComponent::computeExtendedFrustumTransform(const Transform& cameraTransform) const
  76. {
  77. const F32 far = m_extendedFrustum.getFar();
  78. Transform extendedFrustumTransform = Transform::getIdentity();
  79. Vec3 newOrigin = cameraTransform.getOrigin().xyz();
  80. newOrigin.z() += far / 2.0f;
  81. extendedFrustumTransform.setOrigin(newOrigin.xyz0());
  82. return extendedFrustumTransform;
  83. }
  84. } // end namespace anki