BsCoreSceneManager.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsModule.h"
  4. #include "BsGameObject.h"
  5. namespace BansheeEngine
  6. {
  7. /**
  8. * @brief Manages all objects in the scene and provides various query methods
  9. * for finding objects. This is just the base class with basic query
  10. * functionality. You should override it with your own version.
  11. */
  12. class BS_CORE_EXPORT CoreSceneManager : public Module<CoreSceneManager>
  13. {
  14. public:
  15. CoreSceneManager();
  16. virtual ~CoreSceneManager();
  17. /**
  18. * @brief Returns the root scene object.
  19. */
  20. HSceneObject getRootNode() const { return mRootNode; }
  21. /**
  22. * @brief Destroys all scene objects in the scene.
  23. *
  24. * @param forceAll If true, then even the persistent objects will be unloaded.
  25. */
  26. void clearScene(bool forceAll = false);
  27. /**
  28. * @brief Changes the root scene object.
  29. *
  30. * @note Internal method.
  31. */
  32. void _setRootNode(const HSceneObject& root);
  33. /**
  34. * @brief Called every frame. Calls update methods on all
  35. * scene objects and their components.
  36. *
  37. * @note Internal method.
  38. */
  39. virtual void _update();
  40. /**
  41. * @brief Updates dirty transforms on any core objects that may be tied with
  42. * scene objects.
  43. */
  44. virtual void _updateCoreObjectTransforms() { }
  45. protected:
  46. friend class SceneObject;
  47. /**
  48. * @brief Register a new node in the scene manager, on the top-most level of the hierarchy.
  49. *
  50. * @note After you add a node in the scene manager, it takes ownership of its memory and is responsible for releasing it.
  51. * Do NOT add nodes that have already been added (i.e. if you just want to change their parent). Normally this method will only be called by SceneObject.
  52. *
  53. * @param [in] node Node you wish to add. It's your responsibility not to add duplicate or null nodes. This method won't check.
  54. */
  55. void registerNewSO(const HSceneObject& node);
  56. protected:
  57. HSceneObject mRootNode;
  58. };
  59. /**
  60. * @brief Handles creation of a scene manager.
  61. *
  62. * @note Since scene manager implementations may vary it is expected that a concrete implementation
  63. * of a scene manager will register its creation method using "setFactoryMethod" which will then
  64. * later be used for creating the scene manager during application start up.
  65. */
  66. class BS_CORE_EXPORT SceneManagerFactory
  67. {
  68. public:
  69. /**
  70. * @brief Creates a concrete scene manager, depending on the currently set factory method.
  71. */
  72. static void create();
  73. /**
  74. * @brief Sets method that will be used for creating the scene manager when "create" gets called.
  75. */
  76. static void setFactoryMethod(const std::function<void()>& method)
  77. {
  78. mFactoryMethod = method;
  79. }
  80. private:
  81. static std::function<void()> mFactoryMethod;
  82. };
  83. /**
  84. * @brief Provides easy access to the scene manager.
  85. */
  86. BS_CORE_EXPORT CoreSceneManager& gCoreSceneManager();
  87. }