mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 10:48:53 +01:00
Use VBO for vertices, tex coords (#2)
This commit is contained in:
parent
7f6e440d97
commit
c156cb1e66
@ -16,6 +16,7 @@ package shader
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/go-gl/gl"
|
"github.com/go-gl/gl"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
func glMatrix(m [4][4]float64) [16]float32 {
|
func glMatrix(m [4][4]float64) [16]float32 {
|
||||||
@ -33,20 +34,27 @@ type Matrix interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type vbo struct {
|
type vbo struct {
|
||||||
indexBuffer gl.Buffer
|
indexBuffer gl.Buffer
|
||||||
|
vertexBuffer gl.Buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
const size = 10000
|
const size = 10000
|
||||||
|
|
||||||
var currentVBO *vbo
|
var currentVBO *vbo
|
||||||
|
|
||||||
|
const uint16Size = 2
|
||||||
|
const short32Size = 4
|
||||||
|
|
||||||
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []TextureQuad, geo Matrix, color Matrix) {
|
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []TextureQuad, geo Matrix, color Matrix) {
|
||||||
// TODO: Check len(quads) and gl.MAX_ELEMENTS_INDICES?
|
// TODO: Check len(quads) and gl.MAX_ELEMENTS_INDICES?
|
||||||
|
const stride = 4 * 4
|
||||||
if currentVBO == nil {
|
if currentVBO == nil {
|
||||||
initialize()
|
initialize()
|
||||||
currentVBO = &vbo{
|
currentVBO = &vbo{
|
||||||
indexBuffer: gl.GenBuffer(),
|
indexBuffer: gl.GenBuffer(),
|
||||||
|
vertexBuffer: gl.GenBuffer(),
|
||||||
}
|
}
|
||||||
|
|
||||||
currentVBO.indexBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER)
|
currentVBO.indexBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER)
|
||||||
indices := make([]uint16, 6*size)
|
indices := make([]uint16, 6*size)
|
||||||
for i := uint16(0); i < size; i++ {
|
for i := uint16(0); i < size; i++ {
|
||||||
@ -57,7 +65,11 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
|
|||||||
indices[6*i+4] = 4*i + 2
|
indices[6*i+4] = 4*i + 2
|
||||||
indices[6*i+5] = 4*i + 3
|
indices[6*i+5] = 4*i + 3
|
||||||
}
|
}
|
||||||
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(indices), indices, gl.STATIC_DRAW)
|
gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, uint16Size*len(indices), indices, gl.STATIC_DRAW)
|
||||||
|
|
||||||
|
currentVBO.vertexBuffer.Bind(gl.ARRAY_BUFFER)
|
||||||
|
vertices := make([]float32, stride*size)
|
||||||
|
gl.BufferData(gl.ARRAY_BUFFER, short32Size*len(vertices), vertices, gl.DYNAMIC_DRAW)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(quads) == 0 {
|
if len(quads) == 0 {
|
||||||
@ -83,32 +95,31 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
|
|||||||
gl.DisableClientState(gl.VERTEX_ARRAY)
|
gl.DisableClientState(gl.VERTEX_ARRAY)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// TODO: Fix this dirty hack after fixing https://github.com/go-gl/gl/issues/174
|
||||||
|
v := (*int)(unsafe.Pointer(uintptr(4 * 0)))
|
||||||
|
t := (*int)(unsafe.Pointer(uintptr(4 * 2)))
|
||||||
|
vertexAttrLocation.AttribPointer(2, gl.FLOAT, false, stride, v)
|
||||||
|
texCoordAttrLocation.AttribPointer(2, gl.FLOAT, false, stride, t)
|
||||||
|
|
||||||
vertices := []float32{}
|
vertices := []float32{}
|
||||||
texCoords := []float32{}
|
|
||||||
for _, quad := range quads {
|
for _, quad := range quads {
|
||||||
x0 := quad.VertexX0
|
x0 := quad.VertexX0
|
||||||
x1 := quad.VertexX1
|
x1 := quad.VertexX1
|
||||||
y0 := quad.VertexY0
|
y0 := quad.VertexY0
|
||||||
y1 := quad.VertexY1
|
y1 := quad.VertexY1
|
||||||
vertices = append(vertices,
|
|
||||||
x0, y0,
|
|
||||||
x1, y0,
|
|
||||||
x0, y1,
|
|
||||||
x1, y1,
|
|
||||||
)
|
|
||||||
u0 := quad.TextureCoordU0
|
u0 := quad.TextureCoordU0
|
||||||
u1 := quad.TextureCoordU1
|
u1 := quad.TextureCoordU1
|
||||||
v0 := quad.TextureCoordV0
|
v0 := quad.TextureCoordV0
|
||||||
v1 := quad.TextureCoordV1
|
v1 := quad.TextureCoordV1
|
||||||
texCoords = append(texCoords,
|
vertices = append(vertices,
|
||||||
u0, v0,
|
x0, y0, u0, v0,
|
||||||
u1, v0,
|
x1, y0, u1, v0,
|
||||||
u0, v1,
|
x0, y1, u0, v1,
|
||||||
u1, v1,
|
x1, y1, u1, v1,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
vertexAttrLocation.AttribPointer(2, gl.FLOAT, false, 0, vertices)
|
gl.BufferSubData(gl.ARRAY_BUFFER, 0, short32Size*len(vertices), vertices)
|
||||||
texCoordAttrLocation.AttribPointer(2, gl.FLOAT, false, 0, texCoords)
|
// TODO: Pass 0 after fixing the gl bug
|
||||||
gl.DrawElements(gl.TRIANGLES, 6*len(quads), gl.UNSIGNED_SHORT, nil)
|
gl.DrawElements(gl.TRIANGLES, 6*len(quads), gl.UNSIGNED_SHORT, nil)
|
||||||
|
|
||||||
gl.Flush()
|
gl.Flush()
|
||||||
|
Loading…
Reference in New Issue
Block a user