func useProgramForRects(c *opengl.Context, projectionMatrix []float32) programFinisher { if !lastProgram.Equals(programSolidRect) { c.UseProgram(programSolidRect) lastProgram = programSolidRect } program := programSolidRect c.BindElementArrayBuffer(indexBufferQuads) c.UniformFloats(program, "projection_matrix", projectionMatrix) c.EnableVertexAttribArray(program, "vertex") c.EnableVertexAttribArray(program, "color") c.VertexAttribPointer(program, "vertex", true, false, int16Size*6, 2, int16Size*0) c.VertexAttribPointer(program, "color", false, true, int16Size*6, 4, int16Size*2) return func() { c.DisableVertexAttribArray(program, "color") c.DisableVertexAttribArray(program, "vertex") } }
func useProgramForTexture(c *opengl.Context, projectionMatrix []float32, texture opengl.Texture, geo Matrix, color Matrix) programFinisher { if !lastProgram.Equals(programTexture) { c.UseProgram(programTexture) lastProgram = programTexture lastProjectionMatrix = nil lastModelviewMatrix = nil lastColorMatrix = nil } program := programTexture c.BindElementArrayBuffer(indexBufferQuads) if !areSameFloat32Array(lastProjectionMatrix, projectionMatrix) { c.UniformFloats(program, "projection_matrix", projectionMatrix) if lastProjectionMatrix == nil { lastProjectionMatrix = make([]float32, 16) } copy(lastProjectionMatrix, projectionMatrix) } ma := float32(geo.Element(0, 0)) mb := float32(geo.Element(0, 1)) mc := float32(geo.Element(1, 0)) md := float32(geo.Element(1, 1)) tx := float32(geo.Element(0, 2)) ty := float32(geo.Element(1, 2)) modelviewMatrix := []float32{ ma, mc, 0, 0, mb, md, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1, } if !areSameFloat32Array(lastModelviewMatrix, modelviewMatrix) { c.UniformFloats(program, "modelview_matrix", modelviewMatrix) if lastModelviewMatrix == nil { lastModelviewMatrix = make([]float32, 16) } copy(lastModelviewMatrix, modelviewMatrix) } c.UniformInt(program, "texture", 0) e := [4][5]float32{} for i := 0; i < 4; i++ { for j := 0; j < 5; j++ { e[i][j] = float32(color.Element(i, j)) } } colorMatrix := []float32{ e[0][0], e[1][0], e[2][0], e[3][0], e[0][1], e[1][1], e[2][1], e[3][1], e[0][2], e[1][2], e[2][2], e[3][2], e[0][3], e[1][3], e[2][3], e[3][3], } if !areSameFloat32Array(lastColorMatrix, colorMatrix) { c.UniformFloats(program, "color_matrix", colorMatrix) if lastColorMatrix == nil { lastColorMatrix = make([]float32, 16) } copy(lastColorMatrix, colorMatrix) } colorMatrixTranslation := []float32{ e[0][4], e[1][4], e[2][4], e[3][4], } c.UniformFloats(program, "color_matrix_translation", colorMatrixTranslation) // We don't have to call gl.ActiveTexture here: GL_TEXTURE0 is the default active texture // See also: https://www.opengl.org/sdk/docs/man2/xhtml/glActiveTexture.xml c.BindTexture(texture) c.EnableVertexAttribArray(program, "vertex") c.EnableVertexAttribArray(program, "tex_coord") c.VertexAttribPointer(program, "vertex", true, false, int16Size*4, 2, int16Size*0) c.VertexAttribPointer(program, "tex_coord", true, true, int16Size*4, 2, int16Size*2) return func() { c.DisableVertexAttribArray(program, "tex_coord") c.DisableVertexAttribArray(program, "vertex") } }