]> git.tdb.fi Git - libs/game.git/blob - source/game/stage.cpp
Add reflection infrastructure
[libs/game.git] / source / game / stage.cpp
1 #include "stage.h"
2 #include "accessguard.h"
3 #include "camera.h"
4 #include "root.h"
5 #include "system.h"
6
7 using namespace std;
8
9 namespace Msp::Game {
10
11 Stage::Stage(Reflection::Reflector &f, DataFile::Collection &r):
12         reflector(f),
13         resources(r),
14         event_source(event_bus),
15         event_observer(event_bus),
16         root(std::make_unique<Root>(*this))
17 {
18         event_observer.observe<Events::ComponentCreated>([this](auto &e){
19                 if(!active_camera)
20                         if(Handle<Camera> camera = dynamic_handle_cast<Camera>(e.component))
21                                 set_active_camera(camera);
22         });
23 }
24
25 // Hide unique_ptr destructors from the header
26 Stage::~Stage()
27 { }
28
29 void Stage::remove_system(System &s)
30 {
31         erase_if(systems, [&s](auto &p){ return p.get()==&s; });
32 }
33
34 void Stage::set_active_camera(Handle<Camera> c)
35 {
36         active_camera = c;
37         event_source.emit<Events::CameraChanged>(active_camera);
38 }
39
40 void Stage::synthesize_initial_events(EventObserver &target_observer)
41 {
42         synthesize_initial_events(Handle<Entity>::from_object(root.get()), target_observer);
43         if(active_camera)
44                 event_source.emit_to<Events::CameraChanged>(target_observer, active_camera);
45 }
46
47 void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &target_observer)
48 {
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);
54 }
55
56 void Stage::tick(Time::TimeDelta dt)
57 {
58         {
59 #ifdef DEBUG
60                 AccessGuard::BlockForScope _block;;
61 #endif
62                 for(const auto &s: systems)
63                         s->tick(dt);
64         }
65
66         for(const auto &s: systems)
67                 s->deferred_tick();
68 }
69
70 } // namespace Msp::Game