]> Untitled Git - axy/ft/pacman.git/commitdiff
Hierarchy fixed fully yey
authorAxy <gilliardmarthey.axel@gmail.com>
Fri, 25 Sep 2026 18:28:30 +0000 (20:28 +0200)
committerAxy <gilliardmarthey.axel@gmail.com>
Fri, 25 Sep 2026 18:28:30 +0000 (20:28 +0200)
src/pacman/ecs/__init__.py
src/pacman/ecs/hierarchy.py

index c9e9bce5791daa4aa574d1e9936ae31314325962..6c1310da76161a395f09ddaeb278e227d3b99c00 100644 (file)
@@ -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")
index a428a723036c91b7d28a924bfa0134fcd7632e31..c9d98ddc22caed953ebbb5bd8cd53e2c972529f9 100644 (file)
@@ -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)