BsCCamera.cpp 2.2 KB

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