go-opengl-pixel/pixelgl/texture.go

75 lines
1.5 KiB
Go

package pixelgl
import (
"github.com/go-gl/gl/v3.3-core/gl"
"github.com/pkg/errors"
)
// Texture is an OpenGL texture.
type Texture struct {
parent Doer
tex uint32
}
// NewTexture creates a new texture with the specified width and height.
// The pixels must be a sequence of RGBA values.
func NewTexture(parent Doer, width, height int, pixels []uint8) (*Texture, error) {
texture := &Texture{parent: parent}
var err error
parent.Do(func(ctx Context) {
err = DoGLErr(func() {
gl.GenTextures(1, &texture.tex)
gl.BindTexture(gl.TEXTURE_2D, texture.tex)
gl.TexImage2D(
gl.TEXTURE_2D,
0,
gl.RGBA,
int32(width),
int32(height),
0,
gl.RGBA,
gl.UNSIGNED_BYTE,
gl.Ptr(pixels),
)
gl.GenerateMipmap(gl.TEXTURE_2D)
gl.BindTexture(gl.TEXTURE_2D, 0)
})
})
if err != nil {
return nil, errors.Wrap(err, "failed to create a texture")
}
return texture, nil
}
// Delete deletes a texture. Don't use a texture after deletion.
func (t *Texture) Delete() {
t.parent.Do(func(ctx Context) {
DoNoBlock(func() {
gl.DeleteTextures(1, &t.tex)
})
})
}
// ID returns an OpenGL identifier of a texture.
func (t *Texture) ID() uint32 {
return t.tex
}
// Do bind a texture, executes sub, and unbinds the texture.
func (t *Texture) Do(sub func(Context)) {
t.parent.Do(func(ctx Context) {
DoNoBlock(func() {
gl.BindTexture(gl.TEXTURE_2D, t.tex)
})
sub(ctx)
DoNoBlock(func() {
gl.BindTexture(gl.TEXTURE_2D, 0)
})
})
}