#include "component.h"
#include "entity.h"
#include "stage.h"
-#include "transformpropagator.h"
+#include "system.h"
using namespace std;
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;
}
{
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); });
}
#include <msp/linal/vector.h>
#include "component.h"
#include "mspgame_api.h"
+#include "transformpropagator.h"
namespace Msp::Game {
class MSPGAME_API Transform: public BufferedComponent<TransformData>
{
public:
+ using Transactor = TransformPropagator;
+
Transform(Handle<Entity> e): BufferedComponent(e) { }
void set_values(const TransformValues &);
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()
#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
public:
TransformPropagator(Stage &);
- void tick(Time::TimeDelta) override;
+ void commit(Mode) override;
private:
void rebuild_transform_order();