X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Fstage.cpp;h=3888410a43c8bc976034b753693b56ab35f16d72;hb=e4f03880d49bdbe0c7269be0f40f23b197bcea77;hp=bdd0ed676d27200fe87c9ee89e4231874b643f69;hpb=48051ee2bab13f65e48c371e453b9ea65920921e;p=libs%2Fgame.git diff --git a/source/game/stage.cpp b/source/game/stage.cpp index bdd0ed6..3888410 100644 --- a/source/game/stage.cpp +++ b/source/game/stage.cpp @@ -1,4 +1,6 @@ #include "stage.h" +#include +#include #include "accessguard.h" #include "camera.h" #include "root.h" @@ -8,11 +10,13 @@ using namespace std; namespace Msp::Game { -Stage::Stage(DataFile::Collection &r): +Stage::Stage(Reflection::Reflector &f, DataFile::Collection &r): + reflector(f), resources(r), event_source(event_bus), event_observer(event_bus), - root(std::make_unique(*this)) + root(std::make_unique(*this)), + scheduler(reflector) { event_observer.observe([this](auto &e){ if(!active_camera) @@ -27,7 +31,9 @@ Stage::~Stage() void Stage::remove_system(System &s) { + scheduler.remove_system(s); erase_if(systems, [&s](auto &p){ return p.get()==&s; }); + pending_reschedule = true; } void Stage::set_active_camera(Handle c) @@ -54,12 +60,29 @@ void Stage::synthesize_initial_events(Handle entity, EventObserver &targ void Stage::tick(Time::TimeDelta dt) { + if(pending_reschedule) + { + scheduler.schedule(); + pending_reschedule = false; + } + { #ifdef DEBUG - AccessGuard::BlockForScope _block;; + AccessGuard::BlockForScope _block; #endif - for(const auto &s: systems) - s->tick(dt); + for(const SystemScheduler::Group &g: scheduler.get_groups()) + for(System *s: g.systems) + { + System::Activator act(*s); + try + { + s->tick(dt); + } + catch(const invalid_access &exc) + { + throw invalid_access(format("%s by %s", exc.what(), Debug::demangle(typeid(*s).name()))); + } + } } for(const auto &s: systems)