]> git.tdb.fi Git - libs/game.git/blob - source/game/stage.cpp
Provide a way to request events for existing entities and components
[libs/game.git] / source / game / stage.cpp
1 #include "stage.h"
2 #include "camera.h"
3 #include "root.h"
4 #include "system.h"
5
6 using namespace std;
7
8 namespace Msp::Game {
9
10 Stage::Stage(DataFile::Collection &r):
11         resources(r),
12         event_source(event_bus),
13         event_observer(event_bus),
14         root(std::make_unique<Root>(*this))
15 {
16         event_observer.observe<Events::ComponentCreated>([this](auto &e){
17                 if(!active_camera)
18                         if(Handle<Camera> camera = dynamic_handle_cast<Camera>(e.component))
19                                 set_active_camera(camera);
20         });
21 }
22
23 // Hide unique_ptr destructors from the header
24 Stage::~Stage()
25 { }
26
27 void Stage::remove_system(System &s)
28 {
29         erase_if(systems, [&s](auto &p){ return p.get()==&s; });
30 }
31
32 void Stage::set_active_camera(Handle<Camera> c)
33 {
34         active_camera = c;
35         event_source.emit<Events::CameraChanged>(active_camera);
36 }
37
38 void Stage::synthesize_initial_events(EventObserver &target_observer)
39 {
40         synthesize_initial_events(Handle<Entity>::from_object(root.get()), target_observer);
41         if(active_camera)
42                 event_source.emit_to<Events::CameraChanged>(target_observer, active_camera);
43 }
44
45 void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &target_observer)
46 {
47         for(Handle<Component> c: entity->get_components())
48                 event_source.emit_to<Events::ComponentCreated>(target_observer, c);
49         for(Handle<Entity> e: entity->get_children())
50                 synthesize_initial_events(e, target_observer);
51         event_source.emit_to<Events::EntityCreated>(target_observer, entity);
52 }
53
54 void Stage::tick(Time::TimeDelta dt)
55 {
56         for(const auto &s: systems)
57                 s->tick(dt);
58         for(const auto &s: systems)
59                 s->deferred_tick();
60 }
61
62 } // namespace Msp::Game