]> git.tdb.fi Git - libs/game.git/blob - source/game/transformpropagator.cpp
Convert components to buffered where appropriate
[libs/game.git] / source / game / transformpropagator.cpp
1 #include "transformpropagator.h"
2 #include "events.h"
3 #include "root.h"
4 #include "stage.h"
5 #include "transform.h"
6
7 using namespace std;
8
9 namespace Msp::Game {
10
11 TransformPropagator::TransformPropagator(Stage &s):
12         System(s),
13         observer(s.get_event_bus())
14 {
15         declare_dependency<Transform>(CHAINED_UPDATE);
16
17         observer.observe<Events::EntityCreated>([this](auto &){ transforms_dirty = true; });
18         observer.observe<Events::EntityDestroyed>([this](auto &){ transforms_dirty = true; });
19 }
20
21 void TransformPropagator::tick(Time::TimeDelta)
22 {
23         if(transforms_dirty)
24                 rebuild_transform_order();
25
26         for(const ParentedTransform &t: transforms)
27                 t.transform->update_world_matrix(t.parent.get());
28 }
29
30 void TransformPropagator::rebuild_transform_order()
31 {
32         transforms.clear();
33         for(Handle<Entity> c: stage.get_root()->get_children())
34                 rebuild_transform_order(c, nullptr);
35 }
36
37 void TransformPropagator::rebuild_transform_order(Handle<Entity> entity, Handle<Transform> parent_trans)
38 {
39         if(Handle<Transform> trans = entity->get_transform())
40         {
41                 transforms.emplace_back(trans, parent_trans);
42                 parent_trans = trans;
43         }
44
45         for(Handle<Entity> c: entity->get_children())
46                 rebuild_transform_order(c, parent_trans);
47 }
48
49 } // namespace Msp::Game