summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-08-13 15:13:39 +0200
committerewy <ewy0@protonmail.com>2026-08-13 15:13:39 +0200
commit60f58e548ef745ec072482954ac37c35d88280d4 (patch)
treeb1d89c0c1e47a427334e7fe708367b1263aaef40 /tree
parentd0fe29558b040a11c5c8a744c37fbd2e3826f6c4 (diff)
switch to single render loop
Diffstat (limited to 'tree')
-rw-r--r--tree/tree.go43
1 files changed, 43 insertions, 0 deletions
diff --git a/tree/tree.go b/tree/tree.go
new file mode 100644
index 0000000..a48dbc0
--- /dev/null
+++ b/tree/tree.go
@@ -0,0 +1,43 @@
+package tree
+
+import (
+ "github.com/Zyko0/go-sdl3/sdl"
+ "ponger/ecs"
+ "ponger/events"
+ "ponger/input"
+ "ponger/render"
+)
+
+func Process(root ecs.IsGameObject, delta uint64, renderer *sdl.Renderer) error {
+ evs, err := events.Poll(delta)
+ if err != nil {
+ return err
+ }
+ ParseRecursive(root, delta, renderer, evs...)
+ return nil
+}
+
+func ParseRecursive(current ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) {
+ ParseSingle(current, delta, renderer, evs...)
+ for _, c := range current.GO().Children {
+ if c == nil {
+ continue
+ }
+ ParseSingle(c, delta, renderer, evs...)
+ }
+}
+
+func ParseSingle(obj ecs.IsGameObject, delta uint64, renderer *sdl.Renderer, evs ...any) {
+ switch impl := obj.(type) {
+ case input.MouseMotionHandler:
+ for _, e := range events.OfType[events.MouseMotion](evs...) {
+ impl.ProcessMouseMotion(e)
+ }
+ case input.MousePressHandler:
+ for _, e := range events.OfType[events.MousePress](evs...) {
+ impl.ProcessMousePress(e)
+ }
+ case render.Renders:
+ impl.Render(renderer)
+ }
+}