// NewPaletteTexture creates a new PaletteTexture instance. func NewPaletteTexture(gl opengl.OpenGl, colorProvider ColorProvider) *PaletteTexture { tex := &PaletteTexture{ gl: gl, colorProvider: colorProvider, handle: gl.GenTextures(1)[0]} tex.Update() return tex }
// NewBitmapTexture downloads the provided raw data to OpenGL and returns a BitmapTexture instance. func NewBitmapTexture(gl opengl.OpenGl, width, height int, pixelData []byte) *BitmapTexture { textureWidth := powerOfTwo(width) textureHeight := powerOfTwo(height) tex := &BitmapTexture{ gl: gl, width: float32(width), height: float32(height), handle: gl.GenTextures(1)[0]} tex.u = tex.width / float32(textureWidth) tex.v = tex.height / float32(textureHeight) // The texture has to be blown up to use RGBA from the start; // OpenGL 3.2 doesn't know ALPHA format, Open GL ES 2.0 (WebGL) doesn't know RED or R8. rgbaData := make([]byte, textureWidth*textureHeight*BytesPerRgba) for y := 0; y < height; y++ { inStart := y * width outOffset := y * textureWidth * BytesPerRgba for x := 0; x < width; x++ { value := pixelData[inStart+x] rgbaData[outOffset+0] = value rgbaData[outOffset+1] = value rgbaData[outOffset+2] = value rgbaData[outOffset+3] = value outOffset += BytesPerRgba } } gl.BindTexture(opengl.TEXTURE_2D, tex.handle) gl.TexImage2D(opengl.TEXTURE_2D, 0, opengl.RGBA, int32(textureWidth), int32(textureHeight), 0, opengl.RGBA, opengl.UNSIGNED_BYTE, rgbaData) gl.TexParameteri(opengl.TEXTURE_2D, opengl.TEXTURE_MAG_FILTER, opengl.NEAREST) gl.TexParameteri(opengl.TEXTURE_2D, opengl.TEXTURE_MIN_FILTER, opengl.NEAREST) gl.GenerateMipmap(opengl.TEXTURE_2D) gl.BindTexture(opengl.TEXTURE_2D, 0) return tex }