]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/stage.h
Schedule systems based on their declared dependencies
[libs/game.git] / source / game / stage.h
index 283dc81c0747776875cfed9d0048aa720b1bfbba..0c2219bdc18b1d893851ed91467677c5a35fc4b1 100644 (file)
@@ -9,6 +9,7 @@
 #include "eventsource.h"
 #include "handle.h"
 #include "reflection.h"
+#include "systemscheduler.h"
 
 namespace Msp::Game {
 
@@ -33,7 +34,9 @@ private:
        to put it in a pool. */
        std::unique_ptr<Root> root;
        std::vector<std::unique_ptr<System>> systems;
+       SystemScheduler scheduler;
        Handle<Camera> active_camera;
+       bool pending_reschedule = false;
 
 public:
        Stage(Reflection::Reflector &, DataFile::Collection &);
@@ -78,8 +81,13 @@ inline void Stage::iterate_objects(const F &func)
 template<typename T, typename... Args>
 inline T &Stage::add_system(Args &&... args)
 {
-       systems.emplace_back(std::make_unique<T>(*this, std::forward<Args>(args)...));
-       return static_cast<T &>(*systems.back());
+       // Ensure that a reflected class exists for scheduling
+       reflector.get_or_create_class<T>();
+
+       auto &sys = systems.emplace_back(std::make_unique<T>(*this, std::forward<Args>(args)...));
+       scheduler.add_system(*sys);
+       pending_reschedule = true;
+       return static_cast<T &>(*sys);
 }
 
 template<typename T>