// driverLoop pulls and executes funcs from the pendingDriver chan until chan // close. If there are no funcs enqueued, the driver routine calls and blocks on // glfw.WaitEvents. All sends on the pendingDriver chan should be paired with a // call to wake() so that glfw.WaitEvents can return. func (d *driver) driverLoop() { for { ev, ok := d.pendingDriver.Pop() if !ok { return } if ev == nil { glfw.WaitEvents() continue } ev() } }
// driverLoop pulls and executes funcs from the pendingDriver chan until chan // close. If there are no funcs enqueued, the driver routine calls and blocks on // glfw.WaitEvents. All sends on the pendingDriver chan should be paired with a // call to wake() so that glfw.WaitEvents can return. func (d *driver) driverLoop() { for { select { case ev, open := <-d.pendingDriver: if open { ev() } else { return // termintated } default: glfw.WaitEvents() } } }
func main() { if err := glfw.Init(nopContextWatcher{}); err != nil { panic(err) } defer glfw.Terminate() window, err := glfw.CreateWindow(1536, 960, "", nil, nil) if err != nil { panic(err) } globalWindow = window window.MakeContextCurrent() window.SetInputMode(glfw.CursorMode, glfw.CursorHidden) if err := gl.Init(); nil != err { panic(err) } glfw.SwapInterval(1) // Vsync. 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 []InputEvent mousePointer = &Pointer{VirtualCategory: POINTING} var lastMousePos mgl64.Vec2 lastMousePos[0], lastMousePos[1] = window.GetCursorPos() MousePos := func(w *glfw.Window, x, y float64) { //fmt.Println("MousePos:", x, y) inputEvent := InputEvent{ Pointer: mousePointer, EventTypes: map[EventType]bool{SLIDER_EVENT: true, AXIS_EVENT: true}, InputId: 0, Buttons: nil, Sliders: []float64{x - lastMousePos[0], y - lastMousePos[1]}, // TODO: Do this in a pointer general way? Axes: []float64{x, y}, } lastMousePos[0] = x lastMousePos[1] = y inputEventQueue = EnqueueInputEvent(inputEvent, inputEventQueue) } window.SetCursorPosCallback(MousePos) MousePos(window, lastMousePos[0], lastMousePos[1]) gl.ClearColor(0.85, 0.85, 0.85, 1) rand.Seed(4) var widget = newMultitouchTestBoxWidget(mgl64.Vec2{600, 300}, rand.Intn(6)) var widget2 = newMultitouchTestBoxWidget(mgl64.Vec2{600 + 210, 300 + 210}, rand.Intn(6)) var widget3 = newMultitouchTestBoxWidget(mgl64.Vec2{600 + 210, 300}, rand.Intn(6)) var widget4 = newMultitouchTestBoxWidget(mgl64.Vec2{600, 300 + 210}, rand.Intn(6)) go func() { <-time.After(5 * time.Second) log.Println("trigger!") widget.color++ // HACK: Racy. glfw.PostEmptyEvent() }() for !window.ShouldClose() { //glfw.PollEvents() glfw.WaitEvents() // Process Input. inputEventQueue = ProcessInputEventQueue(inputEventQueue) gl.Clear(gl.COLOR_BUFFER_BIT) widget.Render() widget2.Render() widget3.Render() widget4.Render() mousePointer.Render() window.SwapBuffers() log.Println("swapped buffers") runtime.Gosched() } }
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() } }