]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/stage.cpp
Add reflection infrastructure
[libs/game.git] / source / game / stage.cpp
index a616d5a94da775ebd61da5171e9b4baf2435215d..5663a71fadf8b36e1db21267724cf3d27e9530c2 100644 (file)
@@ -1,25 +1,70 @@
 #include "stage.h"
+#include "accessguard.h"
+#include "camera.h"
 #include "root.h"
 #include "system.h"
 
+using namespace std;
+
 namespace Msp::Game {
 
-Stage::Stage():
+Stage::Stage(Reflection::Reflector &f, DataFile::Collection &r):
+       reflector(f),
+       resources(r),
+       event_source(event_bus),
+       event_observer(event_bus),
        root(std::make_unique<Root>(*this))
-{ }
+{
+       event_observer.observe<Events::ComponentCreated>([this](auto &e){
+               if(!active_camera)
+                       if(Handle<Camera> camera = dynamic_handle_cast<Camera>(e.component))
+                               set_active_camera(camera);
+       });
+}
 
 // Hide unique_ptr destructors from the header
 Stage::~Stage()
 { }
 
+void Stage::remove_system(System &s)
+{
+       erase_if(systems, [&s](auto &p){ return p.get()==&s; });
+}
+
+void Stage::set_active_camera(Handle<Camera> c)
+{
+       active_camera = c;
+       event_source.emit<Events::CameraChanged>(active_camera);
+}
+
+void Stage::synthesize_initial_events(EventObserver &target_observer)
+{
+       synthesize_initial_events(Handle<Entity>::from_object(root.get()), target_observer);
+       if(active_camera)
+               event_source.emit_to<Events::CameraChanged>(target_observer, active_camera);
+}
+
+void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &target_observer)
+{
+       for(Handle<Component> c: entity->get_components())
+               event_source.emit_to<Events::ComponentCreated>(target_observer, c);
+       for(Handle<Entity> e: entity->get_children())
+               synthesize_initial_events(e, target_observer);
+       event_source.emit_to<Events::EntityCreated>(target_observer, entity);
+}
+
 void Stage::tick(Time::TimeDelta dt)
 {
+       {
+#ifdef DEBUG
+               AccessGuard::BlockForScope _block;;
+#endif
+               for(const auto &s: systems)
+                       s->tick(dt);
+       }
+
        for(const auto &s: systems)
-               s->pre_tick();
-       for(const auto &s: systems)
-               s->tick(dt);
-       for(const auto &s: systems)
-               s->post_tick();
+               s->deferred_tick();
 }
 
 } // namespace Msp::Game