From: Axy Date: Fri, 25 Sep 2026 18:28:30 +0000 (+0200) Subject: Hierarchy fixed fully yey X-Git-Url: https://git.uwuaxy.net/?a=commitdiff_plain;h=b83fb9c07f8f0e8862eef0f41c6b138bc530c018;p=axy%2Fft%2Fpacman.git Hierarchy fixed fully yey --- diff --git a/src/pacman/ecs/__init__.py b/src/pacman/ecs/__init__.py index c9e9bce..6c1310d 100644 --- a/src/pacman/ecs/__init__.py +++ b/src/pacman/ecs/__init__.py @@ -7,6 +7,7 @@ from pygame import Vector3 from pacman.ecs.hierarchy import ( ChildOf, + Hierarchy, hierachy_plugins, ) from pacman.ecs.schedule import ( @@ -70,12 +71,11 @@ def update_coord(entities: Query[tuple[CoordAbs2D, Coord2D]]) -> None: abs_coord._vec = coord.xyz -def update_coord_hierarchy() -> None: - return - for parent, child in traverse_hierarchy(world, tuple[CoordAbs2D]): +def update_coord_hierarchy(hierarchy: Hierarchy[CoordAbs2D]) -> None: + for parent, child in hierarchy.top_down(): if parent is None: continue - child[0]._vec += parent[0]._vec + child._vec += parent._vec PropagateTransform = SystemSet("propagate-transform") diff --git a/src/pacman/ecs/hierarchy.py b/src/pacman/ecs/hierarchy.py index a428a72..c9d98dd 100644 --- a/src/pacman/ecs/hierarchy.py +++ b/src/pacman/ecs/hierarchy.py @@ -94,11 +94,9 @@ def hierachy_plugins(world: World) -> None: type RootsQuery[Items, Filters] = Query[ - tuple[Items, Children], tuple[Filters, Not[ChildOf]] -] -type NodesQuery[Items, Filters] = Query[ - tuple[Items, Children | None, ChildOf], Filters + Entity, tuple[Filters, Not[ChildOf], Children, Items] ] +type NodesQuery[Items, Filters] = Query[tuple[Items, Children | None], Filters] class Hierarchy[Items, Filters = tuple[()]](FromWorld): @@ -131,3 +129,18 @@ class Hierarchy[Items, Filters = tuple[()]](FromWorld): def cleanup(self) -> None: self._roots.cleanup() self._nodes.cleanup() + + def top_down(self) -> Generator[tuple[Items | None, Items]]: + queue: list[tuple[Items | None, Entity]] = [ + (None, e) for e in self._roots + ] + while len(queue) != 0: + parent, nxt = queue.pop() + node = self._nodes.get(nxt) + if node is None: + continue + child, children = node + yield (parent, child) + if children is None: + continue + queue.extend((child, e) for e in children.children)