BsCCamera.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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 "BsCamera.h"
  6. #include "BsComponent.h"
  7. namespace BansheeEngine
  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. /** Returns number of samples if the camera uses multiple samples per pixel. */
  102. UINT32 getMSAACount() const { return mInternal->getMSAACount(); }
  103. /**
  104. * Enables or disables multi-sampled anti-aliasing. Set to zero or one to disable, or to the required number of
  105. * samples to enable.
  106. */
  107. void setMSAACount(UINT32 count) { mInternal->setMSAACount(count); }
  108. /** Returns settings that are used for controling post-process operations like tonemapping. */
  109. const SPtr<PostProcessSettings>& getPostProcessSettings() const { return mInternal->getPostProcessSettings(); }
  110. /** Sets settings that are used for controling post-process operations like tonemapping. */
  111. void setPostProcessSettings(const SPtr<PostProcessSettings>& settings) { mInternal->setPostProcessSettings(settings); }
  112. /** @copydoc Camera::getFlags */
  113. CameraFlags getFlags() const { return mInternal->getFlags(); }
  114. /** @copydoc Camera::setFlag */
  115. void setFlag(const CameraFlag& flag, bool enable) { mInternal->setFlag(flag, enable); }
  116. /** @copydoc Camera::worldToScreenPoint */
  117. Vector2I worldToScreenPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToScreenPoint(worldPoint); }
  118. /** @copydoc Camera::worldToNdcPoint */
  119. Vector2 worldToNdcPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToNdcPoint(worldPoint); }
  120. /** @copydoc Camera::worldToViewPoint */
  121. Vector3 worldToViewPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToViewPoint(worldPoint); }
  122. /** @copydoc Camera::screenToWorldPoint */
  123. Vector3 screenToWorldPoint(const Vector2I& screenPoint, float depth = 0.5f) const { updateView(); return mInternal->screenToWorldPoint(screenPoint, depth); }
  124. /** @copydoc Camera::screenToViewPoint */
  125. Vector3 screenToViewPoint(const Vector2I& screenPoint, float depth = 0.5f) const { return mInternal->screenToViewPoint(screenPoint, depth); }
  126. /** @copydoc Camera::screenToNdcPoint */
  127. Vector2 screenToNdcPoint(const Vector2I& screenPoint) const { return mInternal->screenToNdcPoint(screenPoint); }
  128. /** @copydoc Camera::viewToWorldPoint */
  129. Vector3 viewToWorldPoint(const Vector3& viewPoint) const { updateView(); return mInternal->viewToWorldPoint(viewPoint); }
  130. /** @copydoc Camera::viewToScreenPoint */
  131. Vector2I viewToScreenPoint(const Vector3& viewPoint) const { return mInternal->viewToScreenPoint(viewPoint); }
  132. /** @copydoc Camera::viewToNdcPoint */
  133. Vector2 viewToNdcPoint(const Vector3& viewPoint) const { return mInternal->viewToNdcPoint(viewPoint); }
  134. /** @copydoc Camera::ndcToWorldPoint */
  135. Vector3 ndcToWorldPoint(const Vector2& ndcPoint, float depth = 0.5f) const { updateView(); return mInternal->ndcToWorldPoint(ndcPoint, depth); }
  136. /** @copydoc Camera::ndcToViewPoint */
  137. Vector3 ndcToViewPoint(const Vector2& ndcPoint, float depth = 0.5f) const { return mInternal->ndcToViewPoint(ndcPoint, depth); }
  138. /** @copydoc Camera::ndcToScreenPoint */
  139. Vector2I ndcToScreenPoint(const Vector2& ndcPoint) const { return mInternal->ndcToScreenPoint(ndcPoint); }
  140. /** @copydoc Camera::screenPointToRay */
  141. Ray screenPointToRay(const Vector2I& screenPoint) const { updateView(); return mInternal->screenPointToRay(screenPoint); }
  142. /** @copydoc Camera::projectPoint */
  143. Vector3 projectPoint(const Vector3& point) const { return mInternal->projectPoint(point); }
  144. /** @copydoc Camera::unprojectPoint */
  145. Vector3 unprojectPoint(const Vector3& point) const { return mInternal->unprojectPoint(point); }
  146. /** @copydoc Camera::isMain */
  147. bool isMain() const { return mInternal->isMain(); }
  148. /** @copydoc Camera::setMain */
  149. void setMain(bool main);
  150. /** @name Internal
  151. * @{
  152. */
  153. /** Returns the internal camera that is used for majority of operations by this component. */
  154. SPtr<Camera> _getCamera() const { updateView(); return mInternal; }
  155. /** @} */
  156. protected:
  157. /** Checks if the world transform of the camera changed, and if needed updates the view matrix. */
  158. void updateView() const;
  159. mutable SPtr<Camera> mInternal;
  160. // Only valid during construction
  161. SPtr<RenderTarget> mTarget;
  162. float mLeft;
  163. float mTop;
  164. float mWidth;
  165. float mHeight;
  166. /************************************************************************/
  167. /* COMPONENT OVERRIDES */
  168. /************************************************************************/
  169. protected:
  170. friend class SceneObject;
  171. /** @copydoc Component::onInitialized */
  172. void onInitialized() override;
  173. /** @copydoc Component::onDestroyed */
  174. void onDestroyed() override;
  175. public:
  176. /** @copydoc Component::update */
  177. void update() override;
  178. /************************************************************************/
  179. /* RTTI */
  180. /************************************************************************/
  181. public:
  182. friend class CCameraRTTI;
  183. static RTTITypeBase* getRTTIStatic();
  184. RTTITypeBase* getRTTI() const override;
  185. protected:
  186. CCamera() {} // Serialization only
  187. };
  188. /** @} */
  189. }