CameraComponent.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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/ConfigSet.h>
  10. namespace anki {
  11. CameraComponent::CameraComponent(SceneNode* node)
  12. : SceneComponent(node, getStaticClassId())
  13. {
  14. const ConfigSet& config = ConfigSet::getSingleton();
  15. // Init main frustum
  16. m_frustum.init(FrustumType::kPerspective, &node->getMemoryPool());
  17. m_frustum.setLodDistance(0, config.getLod0MaxDistance());
  18. m_frustum.setLodDistance(1, config.getLod1MaxDistance());
  19. m_frustum.setShadowCascadeCount(config.getSceneShadowCascadeCount());
  20. static_assert(kMaxShadowCascades == 4);
  21. m_frustum.setShadowCascadeDistance(0, config.getSceneShadowCascade0Distance());
  22. m_frustum.setShadowCascadeDistance(1, config.getSceneShadowCascade1Distance());
  23. m_frustum.setShadowCascadeDistance(2, config.getSceneShadowCascade2Distance());
  24. m_frustum.setShadowCascadeDistance(3, config.getSceneShadowCascade3Distance());
  25. m_frustum.setWorldTransform(node->getWorldTransform());
  26. m_frustum.setEarlyZDistance(config.getSceneEarlyZDistance());
  27. m_frustum.update();
  28. // Init extended frustum
  29. m_usesExtendedFrustum = getExternalSubsystems(*node).m_grManager->getDeviceCapabilities().m_rayTracingEnabled
  30. && config.getSceneRayTracedShadows();
  31. if(m_usesExtendedFrustum)
  32. {
  33. m_extendedFrustum.init(FrustumType::kOrthographic, &node->getMemoryPool());
  34. const F32 dist = config.getSceneRayTracingExtendedFrustumDistance();
  35. m_extendedFrustum.setOrthographic(0.1f, dist * 2.0f, dist, -dist, dist, -dist);
  36. m_extendedFrustum.setWorldTransform(computeExtendedFrustumTransform(node->getWorldTransform()));
  37. m_extendedFrustum.update();
  38. }
  39. }
  40. CameraComponent::~CameraComponent()
  41. {
  42. }
  43. Error CameraComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
  44. {
  45. if(info.m_node->movedThisFrame())
  46. {
  47. m_frustum.setWorldTransform(info.m_node->getWorldTransform());
  48. if(m_usesExtendedFrustum)
  49. {
  50. m_extendedFrustum.setWorldTransform(computeExtendedFrustumTransform(info.m_node->getWorldTransform()));
  51. }
  52. }
  53. updated = m_frustum.update();
  54. if(m_usesExtendedFrustum)
  55. {
  56. const Bool extendedUpdated = m_extendedFrustum.update();
  57. updated = updated || extendedUpdated;
  58. }
  59. return Error::kNone;
  60. }
  61. Transform CameraComponent::computeExtendedFrustumTransform(const Transform& cameraTransform) const
  62. {
  63. const F32 far = m_extendedFrustum.getFar();
  64. Transform extendedFrustumTransform = Transform::getIdentity();
  65. Vec3 newOrigin = cameraTransform.getOrigin().xyz();
  66. newOrigin.z() += far / 2.0f;
  67. extendedFrustumTransform.setOrigin(newOrigin.xyz0());
  68. return extendedFrustumTransform;
  69. }
  70. } // end namespace anki