func main() { if err := glfw.Init(nopContextWatcher{}); err != nil { panic(err) } defer glfw.Terminate() glfw.WindowHint(glfw.Samples, 8) // Anti-aliasing. window, err := glfw.CreateWindow(400, 400, "", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() if err := gl.Init(); err != nil { panic(err) } glfw.SwapInterval(1) // Vsync. InitFont() defer DeinitFont() framebufferSizeCallback := func(w *glfw.Window, framebufferSize0, framebufferSize1 int) { gl.Viewport(0, 0, int32(framebufferSize0), int32(framebufferSize1)) var windowSize [2]int windowSize[0], windowSize[1] = w.GetSize() // Update the projection matrix. gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() gl.Ortho(0, float64(windowSize[0]), float64(windowSize[1]), 0, -1, 1) gl.MatrixMode(gl.MODELVIEW) } { var framebufferSize [2]int framebufferSize[0], framebufferSize[1] = window.GetFramebufferSize() framebufferSizeCallback(window, framebufferSize[0], framebufferSize[1]) } window.SetFramebufferSizeCallback(framebufferSizeCallback) var inputEventQueue []events.InputEvent mousePointer = &events.Pointer{VirtualCategory: events.POINTING} window.SetMouseMovementCallback(func(w *glfw.Window, xpos, ypos, xdelta, ydelta float64) { inputEvent := events.InputEvent{ Pointer: mousePointer, EventTypes: map[events.EventType]struct{}{events.SLIDER_EVENT: {}}, InputId: 0, Buttons: nil, Sliders: []float64{xdelta, ydelta}, } if w.GetInputMode(glfw.CursorMode) != glfw.CursorDisabled { inputEvent.EventTypes[events.AXIS_EVENT] = struct{}{} inputEvent.Axes = []float64{xpos, ypos} } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) window.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { inputEvent := events.InputEvent{ Pointer: mousePointer, EventTypes: map[events.EventType]struct{}{events.BUTTON_EVENT: {}}, InputId: uint16(button), Buttons: []bool{action != glfw.Release}, Sliders: nil, Axes: nil, ModifierKey: uint8(mods), } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) go func() { <-time.After(5 * time.Second) log.Println("trigger!") boxUpdated = true glfw.PostEmptyEvent() }() gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) // For font. gl.ClearColor(247.0/255, 247.0/255, 247.0/255, 1) var spinner int var widgets []events.Widgeter widgets = append(widgets, NewButtonWidget(mgl64.Vec2{50, 200}, func() { fmt.Println("button triggered") })) for !window.ShouldClose() && glfw.Press != window.GetKey(glfw.KeyEscape) { glfw.WaitEvents() // Process Input. inputEventQueue = events.ProcessInputEventQueue(inputEventQueue, widgets[0]) gl.Clear(gl.COLOR_BUFFER_BIT) gl.LoadIdentity() for _, widget := range widgets { widget.Render() } drawSpinner(spinner) spinner++ drawBox() gl.Color3d(1, 0, 0) NewOpenGlStream(mgl64.Vec2{50, 300}).PrintText(` !"#$%&'()*+,-./ 0123456789:;<=>? @ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ ` + "`" + `abcdefghijklmno pqrstuvwxyz{|}~`) window.SwapBuffers() log.Println("swapped buffers") //runtime.Gosched() } }
func main() { if err := glfw.Init(gl.ContextWatcher); err != nil { panic(err) } defer glfw.Terminate() window, err := glfw.CreateWindow(400, 400, "", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() glfw.SwapInterval(1) // Vsync. framebufferSizeCallback := func(w *glfw.Window, framebufferSize0, framebufferSize1 int) { gl.Viewport(0, 0, framebufferSize0, framebufferSize1) var windowSize [2]int windowSize[0], windowSize[1] = w.GetSize() _, _ = windowSize[0], windowSize[1] } { var framebufferSize [2]int framebufferSize[0], framebufferSize[1] = window.GetFramebufferSize() framebufferSizeCallback(window, framebufferSize[0], framebufferSize[1]) } window.SetFramebufferSizeCallback(framebufferSizeCallback) var inputEventQueue []events.InputEvent mousePointer = &events.Pointer{VirtualCategory: events.POINTING} keyboardPointer = &events.Pointer{VirtualCategory: events.TYPING} window.SetMouseMovementCallback(func(w *glfw.Window, xpos, ypos, xdelta, ydelta float64) { inputEvent := events.InputEvent{ Pointer: mousePointer, EventTypes: map[events.EventType]struct{}{events.SLIDER_EVENT: {}}, InputId: 0, Buttons: nil, Sliders: []float64{xdelta, ydelta}, } if w.GetInputMode(glfw.CursorMode) != glfw.CursorDisabled { inputEvent.EventTypes[events.AXIS_EVENT] = struct{}{} inputEvent.Axes = []float64{xpos, ypos} } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) window.SetScrollCallback(func(w *glfw.Window, xoff float64, yoff float64) { inputEvent := events.InputEvent{ Pointer: mousePointer, EventTypes: map[events.EventType]struct{}{events.SLIDER_EVENT: {}}, InputId: 2, Buttons: nil, Sliders: []float64{yoff, xoff}, Axes: nil, } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) window.SetMouseButtonCallback(func(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { inputEvent := events.InputEvent{ Pointer: mousePointer, EventTypes: map[events.EventType]struct{}{events.BUTTON_EVENT: {}}, InputId: uint16(button), Buttons: []bool{action != glfw.Release}, Sliders: nil, Axes: nil, ModifierKey: uint8(mods), } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) window.SetKeyCallback(func(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { inputEvent := events.InputEvent{ Pointer: keyboardPointer, EventTypes: map[events.EventType]struct{}{events.BUTTON_EVENT: {}}, InputId: uint16(key), Buttons: []bool{action != glfw.Release}, Sliders: nil, Axes: nil, ModifierKey: uint8(mods), } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) // HACK. switch { case key == glfw.Key1 && action == glfw.Press: window.SetInputMode(glfw.CursorMode, glfw.CursorNormal) case key == glfw.Key2 && action == glfw.Press: window.SetInputMode(glfw.CursorMode, glfw.CursorHidden) case key == glfw.Key3 && action == glfw.Press: window.SetInputMode(glfw.CursorMode, glfw.CursorDisabled) } }) window.SetCharCallback(func(w *glfw.Window, char rune) { inputEvent := events.InputEvent{ Pointer: keyboardPointer, EventTypes: map[events.EventType]struct{}{events.CHARACTER_EVENT: {}}, InputId: uint16(char), Buttons: nil, Sliders: nil, Axes: nil, } inputEventQueue = events.EnqueueInputEvent(inputEventQueue, inputEvent) }) gl.ClearColor(0.85, 0.85, 0.85, 1) for !window.ShouldClose() { glfw.PollEvents() // Process Input. inputEventQueue = processInputEventQueue(inputEventQueue) gl.Clear(gl.COLOR_BUFFER_BIT) window.SwapBuffers() runtime.Gosched() } }