func main() { if err := glfw.Init(); err != nil { log.Fatalln("failed to initialize glfw:", err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 2) glfw.WindowHint(glfw.ContextVersionMinor, 1) window, err := glfw.CreateWindow(800, 600, "Cube", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() if err := gl.Init(); err != nil { panic(err) } texture = newTexture("square.png") defer gl.DeleteTextures(1, &texture) setupScene() for !window.ShouldClose() { drawScene() window.SwapBuffers() glfw.PollEvents() } }
func (u *userInterface) loop(g GraphicsContext) error { defer func() { _ = u.runOnMainThread(func() error { glfw.Terminate() return nil }) }() for { if err := u.update(g); err != nil { return err } // The bound framebuffer must be the default one (0) before swapping buffers. if err := glContext.BindScreenFramebuffer(); err != nil { return err } if err := u.runOnMainThread(func() error { return u.swapBuffers() }); err != nil { return err } } }
func main() { if err := glfw.Init(); err != nil { log.Fatalln("failed to initialize glfw:", err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 1) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(windowWidth, windowHeight, "Cube", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() // Initialize Glow if err := gl.Init(); err != nil { panic(err) } version := gl.GoStr(gl.GetString(gl.VERSION)) fmt.Println("OpenGL version", version) // Configure the vertex and fragment shaders program, err := newProgram(vertexShader, fragmentShader) if err != nil { panic(err) } gl.UseProgram(program) projection := mgl32.Perspective(mgl32.DegToRad(45.0), float32(windowWidth)/windowHeight, 0.1, 10.0) projectionUniform := gl.GetUniformLocation(program, gl.Str("projection\x00")) gl.UniformMatrix4fv(projectionUniform, 1, false, &projection[0]) camera := mgl32.LookAtV(mgl32.Vec3{3, 3, 3}, mgl32.Vec3{0, 0, 0}, mgl32.Vec3{0, 1, 0}) cameraUniform := gl.GetUniformLocation(program, gl.Str("camera\x00")) gl.UniformMatrix4fv(cameraUniform, 1, false, &camera[0]) model := mgl32.Ident4() modelUniform := gl.GetUniformLocation(program, gl.Str("model\x00")) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) textureUniform := gl.GetUniformLocation(program, gl.Str("tex\x00")) gl.Uniform1i(textureUniform, 0) gl.BindFragDataLocation(program, 0, gl.Str("outputColor\x00")) // Load the texture texture, err := newTexture("square.png") if err != nil { log.Fatalln(err) } // Configure the vertex data var vao uint32 gl.GenVertexArrays(1, &vao) gl.BindVertexArray(vao) var vbo uint32 gl.GenBuffers(1, &vbo) gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData(gl.ARRAY_BUFFER, len(cubeVertices)*4, gl.Ptr(cubeVertices), gl.STATIC_DRAW) vertAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vert\x00"))) gl.EnableVertexAttribArray(vertAttrib) gl.VertexAttribPointer(vertAttrib, 3, gl.FLOAT, false, 5*4, gl.PtrOffset(0)) texCoordAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vertTexCoord\x00"))) gl.EnableVertexAttribArray(texCoordAttrib) gl.VertexAttribPointer(texCoordAttrib, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4)) // Configure global settings gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.ClearColor(1.0, 1.0, 1.0, 1.0) angle := 0.0 previousTime := glfw.GetTime() for !window.ShouldClose() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // Update time := glfw.GetTime() elapsed := time - previousTime previousTime = time angle += elapsed model = mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0}) // Render gl.UseProgram(program) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) gl.BindVertexArray(vao) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, texture) gl.DrawArrays(gl.TRIANGLES, 0, 6*2*3) // Maintenance window.SwapBuffers() glfw.PollEvents() } }
func (w *Window) Show() { if err := glfw.Init(); err != nil { log.Fatalln("failed to initialize glfw:", err) } defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.Resizable, glfw.True) window, err := glfw.CreateWindow(w.W, w.H, w.Title, nil, nil) if err != nil { panic(err) } if err := gl.Init(); err != nil { panic(err) } window.MakeContextCurrent() if len(w.Icon) == 1 { window.SetIcon(w.Icon) } if w.RestrictionsEnabled { window.SetSizeLimits(w.MinW, w.MinH, w.MaxW, w.MaxH) } if w.Blend { gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) } else if w.Smooth { gl.Enable(gl.SMOOTH) gl.Enable(gl.POINT_SMOOTH) gl.Enable(gl.LINE_SMOOTH) gl.Enable(gl.POLYGON_SMOOTH) gl.Enable(gl.RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV) gl.Enable(gl.RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV) } else if w.Multisample { gl.Enable(gl.MULTISAMPLE) } reshape(w.W, w.H) window.SetRefreshCallback(func(g *glfw.Window) { reshape(w.W, w.H) }) window.SetSizeCallback(func(g *glfw.Window, width int, height int) { reshape(width, height) w.W = width w.H = height }) version := gl.GoStr(gl.GetString(gl.VERSION)) if !silentMode { fmt.Println("OpenGL version", version) } for !window.ShouldClose() { //Reset? gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) if w.DrawFunc != nil { w.DrawFunc() } // Maintenance gl.Flush() window.SwapBuffers() glfw.PollEvents() } }
func Run(charset string, charwidth, charheight int, eh EventHandler) { mousetrans := mouseTranslator{} keytrans := keyTranslator{} defer eh.Fin(true) width := 800 height := 600 // Initialize glfw and create window err := glfw.Init() Panic(err) defer glfw.Terminate() glfw.WindowHint(glfw.Resizable, glfw.True) glfw.WindowHint(glfw.ContextVersionMajor, 2) glfw.WindowHint(glfw.ContextVersionMinor, 1) window, err := glfw.CreateWindow(width, height, "Roguelike", nil, nil) defer window.Destroy() Panic(err) window.MakeContextCurrent() // Initialize opengl err = gl.Init() Panic(err) // Create shaders and program program, err := gli.NewProgram(vertexShaderText, fragmentShaderText) Panic(err) defer program.Delete() // Load and initialize texture img, err := gli.LoadImage(charset) Panic(err) texture, err := gli.NewTexture(img, gli.TextureFilter(gli.LINEAR, gli.LINEAR), gli.TextureWrap(gli.CLAMP_TO_EDGE, gli.CLAMP_TO_EDGE)) Panic(err) defer texture.Delete() // Create Vertex ArrayObject vao, err := gli.NewVAO() Panic(err) defer vao.Delete() // Create grid grid, err := NewGrid(charwidth, charheight, texture.Size().X, texture.Size().Y) Panic(err) grid.Resize(width, height) vCoords, vIndex, vData := grid.Buffers() // Create grid buffers posvbo, err := gli.NewBuffer(vCoords) Panic(err) defer posvbo.Delete() idxvbo, err := gli.NewBuffer(vIndex, gli.BufferElementArray()) Panic(err) defer idxvbo.Delete() vbo, err := gli.NewBuffer(vData, gli.BufferAccessFrequency(gli.DYNAMIC)) Panic(err) defer vbo.Delete() window.SetSizeCallback(func(win *glfw.Window, w, h int) { //fmt.Printf("resize\n") width = w height = h gl.Viewport(0, 0, int32(width), int32(height)) grid.Resize(width, height) vCoords, vIndex, vData := grid.Buffers() posvbo.Upload(vCoords) idxvbo.Upload(vIndex) vbo.Upload(vData) }) window.SetKeyCallback(func(win *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) { //fmt.Printf("key=%v code=%d, action=%v, mods=%v\n", key, scancode, action, mods) e, ok := keytrans.Key(key, action, mods) if ok { eh.Key(e) } }) window.SetCharCallback(func(win *glfw.Window, key rune) { eh.Char(key) //fmt.Printf("char=%d(%c)\n", key, key) }) window.SetCursorPosCallback(func(win *glfw.Window, x float64, y float64) { e, ok := mousetrans.Pos(x, y) if ok { eh.Mouse(e) } }) window.SetMouseButtonCallback(func(win *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { e, ok := mousetrans.Button(button, action, mods) if ok { eh.Mouse(e) } }) // Set up VAO vao.Enable(2, posvbo, program.Attrib("position")) vao.Enable(2, vbo, program.Attrib("texCoord"), gli.VAOStride(4)) vao.Enable(1, vbo, program.Attrib("foreColor"), gli.VAOStride(4), gli.VAOOffset(2)) vao.Enable(1, vbo, program.Attrib("backColor"), gli.VAOStride(4), gli.VAOOffset(3)) // Set uniforms program.Uniform("tex").SetSampler(1) program.Uniform("colorData[0]").SetFloat(colorData...) program.Uniform("runeSize").SetFloat(float32(grid.RuneSize().X), float32(grid.RuneSize().Y)) gl.ClearColor(0.0, 0.0, 0.0, 1.0) for !window.ShouldClose() && !eh.Fin(false) { //fmt.Printf("draw\n") // Render scene grid.clearData() eh.Draw(grid) _, _, vData = grid.Buffers() vbo.Update(0, vData) gl.Clear(gl.COLOR_BUFFER_BIT) // Draw scene program.Use() vao.Use() texture.Use(1) idxvbo.Use() gl.DrawElements(gl.TRIANGLES, grid.Vertices(), gl.UNSIGNED_INT, gl.PtrOffset(0)) window.SwapBuffers() glfw.WaitEvents() } }