BsCCamera.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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()->getWorldMatrix();
  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. mInternal->_updateState(*SO());
  43. }
  44. void CCamera::setMain(bool main)
  45. {
  46. mInternal->setMain(main);
  47. gSceneManager()._notifyMainCameraStateChanged(mInternal);
  48. }
  49. void CCamera::update()
  50. {
  51. }
  52. void CCamera::onInitialized()
  53. {
  54. // If mInternal already exists this means this object was deserialized,
  55. // so all we need to do is initialize it.
  56. if (mInternal != nullptr)
  57. mInternal->initialize();
  58. else
  59. {
  60. mInternal = Camera::create(mTarget, mLeft, mTop, mWidth, mHeight);
  61. mTarget = nullptr;
  62. }
  63. gSceneManager()._bindActor(mInternal, SO());
  64. }
  65. void CCamera::onDestroyed()
  66. {
  67. gSceneManager()._unbindActor(mInternal);
  68. }
  69. RTTITypeBase* CCamera::getRTTIStatic()
  70. {
  71. return CCameraRTTI::instance();
  72. }
  73. RTTITypeBase* CCamera::getRTTI() const
  74. {
  75. return CCamera::getRTTIStatic();
  76. }
  77. }