from pacman.ecs.hierarchy import (
ChildOf,
+ Hierarchy,
hierachy_plugins,
)
from pacman.ecs.schedule import (
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")
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):
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)