BsCCamera.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "Renderer/BsCamera.h"
  6. #include "Scene/BsComponent.h"
  7. namespace bs
  8. {
  9. /** @addtogroup Components
  10. * @{
  11. */
  12. /**
  13. * @copydoc Camera
  14. *
  15. * Wraps a Camera as a Component.
  16. */
  17. class BS_CORE_EXPORT CCamera : public Component
  18. {
  19. public:
  20. CCamera(const HSceneObject& parent, SPtr<RenderTarget> target = nullptr,
  21. float left = 0.0f, float top = 0.0f, float width = 1.0f, float height = 1.0f);
  22. virtual ~CCamera();
  23. /** @copydoc Camera::getViewport */
  24. SPtr<Viewport> getViewport() const { return mInternal->getViewport(); }
  25. /** @copydoc Camera::setHorzFOV */
  26. virtual void setHorzFOV(const Radian& fovy) { mInternal->setHorzFOV(fovy); }
  27. /** @copydoc Camera::getHorzFOV */
  28. virtual const Radian& getHorzFOV() const { return mInternal->getHorzFOV(); }
  29. /** @copydoc Camera::setNearClipDistance */
  30. virtual void setNearClipDistance(float nearDist) { mInternal->setNearClipDistance(nearDist); }
  31. /** @copydoc Camera::getNearClipDistance */
  32. virtual float getNearClipDistance() const { return mInternal->getNearClipDistance(); }
  33. /** @copydoc Camera::setFarClipDistance */
  34. virtual void setFarClipDistance(float farDist) { mInternal->setFarClipDistance(farDist); }
  35. /** @copydoc Camera::getFarClipDistance */
  36. virtual float getFarClipDistance() const { return mInternal->getFarClipDistance(); }
  37. /** @copydoc Camera::setAspectRatio */
  38. virtual void setAspectRatio(float ratio) { mInternal->setAspectRatio(ratio); }
  39. /** @copydoc Camera::getAspectRatio */
  40. virtual float getAspectRatio() const { return mInternal->getAspectRatio(); }
  41. /** @copydoc Camera::setFrustumExtents */
  42. virtual void setFrustumExtents(float left, float right, float top, float bottom)
  43. {
  44. mInternal->setFrustumExtents(left, right, top, bottom);
  45. }
  46. /** @copydoc Camera::resetFrustumExtents */
  47. virtual void resetFrustumExtents() { mInternal->resetFrustumExtents(); }
  48. /** @copydoc Camera::getFrustumExtents */
  49. virtual void getFrustumExtents(float& outleft, float& outright, float& outtop, float& outbottom) const
  50. {
  51. mInternal->getFrustumExtents(outleft, outright, outtop, outbottom);
  52. }
  53. /** @copydoc Camera::getProjectionMatrixRS */
  54. virtual const Matrix4& getProjectionMatrixRS() const { return mInternal->getProjectionMatrixRS(); }
  55. /** @copydoc Camera::getProjectionMatrix */
  56. virtual const Matrix4& getProjectionMatrix() const { return mInternal->getProjectionMatrix(); }
  57. /** @copydoc Camera::getViewMatrix */
  58. virtual const Matrix4& getViewMatrix() const { updateView(); return mInternal->getViewMatrix(); }
  59. /** @copydoc Camera::setCustomViewMatrix */
  60. virtual void setCustomViewMatrix(bool enable, const Matrix4& viewMatrix = Matrix4::IDENTITY)
  61. {
  62. mInternal->setCustomViewMatrix(enable, viewMatrix);
  63. }
  64. /** @copydoc Camera::isCustomViewMatrixEnabled */
  65. virtual bool isCustomViewMatrixEnabled() const { return mInternal->isCustomViewMatrixEnabled(); }
  66. /** @copydoc Camera::setCustomProjectionMatrix */
  67. virtual void setCustomProjectionMatrix(bool enable, const Matrix4& projectionMatrix = Matrix4::IDENTITY)
  68. {
  69. mInternal->setCustomProjectionMatrix(enable, projectionMatrix);
  70. }
  71. /** @copydoc Camera::isCustomProjectionMatrixEnabled */
  72. virtual bool isCustomProjectionMatrixEnabled() const { return mInternal->isCustomProjectionMatrixEnabled(); }
  73. /** @copydoc Camera::getFrustum */
  74. virtual const ConvexVolume& getFrustum() const { return mInternal->getFrustum(); }
  75. /** @copydoc Camera::getWorldFrustum */
  76. virtual ConvexVolume getWorldFrustum() const;
  77. /** @copydoc Camera::getBoundingBox */
  78. const AABox& getBoundingBox() const { return mInternal->getBoundingBox(); }
  79. /** @copydoc Camera::setProjectionType */
  80. virtual void setProjectionType(ProjectionType pt) { mInternal->setProjectionType(pt); }
  81. /** @copydoc Camera::getProjectionType */
  82. virtual ProjectionType getProjectionType() const { return mInternal->getProjectionType(); }
  83. /** @copydoc Camera::setOrthoWindow */
  84. virtual void setOrthoWindow(float w, float h) { mInternal->setOrthoWindow(w, h); }
  85. /** @copydoc Camera::setOrthoWindowHeight */
  86. virtual void setOrthoWindowHeight(float h) { mInternal->setOrthoWindowHeight(h); }
  87. /** @copydoc Camera::setOrthoWindowWidth */
  88. virtual void setOrthoWindowWidth(float w) { mInternal->setOrthoWindowWidth(w); }
  89. /** @copydoc Camera::getOrthoWindowHeight */
  90. virtual float getOrthoWindowHeight() const { return mInternal->getOrthoWindowHeight(); }
  91. /** @copydoc Camera::getOrthoWindowWidth */
  92. virtual float getOrthoWindowWidth() const { return mInternal->getOrthoWindowWidth(); }
  93. /** @copydoc Camera::getPriority */
  94. INT32 getPriority() const { return mInternal->getPriority(); }
  95. /** @copydoc Camera::setPriority */
  96. void setPriority(INT32 priority) { mInternal->setPriority(priority); }
  97. /** @copydoc Camera::getLayers */
  98. UINT64 getLayers() const { return mInternal->getLayers(); }
  99. /** @copydoc Camera::setLayers */
  100. void setLayers(UINT64 layers) { mInternal->setLayers(layers); }
  101. /** @copydoc Camera::getMSAACount */
  102. UINT32 getMSAACount() const { return mInternal->getMSAACount(); }
  103. /** @copydoc Camera::setMSAACount */
  104. void setMSAACount(UINT32 count) { mInternal->setMSAACount(count); }
  105. /** @copydoc Camera::getRenderSettings() */
  106. const SPtr<RenderSettings>& getRenderSettings() const { return mInternal->getRenderSettings(); }
  107. /** @copydoc Camera::setRenderSettings() */
  108. void setRenderSettings(const SPtr<RenderSettings>& settings) { mInternal->setRenderSettings(settings); }
  109. /** @copydoc Camera::worldToScreenPoint */
  110. Vector2I worldToScreenPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToScreenPoint(worldPoint); }
  111. /** @copydoc Camera::worldToNdcPoint */
  112. Vector2 worldToNdcPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToNdcPoint(worldPoint); }
  113. /** @copydoc Camera::worldToViewPoint */
  114. Vector3 worldToViewPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToViewPoint(worldPoint); }
  115. /** @copydoc Camera::screenToWorldPoint */
  116. Vector3 screenToWorldPoint(const Vector2I& screenPoint, float depth = 0.5f) const { updateView(); return mInternal->screenToWorldPoint(screenPoint, depth); }
  117. /** @copydoc Camera::screenToViewPoint */
  118. Vector3 screenToViewPoint(const Vector2I& screenPoint, float depth = 0.5f) const { return mInternal->screenToViewPoint(screenPoint, depth); }
  119. /** @copydoc Camera::screenToNdcPoint */
  120. Vector2 screenToNdcPoint(const Vector2I& screenPoint) const { return mInternal->screenToNdcPoint(screenPoint); }
  121. /** @copydoc Camera::viewToWorldPoint */
  122. Vector3 viewToWorldPoint(const Vector3& viewPoint) const { updateView(); return mInternal->viewToWorldPoint(viewPoint); }
  123. /** @copydoc Camera::viewToScreenPoint */
  124. Vector2I viewToScreenPoint(const Vector3& viewPoint) const { return mInternal->viewToScreenPoint(viewPoint); }
  125. /** @copydoc Camera::viewToNdcPoint */
  126. Vector2 viewToNdcPoint(const Vector3& viewPoint) const { return mInternal->viewToNdcPoint(viewPoint); }
  127. /** @copydoc Camera::ndcToWorldPoint */
  128. Vector3 ndcToWorldPoint(const Vector2& ndcPoint, float depth = 0.5f) const { updateView(); return mInternal->ndcToWorldPoint(ndcPoint, depth); }
  129. /** @copydoc Camera::ndcToViewPoint */
  130. Vector3 ndcToViewPoint(const Vector2& ndcPoint, float depth = 0.5f) const { return mInternal->ndcToViewPoint(ndcPoint, depth); }
  131. /** @copydoc Camera::ndcToScreenPoint */
  132. Vector2I ndcToScreenPoint(const Vector2& ndcPoint) const { return mInternal->ndcToScreenPoint(ndcPoint); }
  133. /** @copydoc Camera::screenPointToRay */
  134. Ray screenPointToRay(const Vector2I& screenPoint) const { updateView(); return mInternal->screenPointToRay(screenPoint); }
  135. /** @copydoc Camera::projectPoint */
  136. Vector3 projectPoint(const Vector3& point) const { return mInternal->projectPoint(point); }
  137. /** @copydoc Camera::unprojectPoint */
  138. Vector3 unprojectPoint(const Vector3& point) const { return mInternal->unprojectPoint(point); }
  139. /** @copydoc Camera::isMain */
  140. bool isMain() const { return mInternal->isMain(); }
  141. /** @copydoc Camera::setMain */
  142. void setMain(bool main);
  143. /** @name Internal
  144. * @{
  145. */
  146. /** Returns the internal camera that is used for majority of operations by this component. */
  147. SPtr<Camera> _getCamera() const { updateView(); return mInternal; }
  148. /** @} */
  149. protected:
  150. /** Checks if the world transform of the camera changed, and if needed updates the view matrix. */
  151. void updateView() const;
  152. mutable SPtr<Camera> mInternal;
  153. // Only valid during construction
  154. SPtr<RenderTarget> mTarget;
  155. float mLeft;
  156. float mTop;
  157. float mWidth;
  158. float mHeight;
  159. /************************************************************************/
  160. /* COMPONENT OVERRIDES */
  161. /************************************************************************/
  162. protected:
  163. friend class SceneObject;
  164. /** @copydoc Component::onInitialized */
  165. void onInitialized() override;
  166. /** @copydoc Component::onDestroyed */
  167. void onDestroyed() override;
  168. public:
  169. /** @copydoc Component::update */
  170. void update() override;
  171. /************************************************************************/
  172. /* RTTI */
  173. /************************************************************************/
  174. public:
  175. friend class CCameraRTTI;
  176. static RTTITypeBase* getRTTIStatic();
  177. RTTITypeBase* getRTTI() const override;
  178. protected:
  179. CCamera();// Serialization only
  180. };
  181. /** @} */
  182. }