CameraNode.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. constexpr F32 defaultFar = 500.0f;
  62. // Move component
  63. newComponent<MoveComponent>();
  64. // Feedback component
  65. newComponent<MoveFeedbackComponent>();
  66. // Frustum component
  67. FrustumComponent* frc = newComponent<FrustumComponent>(this, frustumType);
  68. const FrustumComponentVisibilityTestFlag visibilityFlags =
  69. FrustumComponentVisibilityTestFlag::RENDER_COMPONENTS | FrustumComponentVisibilityTestFlag::LIGHT_COMPONENTS
  70. | FrustumComponentVisibilityTestFlag::LENS_FLARE_COMPONENTS
  71. | FrustumComponentVisibilityTestFlag::REFLECTION_PROBES | FrustumComponentVisibilityTestFlag::REFLECTION_PROXIES
  72. | FrustumComponentVisibilityTestFlag::OCCLUDERS | FrustumComponentVisibilityTestFlag::DECALS
  73. | FrustumComponentVisibilityTestFlag::FOG_DENSITY_COMPONENTS
  74. | FrustumComponentVisibilityTestFlag::GLOBAL_ILLUMINATION_PROBES | FrustumComponentVisibilityTestFlag::EARLY_Z
  75. | FrustumComponentVisibilityTestFlag::ALL_SHADOWS_ENABLED
  76. | FrustumComponentVisibilityTestFlag::GENERIC_COMPUTE_JOB_COMPONENTS;
  77. frc->setEnabledVisibilityTests(visibilityFlags);
  78. if(frustumType == FrustumType::PERSPECTIVE)
  79. {
  80. frc->setPerspective(0.1f, defaultFar, toRad(45.0f), toRad(45.0f));
  81. }
  82. else
  83. {
  84. frc->setOrthographic(0.1f, defaultFar, 5.0f, -5.0f, 5.0f, -5.0f);
  85. }
  86. // Extended frustum for RT
  87. if(getSceneGraph().getRayTracedShadowsEnabled())
  88. {
  89. FrustumComponent* rtFrustumComponent = newComponent<FrustumComponent>(this, FrustumType::ORTHOGRAPHIC);
  90. rtFrustumComponent->setEnabledVisibilityTests(FrustumComponentVisibilityTestFlag::RAY_TRACING_SHADOWS);
  91. rtFrustumComponent->setOrthographic(0.1f, defaultFar * 2.0f, defaultFar, -defaultFar, defaultFar, -defaultFar);
  92. }
  93. // Feedback component #2
  94. newComponent<FrustumFeedbackComponent>();
  95. // Spatial component
  96. SpatialComponent* spatialc;
  97. if(frustumType == FrustumType::PERSPECTIVE)
  98. {
  99. spatialc = newComponent<SpatialComponent>(this, &frc->getPerspectiveBoundingShape());
  100. }
  101. else
  102. {
  103. spatialc = newComponent<SpatialComponent>(this, &frc->getOrthographicBoundingShape());
  104. }
  105. spatialc->setUpdateOctreeBounds(false);
  106. return Error::NONE;
  107. }
  108. void CameraNode::onFrustumComponentUpdate(FrustumComponent& fr)
  109. {
  110. // Spatial
  111. SpatialComponent& sp = getFirstComponentOfType<SpatialComponent>();
  112. sp.markForUpdate();
  113. }
  114. void CameraNode::onMoveComponentUpdate(MoveComponent& move)
  115. {
  116. const Transform& worldTransform = move.getWorldTransform();
  117. // Frustum
  118. U count = 0;
  119. const Error err = iterateComponentsOfType<FrustumComponent>([&](FrustumComponent& fc) {
  120. if(count == 0)
  121. {
  122. fc.setTransform(worldTransform);
  123. }
  124. else
  125. {
  126. // Extended RT frustum, re-align it so the frustum is positioned at the center of the camera eye
  127. ANKI_ASSERT(fc.getFrustumType() == FrustumType::ORTHOGRAPHIC);
  128. const F32 far = fc.getFar();
  129. Transform extendedFrustumTransform = Transform::getIdentity();
  130. Vec3 newOrigin = worldTransform.getOrigin().xyz();
  131. newOrigin.z() += far / 2.0f;
  132. extendedFrustumTransform.setOrigin(newOrigin.xyz0());
  133. }
  134. ++count;
  135. return Error::NONE;
  136. });
  137. (void)err;
  138. ANKI_ASSERT(count == 2);
  139. // Spatial
  140. SpatialComponent& sp = getFirstComponentOfType<SpatialComponent>();
  141. sp.setSpatialOrigin(move.getWorldTransform().getOrigin());
  142. sp.markForUpdate();
  143. }
  144. PerspectiveCameraNode::PerspectiveCameraNode(SceneGraph* scene, CString name)
  145. : CameraNode(scene, name)
  146. {
  147. }
  148. PerspectiveCameraNode::~PerspectiveCameraNode()
  149. {
  150. }
  151. OrthographicCameraNode::OrthographicCameraNode(SceneGraph* scene, CString name)
  152. : CameraNode(scene, name)
  153. {
  154. }
  155. OrthographicCameraNode::~OrthographicCameraNode()
  156. {
  157. }
  158. } // end namespace anki