CameraNode.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright (C) 2009-2020, 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/CameraNode.h>
  6. #include <anki/scene/components/FrustumComponent.h>
  7. #include <anki/scene/components/MoveComponent.h>
  8. #include <anki/scene/components/SpatialComponent.h>
  9. #include <anki/scene/SceneGraph.h>
  10. namespace anki
  11. {
  12. /// Feedback component.
  13. class CameraNode::MoveFeedbackComponent : public SceneComponent
  14. {
  15. public:
  16. MoveFeedbackComponent()
  17. : SceneComponent(SceneComponentType::NONE)
  18. {
  19. }
  20. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  21. {
  22. updated = false;
  23. MoveComponent& move = node.getFirstComponentOfType<MoveComponent>();
  24. if(move.getTimestamp() == node.getGlobalTimestamp())
  25. {
  26. CameraNode& cam = static_cast<CameraNode&>(node);
  27. cam.onMoveComponentUpdate(move);
  28. }
  29. return Error::NONE;
  30. }
  31. };
  32. /// Feedback component.
  33. class CameraNode::FrustumFeedbackComponent : public SceneComponent
  34. {
  35. public:
  36. FrustumFeedbackComponent()
  37. : SceneComponent(SceneComponentType::NONE)
  38. {
  39. }
  40. ANKI_USE_RESULT Error update(SceneNode& node, Second prevTime, Second crntTime, Bool& updated) override
  41. {
  42. updated = false;
  43. FrustumComponent& fr = node.getFirstComponentOfType<FrustumComponent>();
  44. if(fr.getTimestamp() == node.getGlobalTimestamp())
  45. {
  46. CameraNode& cam = static_cast<CameraNode&>(node);
  47. cam.onFrustumComponentUpdate(fr);
  48. }
  49. return Error::NONE;
  50. }
  51. };
  52. CameraNode::CameraNode(SceneGraph* scene, CString name)
  53. : SceneNode(scene, name)
  54. {
  55. }
  56. CameraNode::~CameraNode()
  57. {
  58. }
  59. Error CameraNode::init(FrustumType frustumType)
  60. {
  61. // Move component
  62. newComponent<MoveComponent>();
  63. // Feedback component
  64. newComponent<MoveFeedbackComponent>();
  65. // Frustum component
  66. FrustumComponent* frc = newComponent<FrustumComponent>(this, frustumType);
  67. const FrustumComponentVisibilityTestFlag visibilityFlags =
  68. FrustumComponentVisibilityTestFlag::RENDER_COMPONENTS | FrustumComponentVisibilityTestFlag::LIGHT_COMPONENTS
  69. | FrustumComponentVisibilityTestFlag::LENS_FLARE_COMPONENTS
  70. | FrustumComponentVisibilityTestFlag::REFLECTION_PROBES | FrustumComponentVisibilityTestFlag::REFLECTION_PROXIES
  71. | FrustumComponentVisibilityTestFlag::OCCLUDERS | FrustumComponentVisibilityTestFlag::DECALS
  72. | FrustumComponentVisibilityTestFlag::FOG_DENSITY_COMPONENTS
  73. | FrustumComponentVisibilityTestFlag::GLOBAL_ILLUMINATION_PROBES | FrustumComponentVisibilityTestFlag::EARLY_Z
  74. | FrustumComponentVisibilityTestFlag::ALL_SHADOWS_ENABLED
  75. | FrustumComponentVisibilityTestFlag::GENERIC_COMPUTE_JOB_COMPONENTS;
  76. frc->setEnabledVisibilityTests(visibilityFlags);
  77. // Extended frustum for RT
  78. if(getSceneGraph().getConfig().m_rayTracedShadows)
  79. {
  80. FrustumComponent* rtFrustumComponent = newComponent<FrustumComponent>(this, FrustumType::ORTHOGRAPHIC);
  81. rtFrustumComponent->setEnabledVisibilityTests(FrustumComponentVisibilityTestFlag::RAY_TRACING_SHADOWS);
  82. const F32 dist = getSceneGraph().getConfig().m_rayTracingExtendedFrustumDistance;
  83. rtFrustumComponent->setOrthographic(0.1f, dist * 2.0f, dist, -dist, dist, -dist);
  84. }
  85. // Feedback component #2
  86. newComponent<FrustumFeedbackComponent>();
  87. // Spatial component
  88. SpatialComponent* spatialc;
  89. if(frustumType == FrustumType::PERSPECTIVE)
  90. {
  91. spatialc = newComponent<SpatialComponent>(this, &frc->getPerspectiveBoundingShape());
  92. }
  93. else
  94. {
  95. spatialc = newComponent<SpatialComponent>(this, &frc->getOrthographicBoundingShape());
  96. }
  97. spatialc->setUpdateOctreeBounds(false);
  98. return Error::NONE;
  99. }
  100. void CameraNode::onFrustumComponentUpdate(FrustumComponent& fr)
  101. {
  102. // Spatial
  103. SpatialComponent& sp = getFirstComponentOfType<SpatialComponent>();
  104. sp.markForUpdate();
  105. }
  106. void CameraNode::onMoveComponentUpdate(MoveComponent& move)
  107. {
  108. const Transform& worldTransform = move.getWorldTransform();
  109. // Frustum
  110. U count = 0;
  111. const Error err = iterateComponentsOfType<FrustumComponent>([&](FrustumComponent& fc) {
  112. if(count == 0)
  113. {
  114. fc.setTransform(worldTransform);
  115. }
  116. else
  117. {
  118. // Extended RT frustum, re-align it so the frustum is positioned at the center of the camera eye
  119. ANKI_ASSERT(fc.getFrustumType() == FrustumType::ORTHOGRAPHIC);
  120. const F32 far = fc.getFar();
  121. Transform extendedFrustumTransform = Transform::getIdentity();
  122. Vec3 newOrigin = worldTransform.getOrigin().xyz();
  123. newOrigin.z() += far / 2.0f;
  124. extendedFrustumTransform.setOrigin(newOrigin.xyz0());
  125. }
  126. ++count;
  127. return Error::NONE;
  128. });
  129. (void)err;
  130. ANKI_ASSERT(count == 2);
  131. // Spatial
  132. SpatialComponent& sp = getFirstComponentOfType<SpatialComponent>();
  133. sp.setSpatialOrigin(move.getWorldTransform().getOrigin());
  134. sp.markForUpdate();
  135. }
  136. PerspectiveCameraNode::PerspectiveCameraNode(SceneGraph* scene, CString name)
  137. : CameraNode(scene, name)
  138. {
  139. }
  140. PerspectiveCameraNode::~PerspectiveCameraNode()
  141. {
  142. }
  143. OrthographicCameraNode::OrthographicCameraNode(SceneGraph* scene, CString name)
  144. : CameraNode(scene, name)
  145. {
  146. }
  147. OrthographicCameraNode::~OrthographicCameraNode()
  148. {
  149. }
  150. } // end namespace anki