]> git.tdb.fi Git - libs/game.git/blob - source/game/transformpropagator.cpp
Use template lambdas to avoid repetition of types
[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         observer.observe<Events::EntityCreated>([this](auto &){ transforms_dirty = true; });
16         observer.observe<Events::EntityDestroyed>([this](auto &){ transforms_dirty = true; });
17 }
18
19 void TransformPropagator::tick(Time::TimeDelta)
20 {
21         if(transforms_dirty)
22                 rebuild_transform_order();
23
24         for(const ParentedTransform &t: transforms)
25                 t.transform->update_world_matrix(t.parent.get());
26 }
27
28 void TransformPropagator::rebuild_transform_order()
29 {
30         transforms.clear();
31         for(Handle<Entity> c: stage.get_root()->get_children())
32                 rebuild_transform_order(c, nullptr);
33 }
34
35 void TransformPropagator::rebuild_transform_order(Handle<Entity> entity, Handle<Transform> parent_trans)
36 {
37         if(Handle<Transform> trans = entity->get_transform())
38         {
39                 transforms.emplace_back(trans, parent_trans);
40                 parent_trans = trans;
41         }
42
43         for(Handle<Entity> c: entity->get_children())
44                 rebuild_transform_order(c, parent_trans);
45 }
46
47 } // namespace Msp::Game