From 8b27ceab695cc1eb6965c1e7fe23b931eae44a01 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 22 Mar 2025 12:28:16 +0200 Subject: [PATCH] Convert TransformPropagator to a Transactor The propagation is now done automatically after any system modifies transforms. --- source/game/director.cpp | 3 +-- source/game/physicssystem.cpp | 1 - source/game/transform.h | 3 +++ source/game/transformpropagator.cpp | 19 +++++++++++-------- source/game/transformpropagator.h | 6 +++--- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/source/game/director.cpp b/source/game/director.cpp index d2e0206..374f91e 100644 --- a/source/game/director.cpp +++ b/source/game/director.cpp @@ -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(n, thread_pool, reflector, resources)); - stage.add_system(); event_source.emit(stage); return stage; } diff --git a/source/game/physicssystem.cpp b/source/game/physicssystem.cpp index 4afb09c..9d5fc47 100644 --- a/source/game/physicssystem.cpp +++ b/source/game/physicssystem.cpp @@ -18,7 +18,6 @@ PhysicsSystem::PhysicsSystem(Stage &s): { declare_dependency(CHAINED_UPDATE); declare_dependency(CHAINED_UPDATE); - declare_dependency(RUN_BEFORE); monitor.set_changed_callback([this](auto &b){ simulated_rigid_body_changed(b); }); } diff --git a/source/game/transform.h b/source/game/transform.h index 249e732..4dd2fbc 100644 --- a/source/game/transform.h +++ b/source/game/transform.h @@ -6,6 +6,7 @@ #include #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 { public: + using Transactor = TransformPropagator; + Transform(Handle e): BufferedComponent(e) { } void set_values(const TransformValues &); diff --git a/source/game/transformpropagator.cpp b/source/game/transformpropagator.cpp index cadac04..86da2d1 100644 --- a/source/game/transformpropagator.cpp +++ b/source/game/transformpropagator.cpp @@ -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(CHAINED_UPDATE); - observer.observe([this](auto &){ transforms_dirty = true; }); observer.observe([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() diff --git a/source/game/transformpropagator.h b/source/game/transformpropagator.h index defaed1..daa7c2b 100644 --- a/source/game/transformpropagator.h +++ b/source/game/transformpropagator.h @@ -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 { 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(); -- 2.45.2