EngineState.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "AudioSystem.h"
  2. #include "Engine.h"
  3. #include "EngineState.h"
  4. #include "GUISystem.h"
  5. #include "PhysicsSystem.h"
  6. #include "RendererSystem.h"
  7. #include "ScriptSystem.h"
  8. #include "WorldSystem.h"
  9. EngineState::EngineState(Engine &p_engine, EngineStateType p_engineState) : m_engine(p_engine), m_engineStateType(p_engineState), m_initialized(false)
  10. {
  11. m_sceneChangeController = nullptr;
  12. m_objectChangeController = nullptr;
  13. m_scheduler = nullptr;
  14. m_changeCtrlScene = nullptr;
  15. }
  16. EngineState::~EngineState()
  17. {
  18. shutdown();
  19. //delete m_sceneChangeController;
  20. //delete m_objectChangeController;
  21. }
  22. ErrorCode EngineState::init(TaskManager *p_taskManager)
  23. {
  24. ErrorCode returnError = ErrorCode::Success;
  25. // Clear the engine state first, if it has already been initialized
  26. if(m_initialized)
  27. shutdown();
  28. // Create change controllers
  29. m_sceneChangeController = new ChangeController();
  30. m_objectChangeController = new ChangeController();
  31. // Get all engine systems
  32. auto systems = m_engine.getSystems();
  33. // Create new scene change controller
  34. m_changeCtrlScene = new UniversalScene(m_sceneChangeController, m_objectChangeController);
  35. // Create new scheduler for updating (executing) scenes
  36. m_scheduler = new TaskScheduler(p_taskManager);
  37. // Use the created scene change controller in our scene loader
  38. m_sceneLoader.registerChangeController(m_changeCtrlScene);
  39. // Create new scenes from each system to be used by this play state
  40. // Register systems with change controller and scenes with scene loader
  41. for(int i = 0; i < Systems::NumberOfSystems; i++)
  42. {
  43. // Create new system scene
  44. auto newScene = systems[i]->createScene(&m_sceneLoader, m_engineStateType);
  45. m_sceneLoader.registerSystemScene(newScene);
  46. auto extendError = m_changeCtrlScene->extend(newScene);
  47. if(extendError != ErrorCode::Success)
  48. returnError = extendError;
  49. }
  50. if(returnError == ErrorCode::Success)
  51. {
  52. // Register change control scene with the scheduler
  53. m_scheduler->setScene(m_changeCtrlScene);
  54. // Register task manager with object and scene change controllers
  55. returnError = m_objectChangeController->setTaskManager(p_taskManager);
  56. if(returnError == ErrorCode::Success)
  57. {
  58. returnError = m_sceneChangeController->setTaskManager(p_taskManager);
  59. m_initialized = true;
  60. }
  61. }
  62. return returnError;
  63. }
  64. void EngineState::activate()
  65. {
  66. m_scheduler->execute<>(std::function<void(SystemTask *)>(&SystemTask::activate));
  67. m_objectChangeController->distributeChanges();
  68. m_sceneChangeController->distributeChanges();
  69. }
  70. void EngineState::deactivate()
  71. {
  72. m_scheduler->execute<>(std::function<void(SystemTask *)>(&SystemTask::deactivate));
  73. m_objectChangeController->distributeChanges();
  74. m_sceneChangeController->distributeChanges();
  75. }
  76. void EngineState::shutdown()
  77. {
  78. if(m_initialized)
  79. {
  80. //m_objectChangeController->resetTaskManager();
  81. //m_sceneChangeController->resetTaskManager();
  82. if(m_scheduler != nullptr)
  83. delete m_scheduler;
  84. if(m_changeCtrlScene != nullptr)
  85. delete m_changeCtrlScene;
  86. if(m_sceneChangeController != nullptr)
  87. delete m_sceneChangeController;
  88. if(m_objectChangeController != nullptr)
  89. delete m_objectChangeController;
  90. // Get all engine systems
  91. auto systems = m_engine.getSystems();
  92. // Delete all system scenes that belong to this engine state
  93. for(int i = 0; i < Systems::NumberOfSystems; i++)
  94. {
  95. systems[i]->deleteScene(m_engineStateType);
  96. }
  97. m_initialized = false;
  98. }
  99. }