Frustum.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright (C) 2009-present, 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/Frustum.h>
  6. #include <AnKi/Collision/Functions.h>
  7. namespace anki {
  8. Array<Mat3x4, 6> Frustum::m_omnidirectionalRotations = {Mat3x4(Vec3(0.0f), Mat3(Euler(0.0f, -kPi / 2.0f, 0.0f))), // +x
  9. Mat3x4(Vec3(0.0f), Mat3(Euler(0.0f, kPi / 2.0f, 0.0f))), // -x
  10. Mat3x4(Vec3(0.0f), Mat3(Euler(kPi / 2.0f, 0.0f, 0.0f))), // +y
  11. Mat3x4(Vec3(0.0f), Mat3(Euler(-kPi / 2.0f, 0.0f, 0.0f))), // -y
  12. Mat3x4(Vec3(0.0f), Mat3::getIdentity()), // -z
  13. Mat3x4(Vec3(0.0f), Mat3(Euler(0.0f, kPi, 0.0f)))}; // +z
  14. Frustum::Frustum()
  15. {
  16. // Set some default values
  17. init(FrustumType::kPerspective);
  18. update();
  19. }
  20. Frustum::~Frustum()
  21. {
  22. }
  23. void Frustum::init(FrustumType type)
  24. {
  25. ANKI_ASSERT(type < FrustumType::kCount);
  26. m_frustumType = type;
  27. setNear(kDefaultNear);
  28. setFar(kDefaultFar);
  29. if(m_frustumType == FrustumType::kPerspective)
  30. {
  31. setFovX(kDefaultFovAngle);
  32. setFovY(kDefaultFovAngle);
  33. }
  34. else
  35. {
  36. setLeft(-5.0f);
  37. setRight(5.0f);
  38. setBottom(-1.0f);
  39. setTop(1.0f);
  40. }
  41. }
  42. Bool Frustum::update()
  43. {
  44. Bool updated = false;
  45. // Update the shape
  46. if(m_shapeDirty)
  47. {
  48. updated = true;
  49. if(m_frustumType == FrustumType::kPerspective)
  50. {
  51. m_projMat =
  52. Mat4::calculatePerspectiveProjectionMatrix(m_perspective.m_fovX, m_perspective.m_fovY, m_perspective.m_near, m_perspective.m_far);
  53. }
  54. else
  55. {
  56. m_projMat = Mat4::calculateOrthographicProjectionMatrix(m_ortho.m_right, m_ortho.m_left, m_ortho.m_top, m_ortho.m_bottom, m_ortho.m_near,
  57. m_ortho.m_far);
  58. }
  59. }
  60. // Update transform related things
  61. if(m_worldTransformDirty)
  62. {
  63. updated = true;
  64. m_viewMat = Mat3x4(m_worldTransform.invert());
  65. }
  66. // Updates that are affected by transform & shape updates
  67. if(updated)
  68. {
  69. m_shapeDirty = false;
  70. m_worldTransformDirty = false;
  71. m_viewProjMat = m_projMat * Mat4(m_viewMat, Vec4(0.0f, 0.0f, 0.0f, 1.0f));
  72. }
  73. return updated;
  74. }
  75. } // end namespace anki