mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 02:38:53 +01:00
graphics: Refactoring: Introduce arrayBufferLayout
This commit is contained in:
parent
c1b4624890
commit
8ee859df31
@ -432,10 +432,10 @@ func (c *Context) getAttribLocationImpl(p Program, location string) attribLocati
|
||||
return attrib
|
||||
}
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, offset int) {
|
||||
_ = c.runOnContextThread(func() error {
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(uint32(l), int32(size), gl.SHORT, normalize, int32(stride), gl.PtrOffset(v))
|
||||
gl.VertexAttribPointer(uint32(l), int32(size), gl.SHORT, normalize, int32(stride), gl.PtrOffset(offset))
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
@ -354,10 +354,10 @@ func (c *Context) getAttribLocationImpl(p Program, location string) attribLocati
|
||||
return attribLocation(gl.GetAttribLocation(p.Object, location))
|
||||
}
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, offset int) {
|
||||
gl := c.gl
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(int(l), size, gl.SHORT, normalize, stride, v)
|
||||
gl.VertexAttribPointer(int(l), size, gl.SHORT, normalize, stride, offset)
|
||||
}
|
||||
|
||||
func (c *Context) EnableVertexAttribArray(p Program, location string) {
|
||||
|
@ -336,10 +336,10 @@ func (c *Context) getAttribLocationImpl(p Program, location string) attribLocati
|
||||
return a
|
||||
}
|
||||
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, v int) {
|
||||
func (c *Context) VertexAttribPointer(p Program, location string, normalize bool, stride int, size int, offset int) {
|
||||
gl := c.gl
|
||||
l := c.locationCache.GetAttribLocation(c, p, location)
|
||||
gl.VertexAttribPointer(mgl.Attrib(l), size, mgl.SHORT, normalize, stride, v)
|
||||
gl.VertexAttribPointer(mgl.Attrib(l), size, mgl.SHORT, normalize, stride, offset)
|
||||
}
|
||||
|
||||
func (c *Context) EnableVertexAttribArray(p Program, location string) {
|
||||
|
@ -20,6 +20,42 @@ import (
|
||||
"github.com/hajimehoshi/ebiten/internal/graphics/opengl"
|
||||
)
|
||||
|
||||
type arrayBufferLayout struct {
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) enable(c *opengl.Context, program opengl.Program) {
|
||||
c.EnableVertexAttribArray(program, "vertex")
|
||||
c.EnableVertexAttribArray(program, "tex_coord")
|
||||
// TODO: Argument order doesn't match with glVertexAttribPointer: Fix them.
|
||||
c.VertexAttribPointer(program, "vertex", false, a.totalBytes(), a.vertexNum(), 0)
|
||||
c.VertexAttribPointer(program, "tex_coord", true, a.totalBytes(), a.texCoordNum(), a.vertexBytes())
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) disable(c *opengl.Context, program opengl.Program) {
|
||||
c.DisableVertexAttribArray(program, "tex_coord")
|
||||
c.DisableVertexAttribArray(program, "vertex")
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) vertexNum() int {
|
||||
return 2
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) vertexBytes() int {
|
||||
return int16Size * a.vertexNum()
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) texCoordNum() int {
|
||||
return 2
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) texCoordBytes() int {
|
||||
return int16Size * a.texCoordNum()
|
||||
}
|
||||
|
||||
func (a *arrayBufferLayout) totalBytes() int {
|
||||
return a.vertexBytes() + a.texCoordBytes()
|
||||
}
|
||||
|
||||
type openGLState struct {
|
||||
arrayBuffer opengl.Buffer
|
||||
indexBufferQuads opengl.Buffer
|
||||
@ -33,7 +69,8 @@ type openGLState struct {
|
||||
}
|
||||
|
||||
var (
|
||||
theOpenGLState openGLState
|
||||
theOpenGLState openGLState
|
||||
theArrayBufferLayout = arrayBufferLayout{}
|
||||
|
||||
zeroBuffer opengl.Buffer
|
||||
zeroProgram opengl.Program
|
||||
@ -94,8 +131,8 @@ func (s *openGLState) reset(context *opengl.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
const stride = 8 // (2 [vertices] + 2 [texels]) * 2 [sizeof(int16)/bytes]
|
||||
s.arrayBuffer = context.NewBuffer(opengl.ArrayBuffer, 4*stride*maxQuads, opengl.DynamicDraw)
|
||||
stride := theArrayBufferLayout.totalBytes()
|
||||
s.arrayBuffer = context.NewBuffer(opengl.ArrayBuffer, stride*4*maxQuads, opengl.DynamicDraw)
|
||||
|
||||
indices := make([]uint16, 6*maxQuads)
|
||||
for i := uint16(0); i < maxQuads; i++ {
|
||||
@ -138,13 +175,9 @@ func (p *programContext) begin() error {
|
||||
if p.state.lastProgram != p.program {
|
||||
c.UseProgram(p.program)
|
||||
if p.state.lastProgram != zeroProgram {
|
||||
c.DisableVertexAttribArray(p.state.lastProgram, "tex_coord")
|
||||
c.DisableVertexAttribArray(p.state.lastProgram, "vertex")
|
||||
theArrayBufferLayout.disable(c, p.state.lastProgram)
|
||||
}
|
||||
c.EnableVertexAttribArray(p.program, "vertex")
|
||||
c.EnableVertexAttribArray(p.program, "tex_coord")
|
||||
c.VertexAttribPointer(p.program, "vertex", false, int16Size*4, 2, int16Size*0)
|
||||
c.VertexAttribPointer(p.program, "tex_coord", true, int16Size*4, 2, int16Size*2)
|
||||
theArrayBufferLayout.enable(c, p.program)
|
||||
|
||||
p.state.lastProgram = p.state.programTexture
|
||||
p.state.lastProjectionMatrix = nil
|
||||
|
Loading…
Reference in New Issue
Block a user