BsCoreSceneManager.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. }
  33. void CoreSceneManager::_setRootNode(const HSceneObject& root)
  34. {
  35. if (root == nullptr)
  36. return;
  37. HSceneObject oldRoot = mRootNode;
  38. UINT32 numChildren = oldRoot->getNumChildren();
  39. // Make sure to keep persistent objects
  40. bs_frame_mark();
  41. {
  42. FrameVector<HSceneObject> toRemove;
  43. for (UINT32 i = 0; i < numChildren; i++)
  44. {
  45. HSceneObject child = oldRoot->getChild(i);
  46. if (child->hasFlag(SOF_Persistent))
  47. toRemove.push_back(child);
  48. }
  49. for (auto& entry : toRemove)
  50. entry->setParent(root, false);
  51. }
  52. bs_frame_clear();
  53. mRootNode = root;
  54. mRootNode->_setParent(HSceneObject());
  55. oldRoot->destroy();
  56. }
  57. void CoreSceneManager::_update()
  58. {
  59. Stack<HSceneObject> todo;
  60. todo.push(mRootNode);
  61. while(!todo.empty())
  62. {
  63. HSceneObject currentGO = todo.top();
  64. todo.pop();
  65. if (!currentGO->getActive(true))
  66. continue;
  67. const Vector<HComponent>& components = currentGO->getComponents();
  68. for(auto iter = components.begin(); iter != components.end(); ++iter)
  69. {
  70. (*iter)->update();
  71. }
  72. for(UINT32 i = 0; i < currentGO->getNumChildren(); i++)
  73. todo.push(currentGO->getChild(i));
  74. }
  75. GameObjectManager::instance().destroyQueuedObjects();
  76. }
  77. void CoreSceneManager::registerNewSO(const HSceneObject& node)
  78. {
  79. if(mRootNode)
  80. node->setParent(mRootNode);
  81. }
  82. CoreSceneManager& gCoreSceneManager()
  83. {
  84. return CoreSceneManager::instance();
  85. }
  86. void SceneManagerFactory::create()
  87. {
  88. if (mFactoryMethod != nullptr)
  89. mFactoryMethod();
  90. else
  91. BS_EXCEPT(InvalidStateException, "Failed to initialize scene manager because no valid factory method is set.");
  92. }
  93. }