BsCoreSceneManager.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsCoreSceneManager.h"
  4. #include "BsSceneObject.h"
  5. #include "BsComponent.h"
  6. #include "BsGameObjectManager.h"
  7. namespace BansheeEngine
  8. {
  9. std::function<void()> SceneManagerFactory::mFactoryMethod;
  10. CoreSceneManager::CoreSceneManager()
  11. {
  12. mRootNode = SceneObject::createInternal("SceneRoot");
  13. }
  14. CoreSceneManager::~CoreSceneManager()
  15. {
  16. if (mRootNode != nullptr && !mRootNode.isDestroyed())
  17. mRootNode->destroy(true);
  18. }
  19. void CoreSceneManager::clearScene(bool forceAll)
  20. {
  21. UINT32 numChildren = mRootNode->getNumChildren();
  22. UINT32 curIdx = 0;
  23. for (UINT32 i = 0; i < numChildren; i++)
  24. {
  25. HSceneObject child = mRootNode->getChild(curIdx);
  26. if (forceAll || !child->hasFlag(SOF_Persistent))
  27. child->destroy();
  28. else
  29. curIdx++;
  30. }
  31. GameObjectManager::instance().destroyQueuedObjects();
  32. HSceneObject newRoot = SceneObject::createInternal("SceneRoot");
  33. _setRootNode(newRoot);
  34. }
  35. void CoreSceneManager::_setRootNode(const HSceneObject& root)
  36. {
  37. if (root == nullptr)
  38. return;
  39. HSceneObject oldRoot = mRootNode;
  40. UINT32 numChildren = oldRoot->getNumChildren();
  41. // Make sure to keep persistent objects
  42. bs_frame_mark();
  43. {
  44. FrameVector<HSceneObject> toRemove;
  45. for (UINT32 i = 0; i < numChildren; i++)
  46. {
  47. HSceneObject child = oldRoot->getChild(i);
  48. if (child->hasFlag(SOF_Persistent))
  49. toRemove.push_back(child);
  50. }
  51. for (auto& entry : toRemove)
  52. entry->setParent(root, false);
  53. }
  54. bs_frame_clear();
  55. mRootNode = root;
  56. mRootNode->_setParent(HSceneObject());
  57. oldRoot->destroy();
  58. }
  59. void CoreSceneManager::_update()
  60. {
  61. Stack<HSceneObject> todo;
  62. todo.push(mRootNode);
  63. while(!todo.empty())
  64. {
  65. HSceneObject currentGO = todo.top();
  66. todo.pop();
  67. if (!currentGO->getActive(true))
  68. continue;
  69. const Vector<HComponent>& components = currentGO->getComponents();
  70. for(auto iter = components.begin(); iter != components.end(); ++iter)
  71. {
  72. (*iter)->update();
  73. }
  74. for(UINT32 i = 0; i < currentGO->getNumChildren(); i++)
  75. todo.push(currentGO->getChild(i));
  76. }
  77. GameObjectManager::instance().destroyQueuedObjects();
  78. }
  79. void CoreSceneManager::registerNewSO(const HSceneObject& node)
  80. {
  81. if(mRootNode)
  82. node->setParent(mRootNode);
  83. }
  84. CoreSceneManager& gCoreSceneManager()
  85. {
  86. return CoreSceneManager::instance();
  87. }
  88. void SceneManagerFactory::create()
  89. {
  90. if (mFactoryMethod != nullptr)
  91. mFactoryMethod();
  92. else
  93. BS_EXCEPT(InvalidStateException, "Failed to initialize scene manager because no valid factory method is set.");
  94. }
  95. }