X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Fstage.h;h=03a8adebc2531e605e5e7e3a58f8ca1dfb573c36;hb=12c863fc1bc5456a4b3aceacc88904d76bd1d8bb;hp=a046947f57ad7d0f49e43621f003ac739a4d5713;hpb=fce6e7846814e54de9d38000d2f5e2295ee2119e;p=libs%2Fgame.git diff --git a/source/game/stage.h b/source/game/stage.h index a046947..03a8ade 100644 --- a/source/game/stage.h +++ b/source/game/stage.h @@ -8,6 +8,9 @@ #include "events.h" #include "eventsource.h" #include "handle.h" +#include "mspgame_api.h" +#include "reflection.h" +#include "systemscheduler.h" namespace Msp::Game { @@ -15,13 +18,14 @@ class Camera; class Root; class System; -class Stage +class MSPGAME_API Stage { public: using EventSource = Game::EventSource; private: + Reflection::Reflector &reflector; DataFile::Collection &resources; PoolPool pools; EventBus event_bus; @@ -31,12 +35,15 @@ private: to put it in a pool. */ std::unique_ptr root; std::vector> systems; + SystemScheduler scheduler; Handle active_camera; + bool pending_reschedule = false; public: - Stage(DataFile::Collection &); + Stage(Reflection::Reflector &, DataFile::Collection &); ~Stage(); + Reflection::Reflector &get_reflector() const { return reflector; } DataFile::Collection &get_resources() const { return resources; } PoolPool &get_pools() { return pools; } EventBus &get_event_bus() { return event_bus; } @@ -75,8 +82,13 @@ inline void Stage::iterate_objects(const F &func) template inline T &Stage::add_system(Args &&... args) { - systems.emplace_back(std::make_unique(*this, std::forward(args)...)); - return static_cast(*systems.back()); + // Ensure that a reflected class exists for scheduling + reflector.get_or_create_class(); + + auto &sys = systems.emplace_back(std::make_unique(*this, std::forward(args)...)); + scheduler.add_system(*sys); + pending_reschedule = true; + return static_cast(*sys); } template