diff --git a/cmd/roundedrectgl.go b/cmd/roundedrectgl.go new file mode 100644 index 0000000..86a3e07 --- /dev/null +++ b/cmd/roundedrectgl.go @@ -0,0 +1,129 @@ +// Ported from GLUT's samples. Original copyright below applies. + +/* Copyright (c) Mark J. Kilgard, 1996. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +/* This program is a response to a question posed by Gil Colgate + about how lengthy a program is required using + OpenGL compared to using Direct3D immediate mode to "draw a + triangle at screen coordinates 0,0, to 200,200 to 20,200, and I + want it to be blue at the top vertex, red at the left vertex, and + green at the right vertex". I'm not sure how long the Direct3D + program is; Gil has used Direct3D and his guess is "about 3000 + lines of code". */ + +package main + +import ( + "image/color" + "log" + "runtime" + + "github.com/go-gl/gl/v2.1/gl" + "github.com/go-gl/glfw/v3.1/glfw" + "github.com/llgcode/draw2d/draw2d" + "github.com/llgcode/draw2d/draw2dgl" +) + +var ( + // global rotation + rotate int + width, height int + redraw = true + font draw2d.FontData +) + +func reshape(window *glfw.Window, w, h int) { + gl.ClearColor(1, 1, 1, 1) + /* Establish viewing area to cover entire window. */ + gl.Viewport(0, 0, int32(w), int32(h)) + /* PROJECTION Matrix mode. */ + gl.MatrixMode(gl.PROJECTION) + /* Reset project matrix. */ + gl.LoadIdentity() + /* Map abstract coords directly to window coords. */ + gl.Ortho(0, float64(w), 0, float64(h), -1, 1) + /* Invert Y axis so increasing Y goes down. */ + gl.Scalef(1, -1, 1) + /* Shift origin up to upper-left corner. */ + gl.Translatef(0, float32(-h), 0) + gl.Enable(gl.BLEND) + gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) + gl.Disable(gl.DEPTH_TEST) + width, height = w, h + redraw = true +} + +// Ask to refresh +func invalidate() { + redraw = true +} + +func display() { + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) + + gl.LineWidth(1) + gc := draw2dgl.NewGraphicContext(width, height) + gc.SetFontData(draw2d.FontData{"luxi", draw2d.FontFamilyMono, draw2d.FontStyleBold | draw2d.FontStyleItalic}) + + gc.BeginPath() + draw2d.RoundRect(gc, 200, 200, 600, 600, 100, 100) + + gc.SetFillColor(color.RGBA{0, 0, 0, 0xff}) + gc.Fill() + + gl.Flush() /* Single buffered, so needs a flush. */ +} + +func init() { + runtime.LockOSThread() +} + +func main() { + err := glfw.Init() + if err != nil { + panic(err) + } + defer glfw.Terminate() + width, height = 800, 800 + window, err := glfw.CreateWindow(width, height, "Show RoundedRect", nil, nil) + if err != nil { + panic(err) + } + + window.MakeContextCurrent() + window.SetSizeCallback(reshape) + window.SetKeyCallback(onKey) + window.SetCharCallback(onChar) + + glfw.SwapInterval(1) + + err = gl.Init() + if err != nil { + panic(err) + } + + reshape(window, width, height) + for !window.ShouldClose() { + if redraw { + display() + window.SwapBuffers() + redraw = false + } + glfw.PollEvents() + // time.Sleep(2 * time.Second) + } +} +func onChar(w *glfw.Window, char rune) { + log.Println(char) +} +func onKey(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { + switch { + case key == glfw.KeyEscape && action == glfw.Press, + key == glfw.KeyQ && action == glfw.Press: + w.SetShouldClose(true) + } +}