BsSceneManager.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsPrerequisites.h"
  5. #include "BsCoreSceneManager.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup Renderer-Engine-Internal
  9. * @{
  10. */
  11. /** Contains information about a camera managed by the scene manager. */
  12. struct SceneCameraData
  13. {
  14. SceneCameraData() { }
  15. SceneCameraData(const SPtr<Camera>& camera, const HSceneObject& sceneObject)
  16. :camera(camera), sceneObject(sceneObject)
  17. { }
  18. SPtr<Camera> camera;
  19. HSceneObject sceneObject;
  20. };
  21. /** Contains information about a renderable managed by the scene manager. */
  22. struct SceneRenderableData
  23. {
  24. SceneRenderableData() { }
  25. SceneRenderableData(const SPtr<Renderable>& renderable, const HSceneObject& sceneObject)
  26. :renderable(renderable), sceneObject(sceneObject)
  27. { }
  28. SPtr<Renderable> renderable;
  29. HSceneObject sceneObject;
  30. };
  31. /** Contains information about a light managed by the scene manager. */
  32. struct SceneLightData
  33. {
  34. SceneLightData() { }
  35. SceneLightData(const SPtr<Light>& light, const HSceneObject& sceneObject)
  36. :light(light), sceneObject(sceneObject)
  37. { }
  38. SPtr<Light> light;
  39. HSceneObject sceneObject;
  40. };
  41. /** Manages active SceneObjects and provides ways for querying and updating them or their components. */
  42. class BS_EXPORT SceneManager : public CoreSceneManager
  43. {
  44. public:
  45. struct InitOnStart
  46. {
  47. public:
  48. InitOnStart()
  49. {
  50. SceneManagerFactory::setFactoryMethod(&startUp);
  51. }
  52. static void startUp()
  53. {
  54. CoreSceneManager::startUp<SceneManager>();
  55. }
  56. };
  57. SceneManager() { }
  58. virtual ~SceneManager() {}
  59. /** Returns all cameras in the scene. */
  60. const Map<Camera*, SceneCameraData>& getAllCameras() const { return mCameras; }
  61. /** Returns all renderables in the scene. */
  62. const Map<Renderable*, SceneRenderableData>& getAllRenderables() const { return mRenderables; }
  63. /**
  64. * Returns the camera in the scene marked as main. Main camera controls the final render surface that is displayed
  65. * to the user. If there are multiple main cameras, the first one found returned.
  66. */
  67. SceneCameraData getMainCamera() const;
  68. /**
  69. * Sets the render target that the main camera in the scene (if any) will render its view to. This generally means
  70. * the main game window when running standalone, or the Game viewport when running in editor.
  71. */
  72. void setMainRenderTarget(const SPtr<RenderTarget>& rt);
  73. /** Notifies the scene manager that a new renderable was created. */
  74. void _registerRenderable(const SPtr<Renderable>& renderable, const HSceneObject& so);
  75. /** Notifies the scene manager that a renderable was removed. */
  76. void _unregisterRenderable(const SPtr<Renderable>& renderable);
  77. /** Notifies the scene manager that a new camera was created. */
  78. void _registerCamera(const SPtr<Camera>& camera, const HSceneObject& so);
  79. /** Notifies the scene manager that a camera was removed. */
  80. void _unregisterCamera(const SPtr<Camera>& camera);
  81. /** Notifies the scene manager that a camera either became the main camera, or has stopped being main camera. */
  82. void _notifyMainCameraStateChanged(const SPtr<Camera>& camera);
  83. /** Notifies the scene manager that a new light was created. */
  84. void _registerLight(const SPtr<Light>& light, const HSceneObject& so);
  85. /** Notifies the scene manager that a light was removed. */
  86. void _unregisterLight(const SPtr<Light>& light);
  87. /** @copydoc CoreSceneManager::_updateCoreObjectTransforms */
  88. virtual void _updateCoreObjectTransforms() override;
  89. /** @copydoc CoreSceneManager::instance */
  90. static SceneManager& instance();
  91. /** @copydoc CoreSceneManager::instancePtr */
  92. static SceneManager* instancePtr();
  93. private:
  94. /** Callback that is triggered when the main render target size is changed. */
  95. void onMainRenderTargetResized();
  96. Map<Camera*, SceneCameraData> mCameras;
  97. Map<Renderable*, SceneRenderableData> mRenderables;
  98. Map<Light*, SceneLightData> mLights;
  99. Vector<SceneCameraData> mMainCameras;
  100. SPtr<RenderTarget> mMainRT;
  101. HEvent mMainRTResizedConn;
  102. volatile static InitOnStart DoInitOnStart;
  103. };
  104. /** Provides easier access to SceneManager. */
  105. BS_EXPORT SceneManager& gSceneManager();
  106. /** @} */
  107. }