2 #include "accessguard.h"
11 Stage::Stage(Reflection::Reflector &f, DataFile::Collection &r):
14 event_source(event_bus),
15 event_observer(event_bus),
16 root(std::make_unique<Root>(*this))
18 event_observer.observe<Events::ComponentCreated>([this](auto &e){
20 if(Handle<Camera> camera = dynamic_handle_cast<Camera>(e.component))
21 set_active_camera(camera);
25 // Hide unique_ptr destructors from the header
29 void Stage::remove_system(System &s)
31 erase_if(systems, [&s](auto &p){ return p.get()==&s; });
34 void Stage::set_active_camera(Handle<Camera> c)
37 event_source.emit<Events::CameraChanged>(active_camera);
40 void Stage::synthesize_initial_events(EventObserver &target_observer)
42 synthesize_initial_events(Handle<Entity>::from_object(root.get()), target_observer);
44 event_source.emit_to<Events::CameraChanged>(target_observer, active_camera);
47 void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &target_observer)
49 for(Handle<Component> c: entity->get_components())
50 event_source.emit_to<Events::ComponentCreated>(target_observer, c);
51 for(Handle<Entity> e: entity->get_children())
52 synthesize_initial_events(e, target_observer);
53 event_source.emit_to<Events::EntityCreated>(target_observer, entity);
56 void Stage::tick(Time::TimeDelta dt)
60 AccessGuard::BlockForScope _block;;
62 for(const auto &s: systems)
66 for(const auto &s: systems)
70 } // namespace Msp::Game