BsCCamera.h 11 KB

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