package platform import ( "errors" "runtime" "time" "github.com/FooSoft/lazarus/platform/imgui_backend" "github.com/go-gl/gl/v2.1/gl" "github.com/veandco/go-sdl2/sdl" ) var ( ErrAlreadyInit = errors.New("platform is already initialized") ErrWasNotInit = errors.New("platform was not initialized") ) var state struct { isInit bool windows []*window } type Scene interface { Advance() } func Init() error { if state.isInit { return ErrAlreadyInit } runtime.LockOSThread() if err := sdl.Init(sdl.INIT_VIDEO); err != nil { return err } if err := gl.Init(); err != nil { return err } if err := imgui_backend.Init(); err != nil { return err } state.isInit = true return nil } func Shutdown() error { if !state.isInit { return ErrWasNotInit } for _, w := range state.windows { if err := w.Destroy(); err != nil { return err } } if err := imgui_backend.Shutdown(); err != nil { return err } state.windows = nil state.isInit = false return nil } func ProcessEvents() error { if !state.isInit { return ErrWasNotInit } for running := true; running; { advanceWindows() renderWindows() for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() { if !handleEvent(event) { running = false break } } <-time.After(time.Millisecond * 25) } return nil } func CreateWindow(title string, width, height int, scene Scene) (Window, error) { if !state.isInit { return nil, ErrWasNotInit } window, err := newWindow(title, width, height, scene) if err != nil { return nil, err } state.windows = append(state.windows, window) return window, err } func advanceWindows() { for _, window := range state.windows { window.advance() } } func renderWindows() { for _, window := range state.windows { window.render() } } func handleEvent(event sdl.Event) bool { switch event.(type) { case *sdl.QuitEvent: return false } return true }