2 #include <msp/debug/demangle.h>
3 #include <msp/strings/format.h>
4 #include "accessguard.h"
13 Stage::Stage(Reflection::Reflector &f, DataFile::Collection &r):
16 event_source(event_bus),
17 event_observer(event_bus),
18 root(std::make_unique<Root>(*this))
20 event_observer.observe<Events::ComponentCreated>([this](auto &e){
22 if(Handle<Camera> camera = dynamic_handle_cast<Camera>(e.component))
23 set_active_camera(camera);
27 // Hide unique_ptr destructors from the header
31 void Stage::remove_system(System &s)
33 erase_if(systems, [&s](auto &p){ return p.get()==&s; });
36 void Stage::set_active_camera(Handle<Camera> c)
39 event_source.emit<Events::CameraChanged>(active_camera);
42 void Stage::synthesize_initial_events(EventObserver &target_observer)
44 synthesize_initial_events(Handle<Entity>::from_object(root.get()), target_observer);
46 event_source.emit_to<Events::CameraChanged>(target_observer, active_camera);
49 void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &target_observer)
51 for(Handle<Component> c: entity->get_components())
52 event_source.emit_to<Events::ComponentCreated>(target_observer, c);
53 for(Handle<Entity> e: entity->get_children())
54 synthesize_initial_events(e, target_observer);
55 event_source.emit_to<Events::EntityCreated>(target_observer, entity);
58 void Stage::tick(Time::TimeDelta dt)
62 AccessGuard::BlockForScope _block;
64 for(const auto &s: systems)
66 System::Activator act(*s);
71 catch(const invalid_access &exc)
73 throw invalid_access(format("%s by %s", exc.what(), Debug::demangle(typeid(*s).name())));
78 for(const auto &s: systems)
82 } // namespace Msp::Game