]> git.tdb.fi Git - libs/game.git/commitdiff
Convert TransformPropagator to a Transactor
authorMikko Rasa <tdb@tdb.fi>
Sat, 22 Mar 2025 10:28:16 +0000 (12:28 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 22 Mar 2025 10:28:16 +0000 (12:28 +0200)
The propagation is now done automatically after any system modifies
transforms.

source/game/director.cpp
source/game/physicssystem.cpp
source/game/transform.h
source/game/transformpropagator.cpp
source/game/transformpropagator.h

index d2e02065f42fe15331a911625ca92d594a811360..374f91e5a688d39cfcd313b0dd4d093b4d77c286 100644 (file)
@@ -4,7 +4,7 @@
 #include "component.h"
 #include "entity.h"
 #include "stage.h"
-#include "transformpropagator.h"
+#include "system.h"
 
 using namespace std;
 
@@ -31,7 +31,6 @@ Director::~Director()
 Stage &Director::create_stage(const string &n)
 {
        Stage &stage = *stages.emplace_back(std::make_unique<Stage>(n, thread_pool, reflector, resources));
-       stage.add_system<TransformPropagator>();
        event_source.emit<Events::StageCreated>(stage);
        return stage;
 }
index 4afb09c3c4ef49c7ee832e618057cdaa1f5b9ce0..9d5fc4705a345f7892ab6f83921e2057b30d9d39 100644 (file)
@@ -18,7 +18,6 @@ PhysicsSystem::PhysicsSystem(Stage &s):
 {
        declare_dependency<Transform>(CHAINED_UPDATE);
        declare_dependency<Motion>(CHAINED_UPDATE);
-       declare_dependency<TransformPropagator>(RUN_BEFORE);
 
        monitor.set_changed_callback([this](auto &b){ simulated_rigid_body_changed(b); });
 }
index 249e73227be4268df161782b7647212e311f76f2..4dd2fbc5b5648c71353623b503f3492b9b76d699 100644 (file)
@@ -6,6 +6,7 @@
 #include <msp/linal/vector.h>
 #include "component.h"
 #include "mspgame_api.h"
+#include "transformpropagator.h"
 
 namespace Msp::Game {
 
@@ -35,6 +36,8 @@ struct TransformData
 class MSPGAME_API Transform: public BufferedComponent<TransformData>
 {
 public:
+       using Transactor = TransformPropagator;
+
        Transform(Handle<Entity> e): BufferedComponent(e) { }
 
        void set_values(const TransformValues &);
index cadac04eee8133778ad2055c0422bf19d4b71d9c..86da2d149c83dfdddbed117fd1ee5fc59a57ea9b 100644 (file)
@@ -9,22 +9,25 @@ using namespace std;
 namespace Msp::Game {
 
 TransformPropagator::TransformPropagator(Stage &s):
-       System(s),
+       BasicTransactor(s),
        observer(s.get_event_bus())
 {
-       declare_dependency<Transform>(CHAINED_UPDATE);
-
        observer.observe<Events::EntityCreated>([this](auto &){ transforms_dirty = true; });
        observer.observe<Events::EntityDestroyed>([this](auto &){ transforms_dirty = true; });
 }
 
-void TransformPropagator::tick(Time::TimeDelta)
+void TransformPropagator::commit(Mode mode)
 {
-       if(transforms_dirty)
-               rebuild_transform_order();
+       if(mode&WRITE)
+       {
+               if(transforms_dirty)
+                       rebuild_transform_order();
+
+               for(const ParentedTransform &t: transforms)
+                       t.transform->update_world_matrix(t.parent.get());
+       }
 
-       for(const ParentedTransform &t: transforms)
-               t.transform->update_world_matrix(t.parent.get());
+       BasicTransactor::commit(mode);
 }
 
 void TransformPropagator::rebuild_transform_order()
index defaed1a5e760306139160a279ef569a6b5a3c55..daa7c2b14e02707d1c472bebd2e5849eab9d0feb 100644 (file)
@@ -4,14 +4,14 @@
 #include "eventobserver.h"
 #include "handle.h"
 #include "mspgame_api.h"
-#include "system.h"
+#include "transactor.h"
 
 namespace Msp::Game {
 
 class Entity;
 class Transform;
 
-class MSPGAME_API TransformPropagator: public System
+class MSPGAME_API TransformPropagator: public BasicTransactor<Transform>
 {
 private:
        struct ParentedTransform
@@ -27,7 +27,7 @@ private:
 public:
        TransformPropagator(Stage &);
 
-       void tick(Time::TimeDelta) override;
+       void commit(Mode) override;
 
 private:
        void rebuild_transform_order();