func (m Mesh) draw() { gl.EnableVertexAttribArray(0) gl.EnableVertexAttribArray(1) gl.EnableVertexAttribArray(2) if m.vbo == 0 { panic("attempt to set array buffer with VBO=0") } gl.BindBuffer(gl.ARRAY_BUFFER, m.vbo) gl.VertexAttribPointer(0, 3, gl.FLOAT, false, VertexSize*4, gl.PtrOffset(0)) gl.VertexAttribPointer(1, 2, gl.FLOAT, false, VertexSize*4, gl.PtrOffset(12)) gl.VertexAttribPointer(2, 3, gl.FLOAT, false, VertexSize*4, gl.PtrOffset(20)) if m.vbo == 0 { panic("attempt to set element array buffer with VBO=0") } gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, m.ibo) if m.size == 0 { panic("attempt to draw elements with mesh size = 0") } gl.DrawElements(gl.TRIANGLES, m.size, gl.UNSIGNED_INT, gl.PtrOffset(0)) gl.DisableVertexAttribArray(0) gl.DisableVertexAttribArray(1) gl.DisableVertexAttribArray(2) }
func List(width, height int, list *draw.List) { gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.Enable(gl.SCISSOR_TEST) defer gl.Disable(gl.SCISSOR_TEST) gl.EnableClientState(gl.VERTEX_ARRAY) defer gl.DisableClientState(gl.VERTEX_ARRAY) gl.EnableClientState(gl.COLOR_ARRAY) defer gl.DisableClientState(gl.COLOR_ARRAY) gl.EnableClientState(gl.TEXTURE_COORD_ARRAY) defer gl.DisableClientState(gl.TEXTURE_COORD_ARRAY) gl.VertexPointer(2, gl.FLOAT, vertexStride, unsafe.Pointer(&(list.Vertices[0].P))) gl.TexCoordPointer(2, gl.FLOAT, vertexStride, unsafe.Pointer(&(list.Vertices[0].UV))) gl.ColorPointer(4, gl.UNSIGNED_BYTE, vertexStride, unsafe.Pointer(&(list.Vertices[0].Color))) offset := 0 for _, cmd := range list.Commands { if cmd.Count == 0 { continue } if cmd.Texture == 0 { gl.Disable(gl.TEXTURE_2D) } else { gl.Enable(gl.TEXTURE_2D) gl.BindTexture(gl.TEXTURE_2D, uint32(cmd.Texture)) } x, y, w, h := cmd.Clip.AsInt32() gl.Scissor(x, int32(height)-y-h, w, h) gl.DrawElements(gl.TRIANGLES, int32(cmd.Count), indexType, gl.Ptr(list.Indicies[offset:])) offset += int(cmd.Count) } }
// DrawElements renders primitives from a bound buffer. // // http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawElements.xhtml func DrawElements(mode Enum, count int, ty Enum, offset unsafe.Pointer) { gl.DrawElements(uint32(mode), int32(count), uint32(ty), offset) }
// DrawElements renders primitives from a bound buffer. // // http://www.khronos.org/opengles/sdk/docs/man3/html/glDrawElements.xhtml func DrawElements(mode Enum, count int, ty Enum, offset int) { gl.DrawElements(uint32(mode), int32(count), uint32(ty), gl.PtrOffset(offset)) }
func (c *Context) DrawElements(mode Mode, len int) { gl.DrawElements(uint32(mode), int32(len), gl.UNSIGNED_SHORT, gl.PtrOffset(0)) }
func (c *Context) DrawElements(mode, count, typ, offset int) { gl.DrawElements(uint32(mode), int32(count), uint32(typ), gl.PtrOffset(offset)) }
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() } }
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) { _ = c.runOnContextThread(func() error { gl.DrawElements(uint32(mode), int32(len), gl.UNSIGNED_SHORT, gl.PtrOffset(offsetInBytes)) return nil }) }