package tree import ( "github.com/Zyko0/go-sdl3/sdl" "ponger/ecs" "ponger/events" "ponger/render" ) func Process(root ecs.IsGameObject, delta events.Delta, 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 events.Delta, 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...) } for _, c := range current.GO().Components { if c == nil { continue } c.Process(delta, current.GO()) ParseSingle(c, delta, renderer, evs...) } } func ParseSingle(obj any, delta events.Delta, renderer *sdl.Renderer, evs ...any) { if impl, ok := obj.(events.WindowChangeHandler); ok { for _, e := range events.OfType[events.WindowChange](evs...) { impl.ProcessWindowChange(e) } } if impl, ok := obj.(events.MouseMotionHandler); ok { for _, e := range events.OfType[events.MouseMotion](evs...) { impl.ProcessMouseMotion(e) } } if impl, ok := obj.(events.MousePressHandler); ok { for _, e := range events.OfType[events.MousePress](evs...) { impl.ProcessMousePress(e) } } if impl, ok := obj.(render.Renders); ok { impl.Render(renderer) } }