graphics: Cache values for uniformMatrix4fv

This commit is contained in:
Hajime Hoshi 2015-02-18 11:30:24 +09:00
parent 6fc6c7ed95
commit 2b7617da7a

View File

@ -116,7 +116,24 @@ func initialize(c *opengl.Context) error {
return nil return nil
} }
var lastProgram opengl.Program func areSameFloat32Array(a, b []float32) bool {
if len(a) != len(b) {
return false
}
for i := 0; i < len(a); i++ {
if a[i] != b[i] {
return false
}
}
return true
}
var (
lastProgram opengl.Program
lastProjectionMatrix []float32
lastModelviewMatrix []float32
lastColorMatrix []float32
)
type programFinisher func() type programFinisher func()
@ -128,12 +145,21 @@ func useProgramForTexture(c *opengl.Context, projectionMatrix []float32, texture
if !lastProgram.Equals(programTexture) { if !lastProgram.Equals(programTexture) {
c.UseProgram(programTexture) c.UseProgram(programTexture)
lastProgram = programTexture lastProgram = programTexture
lastProjectionMatrix = nil
lastModelviewMatrix = nil
lastColorMatrix = nil
} }
program := programTexture program := programTexture
c.BindElementArrayBuffer(indexBufferQuads) c.BindElementArrayBuffer(indexBufferQuads)
if !areSameFloat32Array(lastProjectionMatrix, projectionMatrix) {
c.UniformFloats(program, "projection_matrix", projectionMatrix) c.UniformFloats(program, "projection_matrix", projectionMatrix)
if lastProjectionMatrix == nil {
lastProjectionMatrix = make([]float32, 16)
}
copy(lastProjectionMatrix, projectionMatrix)
}
ma := float32(geo.Element(0, 0)) ma := float32(geo.Element(0, 0))
mb := float32(geo.Element(0, 1)) mb := float32(geo.Element(0, 1))
@ -141,13 +167,20 @@ func useProgramForTexture(c *opengl.Context, projectionMatrix []float32, texture
md := float32(geo.Element(1, 1)) md := float32(geo.Element(1, 1))
tx := float32(geo.Element(0, 2)) tx := float32(geo.Element(0, 2))
ty := float32(geo.Element(1, 2)) ty := float32(geo.Element(1, 2))
glModelviewMatrix := []float32{ modelviewMatrix := []float32{
ma, mc, 0, 0, ma, mc, 0, 0,
mb, md, 0, 0, mb, md, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0,
tx, ty, 0, 1, tx, ty, 0, 1,
} }
c.UniformFloats(program, "modelview_matrix", glModelviewMatrix) 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) c.UniformInt(program, "texture", 0)
e := [4][5]float32{} e := [4][5]float32{}
@ -157,17 +190,23 @@ func useProgramForTexture(c *opengl.Context, projectionMatrix []float32, texture
} }
} }
glColorMatrix := []float32{ colorMatrix := []float32{
e[0][0], e[1][0], e[2][0], e[3][0], 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][1], e[1][1], e[2][1], e[3][1],
e[0][2], e[1][2], e[2][2], e[3][2], e[0][2], e[1][2], e[2][2], e[3][2],
e[0][3], e[1][3], e[2][3], e[3][3], e[0][3], e[1][3], e[2][3], e[3][3],
} }
c.UniformFloats(program, "color_matrix", glColorMatrix) if !areSameFloat32Array(lastColorMatrix, colorMatrix) {
glColorMatrixTranslation := []float32{ 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], e[0][4], e[1][4], e[2][4], e[3][4],
} }
c.UniformFloats(program, "color_matrix_translation", glColorMatrixTranslation) c.UniformFloats(program, "color_matrix_translation", colorMatrixTranslation)
// We don't have to call gl.ActiveTexture here: GL_TEXTURE0 is the default active texture // 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 // See also: https://www.opengl.org/sdk/docs/man2/xhtml/glActiveTexture.xml