BsCCamera.cpp 2.1 KB

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