From a456a877280b4e6ec962ef2e7693cf17299b1dec Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sat, 31 May 2025 15:19:13 +0200 Subject: [PATCH] Propagate world position system --- src/physics.cpp | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/src/physics.cpp b/src/physics.cpp index 909d0cb..795b100 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -14,23 +14,38 @@ PhysicsModule::PhysicsModule(flecs::world& world) pos.y += vel.y; }); - // world.system("PropagatePosition") - // .kind(flecs::PostUpdate) - // .each( - // [](flecs::entity e, WorldPosition& world_pos, Position const& local_pos) - // { - // if (e.parent() == flecs::entity::null()) - // { - // world_pos.x = local_pos.x; - // world_pos.y = local_pos.y; - // } - // else - // { - // auto parent_world_pos = e.parent().get(); - // world_pos.x = parent_world_pos->x + local_pos.x; - // world_pos.y = parent_world_pos->y + local_pos.y; - // } - // }); + // Introduce phase that runs after OnUpdate but before OnValidate + flecs::entity propagate_phase = world.entity().add(flecs::Phase).depends_on(flecs::OnUpdate); + + world.system("PropagatePosition") + .kind(propagate_phase) + .each( + [](flecs::entity e, WorldPosition& world_pos, Position const& local_pos) + { + if (e.parent() != flecs::entity::null() && e.parent().has()) + return; + + world_pos.x = local_pos.x; + world_pos.y = local_pos.y; + + std::function propagate_to_children; + propagate_to_children = [&](flecs::entity parent, WorldPosition const& parent_pos) + { + parent.children( + [=](flecs::entity child) + { + auto local_pos = child.get(); + auto world_pos = child.get_mut(); + + world_pos->x = parent_pos.x + local_pos->x; + world_pos->y = parent_pos.y + local_pos->y; + + propagate_to_children(child, *world_pos); + }); + }; + + propagate_to_children(e, world_pos); + }); world.system("DrawBoxes") .term_at(0)