BsCCamera.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Components/BsCCamera.h"
  4. #include "RTTI/BsCCameraRTTI.h"
  5. #include "Scene/BsSceneObject.h"
  6. #include "Scene/BsSceneManager.h"
  7. #include "BsCoreApplication.h"
  8. namespace bs
  9. {
  10. CCamera::CCamera()
  11. {
  12. setFlag(ComponentFlag::AlwaysRun, true);
  13. setName("Camera");
  14. }
  15. CCamera::CCamera(const HSceneObject& parent, SPtr<RenderTarget> target, float left, float top, float width, float height)
  16. : Component(parent), mTarget(target), mLeft(left), mTop(top), mWidth(width), mHeight(height)
  17. {
  18. if(mTarget == nullptr)
  19. mTarget = CoreApplication::instance().getPrimaryWindow();
  20. setFlag(ComponentFlag::AlwaysRun, true);
  21. setName("Camera");
  22. }
  23. CCamera::~CCamera()
  24. {
  25. mInternal->destroy();
  26. }
  27. ConvexVolume CCamera::getWorldFrustum() const
  28. {
  29. const Vector<Plane>& frustumPlanes = getFrustum().getPlanes();
  30. Matrix4 worldMatrix = SO()->getWorldTfrm();
  31. Vector<Plane> worldPlanes(frustumPlanes.size());
  32. UINT32 i = 0;
  33. for (auto& plane : frustumPlanes)
  34. {
  35. worldPlanes[i] = worldMatrix.multiplyAffine(plane);
  36. i++;
  37. }
  38. return ConvexVolume(worldPlanes);
  39. }
  40. void CCamera::updateView() const
  41. {
  42. UINT32 curHash = SO()->getTransformHash();
  43. if (curHash != mInternal->_getLastModifiedHash())
  44. {
  45. mInternal->setPosition(SO()->getWorldPosition());
  46. mInternal->setRotation(SO()->getWorldRotation());
  47. mInternal->_setLastModifiedHash(curHash);
  48. }
  49. }
  50. void CCamera::setMain(bool main)
  51. {
  52. mInternal->setMain(main);
  53. gSceneManager()._notifyMainCameraStateChanged(mInternal);
  54. }
  55. void CCamera::update()
  56. {
  57. }
  58. void CCamera::onInitialized()
  59. {
  60. // If mInternal already exists this means this object was deserialized,
  61. // so all we need to do is initialize it.
  62. if (mInternal != nullptr)
  63. mInternal->initialize();
  64. else
  65. {
  66. mInternal = Camera::create(mTarget, mLeft, mTop, mWidth, mHeight);
  67. mTarget = nullptr;
  68. }
  69. gSceneManager()._registerCamera(mInternal, SO());
  70. }
  71. void CCamera::onDestroyed()
  72. {
  73. gSceneManager()._unregisterCamera(mInternal);
  74. }
  75. RTTITypeBase* CCamera::getRTTIStatic()
  76. {
  77. return CCameraRTTI::instance();
  78. }
  79. RTTITypeBase* CCamera::getRTTI() const
  80. {
  81. return CCamera::getRTTIStatic();
  82. }
  83. }