mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 18:58:54 +01:00
graphics: Cache values for uniformMatrix4fv
This commit is contained in:
parent
6fc6c7ed95
commit
2b7617da7a
@ -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)
|
||||||
|
|
||||||
c.UniformFloats(program, "projection_matrix", projectionMatrix)
|
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))
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user