Exemplo n.º 1
0
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")
	}
}