BsCCamera.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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 BS_SCRIPT_EXPORT(m:Rendering,n:Camera) 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. BS_SCRIPT_EXPORT(n:Viewport,pr:getter)
  25. SPtr<Viewport> getViewport() const { return mInternal->getViewport(); }
  26. /** @copydoc Camera::setHorzFOV */
  27. BS_SCRIPT_EXPORT(n:FieldOfView,pr:setter)
  28. virtual void setHorzFOV(const Radian& fovy) { mInternal->setHorzFOV(fovy); }
  29. /** @copydoc Camera::getHorzFOV */
  30. BS_SCRIPT_EXPORT(n:FieldOfView,pr:getter)
  31. virtual const Radian& getHorzFOV() const { return mInternal->getHorzFOV(); }
  32. /** @copydoc Camera::setNearClipDistance */
  33. BS_SCRIPT_EXPORT(n:NearClipPlane,pr:setter)
  34. virtual void setNearClipDistance(float nearDist) { mInternal->setNearClipDistance(nearDist); }
  35. /** @copydoc Camera::getNearClipDistance */
  36. BS_SCRIPT_EXPORT(n:NearClipPlane,pr:getter)
  37. virtual float getNearClipDistance() const { return mInternal->getNearClipDistance(); }
  38. /** @copydoc Camera::setFarClipDistance */
  39. BS_SCRIPT_EXPORT(n:FarClipPlane,pr:setter)
  40. virtual void setFarClipDistance(float farDist) { mInternal->setFarClipDistance(farDist); }
  41. /** @copydoc Camera::getFarClipDistance */
  42. BS_SCRIPT_EXPORT(n:FarClipPlane,pr:getter)
  43. virtual float getFarClipDistance() const { return mInternal->getFarClipDistance(); }
  44. /** @copydoc Camera::setAspectRatio */
  45. BS_SCRIPT_EXPORT(n:AspectRatio,pr:setter)
  46. virtual void setAspectRatio(float ratio) { mInternal->setAspectRatio(ratio); }
  47. /** @copydoc Camera::getAspectRatio */
  48. BS_SCRIPT_EXPORT(n:AspectRatio,pr:getter)
  49. virtual float getAspectRatio() const { return mInternal->getAspectRatio(); }
  50. /** @copydoc Camera::setFrustumExtents */
  51. virtual void setFrustumExtents(float left, float right, float top, float bottom)
  52. {
  53. mInternal->setFrustumExtents(left, right, top, bottom);
  54. }
  55. /** @copydoc Camera::resetFrustumExtents */
  56. virtual void resetFrustumExtents() { mInternal->resetFrustumExtents(); }
  57. /** @copydoc Camera::getFrustumExtents */
  58. virtual void getFrustumExtents(float& outleft, float& outright, float& outtop, float& outbottom) const
  59. {
  60. mInternal->getFrustumExtents(outleft, outright, outtop, outbottom);
  61. }
  62. /** @copydoc Camera::getProjectionMatrixRS */
  63. BS_SCRIPT_EXPORT(n:ProjMatrix,pr:getter)
  64. virtual const Matrix4& getProjectionMatrixRS() const { return mInternal->getProjectionMatrixRS(); }
  65. /** @copydoc Camera::getProjectionMatrix */
  66. virtual const Matrix4& getProjectionMatrix() const { return mInternal->getProjectionMatrix(); }
  67. /** @copydoc Camera::getViewMatrix */
  68. BS_SCRIPT_EXPORT(n:ViewMatrix,pr:getter)
  69. virtual const Matrix4& getViewMatrix() const { updateView(); return mInternal->getViewMatrix(); }
  70. /** @copydoc Camera::setCustomViewMatrix */
  71. virtual void setCustomViewMatrix(bool enable, const Matrix4& viewMatrix = Matrix4::IDENTITY)
  72. {
  73. mInternal->setCustomViewMatrix(enable, viewMatrix);
  74. }
  75. /** @copydoc Camera::isCustomViewMatrixEnabled */
  76. virtual bool isCustomViewMatrixEnabled() const { return mInternal->isCustomViewMatrixEnabled(); }
  77. /** @copydoc Camera::setCustomProjectionMatrix */
  78. virtual void setCustomProjectionMatrix(bool enable, const Matrix4& projectionMatrix = Matrix4::IDENTITY)
  79. {
  80. mInternal->setCustomProjectionMatrix(enable, projectionMatrix);
  81. }
  82. /** @copydoc Camera::isCustomProjectionMatrixEnabled */
  83. virtual bool isCustomProjectionMatrixEnabled() const { return mInternal->isCustomProjectionMatrixEnabled(); }
  84. /** @copydoc Camera::getFrustum */
  85. virtual const ConvexVolume& getFrustum() const { return mInternal->getFrustum(); }
  86. /** @copydoc Camera::getWorldFrustum */
  87. virtual ConvexVolume getWorldFrustum() const;
  88. /** @copydoc Camera::getBoundingBox */
  89. const AABox& getBoundingBox() const { return mInternal->getBoundingBox(); }
  90. /** @copydoc Camera::setProjectionType */
  91. BS_SCRIPT_EXPORT(n:ProjectionType,pr:setter)
  92. virtual void setProjectionType(ProjectionType pt) { mInternal->setProjectionType(pt); }
  93. /** @copydoc Camera::getProjectionType */
  94. BS_SCRIPT_EXPORT(n:ProjectionType,pr:getter)
  95. virtual ProjectionType getProjectionType() const { return mInternal->getProjectionType(); }
  96. /** @copydoc Camera::setOrthoWindow */
  97. virtual void setOrthoWindow(float w, float h) { mInternal->setOrthoWindow(w, h); }
  98. /** @copydoc Camera::setOrthoWindowHeight */
  99. BS_SCRIPT_EXPORT(n:OrthoHeight,pr:setter)
  100. virtual void setOrthoWindowHeight(float h) { mInternal->setOrthoWindowHeight(h); }
  101. /** @copydoc Camera::getOrthoWindowHeight */
  102. BS_SCRIPT_EXPORT(n:OrthoHeight,pr:getter)
  103. virtual float getOrthoWindowHeight() const { return mInternal->getOrthoWindowHeight(); }
  104. /** @copydoc Camera::setOrthoWindowWidth */
  105. BS_SCRIPT_EXPORT(n:OrthoWidth,pr:setter)
  106. virtual void setOrthoWindowWidth(float w) { mInternal->setOrthoWindowWidth(w); }
  107. /** @copydoc Camera::getOrthoWindowWidth */
  108. BS_SCRIPT_EXPORT(n:OrthoWidth,pr:getter)
  109. virtual float getOrthoWindowWidth() const { return mInternal->getOrthoWindowWidth(); }
  110. /** @copydoc Camera::setPriority */
  111. BS_SCRIPT_EXPORT(n:Priority,pr:setter)
  112. void setPriority(INT32 priority) { mInternal->setPriority(priority); }
  113. /** @copydoc Camera::getPriority */
  114. BS_SCRIPT_EXPORT(n:Priority,pr:getter)
  115. INT32 getPriority() const { return mInternal->getPriority(); }
  116. /** @copydoc Camera::setLayers */
  117. BS_SCRIPT_EXPORT(n:Layers,pr:setter)
  118. void setLayers(UINT64 layers) { mInternal->setLayers(layers); }
  119. /** @copydoc Camera::getLayers */
  120. BS_SCRIPT_EXPORT(n:Layers,pr:getter)
  121. UINT64 getLayers() const { return mInternal->getLayers(); }
  122. /** @copydoc Camera::setMSAACount */
  123. BS_SCRIPT_EXPORT(n:SampleCount,pr:setter)
  124. void setMSAACount(UINT32 count) { mInternal->setMSAACount(count); }
  125. /** @copydoc Camera::getMSAACount */
  126. BS_SCRIPT_EXPORT(n:SampleCount,pr:getter)
  127. UINT32 getMSAACount() const { return mInternal->getMSAACount(); }
  128. /** @copydoc Camera::setRenderSettings() */
  129. BS_SCRIPT_EXPORT(n:RenderSettings,pr:setter)
  130. void setRenderSettings(const SPtr<RenderSettings>& settings) { mInternal->setRenderSettings(settings); }
  131. /** @copydoc Camera::getRenderSettings() */
  132. BS_SCRIPT_EXPORT(n:RenderSettings,pr:getter)
  133. const SPtr<RenderSettings>& getRenderSettings() const { return mInternal->getRenderSettings(); }
  134. /** @copydoc Camera::worldToScreenPoint */
  135. BS_SCRIPT_EXPORT()
  136. Vector2I worldToScreenPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToScreenPoint(worldPoint); }
  137. /** @copydoc Camera::worldToNdcPoint */
  138. BS_SCRIPT_EXPORT()
  139. Vector2 worldToNdcPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToNdcPoint(worldPoint); }
  140. /** @copydoc Camera::worldToViewPoint */
  141. BS_SCRIPT_EXPORT()
  142. Vector3 worldToViewPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToViewPoint(worldPoint); }
  143. /** @copydoc Camera::screenToWorldPoint */
  144. BS_SCRIPT_EXPORT()
  145. Vector3 screenToWorldPoint(const Vector2I& screenPoint, float depth = 0.5f) const { updateView(); return mInternal->screenToWorldPoint(screenPoint, depth); }
  146. /** @copydoc Camera::screenToViewPoint */
  147. BS_SCRIPT_EXPORT()
  148. Vector3 screenToViewPoint(const Vector2I& screenPoint, float depth = 0.5f) const { return mInternal->screenToViewPoint(screenPoint, depth); }
  149. /** @copydoc Camera::screenToNdcPoint */
  150. BS_SCRIPT_EXPORT()
  151. Vector2 screenToNdcPoint(const Vector2I& screenPoint) const { return mInternal->screenToNdcPoint(screenPoint); }
  152. /** @copydoc Camera::viewToWorldPoint */
  153. BS_SCRIPT_EXPORT()
  154. Vector3 viewToWorldPoint(const Vector3& viewPoint) const { updateView(); return mInternal->viewToWorldPoint(viewPoint); }
  155. /** @copydoc Camera::viewToScreenPoint */
  156. BS_SCRIPT_EXPORT()
  157. Vector2I viewToScreenPoint(const Vector3& viewPoint) const { return mInternal->viewToScreenPoint(viewPoint); }
  158. /** @copydoc Camera::viewToNdcPoint */
  159. BS_SCRIPT_EXPORT()
  160. Vector2 viewToNdcPoint(const Vector3& viewPoint) const { return mInternal->viewToNdcPoint(viewPoint); }
  161. /** @copydoc Camera::ndcToWorldPoint */
  162. BS_SCRIPT_EXPORT()
  163. Vector3 ndcToWorldPoint(const Vector2& ndcPoint, float depth = 0.5f) const { updateView(); return mInternal->ndcToWorldPoint(ndcPoint, depth); }
  164. /** @copydoc Camera::ndcToViewPoint */
  165. BS_SCRIPT_EXPORT()
  166. Vector3 ndcToViewPoint(const Vector2& ndcPoint, float depth = 0.5f) const { return mInternal->ndcToViewPoint(ndcPoint, depth); }
  167. /** @copydoc Camera::ndcToScreenPoint */
  168. BS_SCRIPT_EXPORT()
  169. Vector2I ndcToScreenPoint(const Vector2& ndcPoint) const { return mInternal->ndcToScreenPoint(ndcPoint); }
  170. /** @copydoc Camera::screenPointToRay */
  171. BS_SCRIPT_EXPORT()
  172. Ray screenPointToRay(const Vector2I& screenPoint) const { updateView(); return mInternal->screenPointToRay(screenPoint); }
  173. /** @copydoc Camera::projectPoint */
  174. BS_SCRIPT_EXPORT()
  175. Vector3 projectPoint(const Vector3& point) const { return mInternal->projectPoint(point); }
  176. /** @copydoc Camera::unprojectPoint */
  177. BS_SCRIPT_EXPORT()
  178. Vector3 unprojectPoint(const Vector3& point) const { return mInternal->unprojectPoint(point); }
  179. /** @copydoc Camera::setMain */
  180. BS_SCRIPT_EXPORT(n:Main,pr:setter)
  181. void setMain(bool main);
  182. /** @copydoc Camera::isMain */
  183. BS_SCRIPT_EXPORT(n:Main,pr:getter)
  184. bool isMain() const { return mInternal->isMain(); }
  185. /** @name Internal
  186. * @{
  187. */
  188. /** Returns the internal camera that is used for majority of operations by this component. */
  189. SPtr<Camera> _getCamera() const { updateView(); return mInternal; }
  190. /** @} */
  191. protected:
  192. /** Checks if the world transform of the camera changed, and if needed updates the view matrix. */
  193. void updateView() const;
  194. mutable SPtr<Camera> mInternal;
  195. // Only valid during construction
  196. SPtr<RenderTarget> mTarget;
  197. float mLeft;
  198. float mTop;
  199. float mWidth;
  200. float mHeight;
  201. /************************************************************************/
  202. /* COMPONENT OVERRIDES */
  203. /************************************************************************/
  204. protected:
  205. friend class SceneObject;
  206. /** @copydoc Component::onInitialized */
  207. void onInitialized() override;
  208. /** @copydoc Component::onDestroyed */
  209. void onDestroyed() override;
  210. public:
  211. /** @copydoc Component::update */
  212. void update() override;
  213. /************************************************************************/
  214. /* RTTI */
  215. /************************************************************************/
  216. public:
  217. friend class CCameraRTTI;
  218. static RTTITypeBase* getRTTIStatic();
  219. RTTITypeBase* getRTTI() const override;
  220. protected:
  221. CCamera();// Serialization only
  222. };
  223. /** @} */
  224. }