mirror of
https://github.com/bloeys/gglm.git
synced 2025-12-29 05:28:20 +00:00
Optimize mat4 mul
This commit is contained in:
106
gglm/mat4.go
106
gglm/mat4.go
@ -92,30 +92,51 @@ func (m *Mat4) Mul(m2 *Mat4) *Mat4 {
|
||||
// 02, 12, 22, 32,
|
||||
// 03, 13, 23, 33,
|
||||
|
||||
//Improves performance by ~8%
|
||||
m00 := m.Data[0][0]
|
||||
m01 := m.Data[0][1]
|
||||
m02 := m.Data[0][2]
|
||||
m03 := m.Data[0][3]
|
||||
|
||||
m10 := m.Data[1][0]
|
||||
m11 := m.Data[1][1]
|
||||
m12 := m.Data[1][2]
|
||||
m13 := m.Data[1][3]
|
||||
|
||||
m20 := m.Data[2][0]
|
||||
m21 := m.Data[2][1]
|
||||
m22 := m.Data[2][2]
|
||||
m23 := m.Data[2][3]
|
||||
|
||||
m30 := m.Data[3][0]
|
||||
m31 := m.Data[3][1]
|
||||
m32 := m.Data[3][2]
|
||||
m33 := m.Data[3][3]
|
||||
|
||||
m.Data = [4][4]float32{
|
||||
{
|
||||
m.Data[0][0]*m2.Data[0][0] + m.Data[1][0]*m2.Data[0][1] + m.Data[2][0]*m2.Data[0][2] + m.Data[3][0]*m2.Data[0][3],
|
||||
m.Data[0][1]*m2.Data[0][0] + m.Data[1][1]*m2.Data[0][1] + m.Data[2][1]*m2.Data[0][2] + m.Data[3][1]*m2.Data[0][3],
|
||||
m.Data[0][2]*m2.Data[0][0] + m.Data[1][2]*m2.Data[0][1] + m.Data[2][2]*m2.Data[0][2] + m.Data[3][2]*m2.Data[0][3],
|
||||
m.Data[0][3]*m2.Data[0][0] + m.Data[1][3]*m2.Data[0][1] + m.Data[2][3]*m2.Data[0][2] + m.Data[3][3]*m2.Data[0][3],
|
||||
m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*m2.Data[0][3],
|
||||
m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*m2.Data[0][3],
|
||||
m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*m2.Data[0][3],
|
||||
m03*m2.Data[0][0] + m13*m2.Data[0][1] + m23*m2.Data[0][2] + m33*m2.Data[0][3],
|
||||
},
|
||||
{
|
||||
m.Data[0][0]*m2.Data[1][0] + m.Data[1][0]*m2.Data[1][1] + m.Data[2][0]*m2.Data[1][2] + m.Data[3][0]*m2.Data[1][3],
|
||||
m.Data[0][1]*m2.Data[1][0] + m.Data[1][1]*m2.Data[1][1] + m.Data[2][1]*m2.Data[1][2] + m.Data[3][1]*m2.Data[1][3],
|
||||
m.Data[0][2]*m2.Data[1][0] + m.Data[1][2]*m2.Data[1][1] + m.Data[2][2]*m2.Data[1][2] + m.Data[3][2]*m2.Data[1][3],
|
||||
m.Data[0][3]*m2.Data[1][0] + m.Data[1][3]*m2.Data[1][1] + m.Data[2][3]*m2.Data[1][2] + m.Data[3][3]*m2.Data[1][3],
|
||||
m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*m2.Data[1][3],
|
||||
m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*m2.Data[1][3],
|
||||
m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*m2.Data[1][3],
|
||||
m03*m2.Data[1][0] + m13*m2.Data[1][1] + m23*m2.Data[1][2] + m33*m2.Data[1][3],
|
||||
},
|
||||
{
|
||||
m.Data[0][0]*m2.Data[2][0] + m.Data[1][0]*m2.Data[2][1] + m.Data[2][0]*m2.Data[2][2] + m.Data[3][0]*m2.Data[2][3],
|
||||
m.Data[0][1]*m2.Data[2][0] + m.Data[1][1]*m2.Data[2][1] + m.Data[2][1]*m2.Data[2][2] + m.Data[3][1]*m2.Data[2][3],
|
||||
m.Data[0][2]*m2.Data[2][0] + m.Data[1][2]*m2.Data[2][1] + m.Data[2][2]*m2.Data[2][2] + m.Data[3][2]*m2.Data[2][3],
|
||||
m.Data[0][3]*m2.Data[2][0] + m.Data[1][3]*m2.Data[2][1] + m.Data[2][3]*m2.Data[2][2] + m.Data[3][3]*m2.Data[2][3],
|
||||
m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*m2.Data[2][3],
|
||||
m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*m2.Data[2][3],
|
||||
m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*m2.Data[2][3],
|
||||
m03*m2.Data[2][0] + m13*m2.Data[2][1] + m23*m2.Data[2][2] + m33*m2.Data[2][3],
|
||||
},
|
||||
{
|
||||
m.Data[0][0]*m2.Data[3][0] + m.Data[1][0]*m2.Data[3][1] + m.Data[2][0]*m2.Data[3][2] + m.Data[3][0]*m2.Data[3][3],
|
||||
m.Data[0][1]*m2.Data[3][0] + m.Data[1][1]*m2.Data[3][1] + m.Data[2][1]*m2.Data[3][2] + m.Data[3][1]*m2.Data[3][3],
|
||||
m.Data[0][2]*m2.Data[3][0] + m.Data[1][2]*m2.Data[3][1] + m.Data[2][2]*m2.Data[3][2] + m.Data[3][2]*m2.Data[3][3],
|
||||
m.Data[0][3]*m2.Data[3][0] + m.Data[1][3]*m2.Data[3][1] + m.Data[2][3]*m2.Data[3][2] + m.Data[3][3]*m2.Data[3][3],
|
||||
m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*m2.Data[3][3],
|
||||
m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*m2.Data[3][3],
|
||||
m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*m2.Data[3][3],
|
||||
m03*m2.Data[3][0] + m13*m2.Data[3][1] + m23*m2.Data[3][2] + m33*m2.Data[3][3],
|
||||
},
|
||||
}
|
||||
|
||||
@ -221,31 +242,52 @@ func SubMat4(m1, m2 *Mat4) *Mat4 {
|
||||
|
||||
//MulMat4 m3 = m1 * m2
|
||||
func MulMat4(m1, m2 *Mat4) *Mat4 {
|
||||
|
||||
m00 := m1.Data[0][0]
|
||||
m01 := m1.Data[0][1]
|
||||
m02 := m1.Data[0][2]
|
||||
m03 := m1.Data[0][3]
|
||||
|
||||
m10 := m1.Data[1][0]
|
||||
m11 := m1.Data[1][1]
|
||||
m12 := m1.Data[1][2]
|
||||
m13 := m1.Data[1][3]
|
||||
|
||||
m20 := m1.Data[2][0]
|
||||
m21 := m1.Data[2][1]
|
||||
m22 := m1.Data[2][2]
|
||||
m23 := m1.Data[2][3]
|
||||
|
||||
m30 := m1.Data[3][0]
|
||||
m31 := m1.Data[3][1]
|
||||
m32 := m1.Data[3][2]
|
||||
m33 := m1.Data[3][3]
|
||||
|
||||
return &Mat4{
|
||||
Data: [4][4]float32{
|
||||
{
|
||||
m1.Data[0][0]*m2.Data[0][0] + m1.Data[1][0]*m2.Data[0][1] + m1.Data[2][0]*m2.Data[0][2] + m1.Data[3][0]*m2.Data[0][3],
|
||||
m1.Data[0][1]*m2.Data[0][0] + m1.Data[1][1]*m2.Data[0][1] + m1.Data[2][1]*m2.Data[0][2] + m1.Data[3][1]*m2.Data[0][3],
|
||||
m1.Data[0][2]*m2.Data[0][0] + m1.Data[1][2]*m2.Data[0][1] + m1.Data[2][2]*m2.Data[0][2] + m1.Data[3][2]*m2.Data[0][3],
|
||||
m1.Data[0][3]*m2.Data[0][0] + m1.Data[1][3]*m2.Data[0][1] + m1.Data[2][3]*m2.Data[0][2] + m1.Data[3][3]*m2.Data[0][3],
|
||||
m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*m2.Data[0][3],
|
||||
m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*m2.Data[0][3],
|
||||
m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*m2.Data[0][3],
|
||||
m03*m2.Data[0][0] + m13*m2.Data[0][1] + m23*m2.Data[0][2] + m33*m2.Data[0][3],
|
||||
},
|
||||
{
|
||||
m1.Data[0][0]*m2.Data[1][0] + m1.Data[1][0]*m2.Data[1][1] + m1.Data[2][0]*m2.Data[1][2] + m1.Data[3][0]*m2.Data[1][3],
|
||||
m1.Data[0][1]*m2.Data[1][0] + m1.Data[1][1]*m2.Data[1][1] + m1.Data[2][1]*m2.Data[1][2] + m1.Data[3][1]*m2.Data[1][3],
|
||||
m1.Data[0][2]*m2.Data[1][0] + m1.Data[1][2]*m2.Data[1][1] + m1.Data[2][2]*m2.Data[1][2] + m1.Data[3][2]*m2.Data[1][3],
|
||||
m1.Data[0][3]*m2.Data[1][0] + m1.Data[1][3]*m2.Data[1][1] + m1.Data[2][3]*m2.Data[1][2] + m1.Data[3][3]*m2.Data[1][3],
|
||||
m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*m2.Data[1][3],
|
||||
m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*m2.Data[1][3],
|
||||
m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*m2.Data[1][3],
|
||||
m03*m2.Data[1][0] + m13*m2.Data[1][1] + m23*m2.Data[1][2] + m33*m2.Data[1][3],
|
||||
},
|
||||
{
|
||||
m1.Data[0][0]*m2.Data[2][0] + m1.Data[1][0]*m2.Data[2][1] + m1.Data[2][0]*m2.Data[2][2] + m1.Data[3][0]*m2.Data[2][3],
|
||||
m1.Data[0][1]*m2.Data[2][0] + m1.Data[1][1]*m2.Data[2][1] + m1.Data[2][1]*m2.Data[2][2] + m1.Data[3][1]*m2.Data[2][3],
|
||||
m1.Data[0][2]*m2.Data[2][0] + m1.Data[1][2]*m2.Data[2][1] + m1.Data[2][2]*m2.Data[2][2] + m1.Data[3][2]*m2.Data[2][3],
|
||||
m1.Data[0][3]*m2.Data[2][0] + m1.Data[1][3]*m2.Data[2][1] + m1.Data[2][3]*m2.Data[2][2] + m1.Data[3][3]*m2.Data[2][3],
|
||||
m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*m2.Data[2][3],
|
||||
m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*m2.Data[2][3],
|
||||
m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*m2.Data[2][3],
|
||||
m03*m2.Data[2][0] + m13*m2.Data[2][1] + m23*m2.Data[2][2] + m33*m2.Data[2][3],
|
||||
},
|
||||
{
|
||||
m1.Data[0][0]*m2.Data[3][0] + m1.Data[1][0]*m2.Data[3][1] + m1.Data[2][0]*m2.Data[3][2] + m1.Data[3][0]*m2.Data[3][3],
|
||||
m1.Data[0][1]*m2.Data[3][0] + m1.Data[1][1]*m2.Data[3][1] + m1.Data[2][1]*m2.Data[3][2] + m1.Data[3][1]*m2.Data[3][3],
|
||||
m1.Data[0][2]*m2.Data[3][0] + m1.Data[1][2]*m2.Data[3][1] + m1.Data[2][2]*m2.Data[3][2] + m1.Data[3][2]*m2.Data[3][3],
|
||||
m1.Data[0][3]*m2.Data[3][0] + m1.Data[1][3]*m2.Data[3][1] + m1.Data[2][3]*m2.Data[3][2] + m1.Data[3][3]*m2.Data[3][3],
|
||||
m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*m2.Data[3][3],
|
||||
m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*m2.Data[3][3],
|
||||
m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*m2.Data[3][3],
|
||||
m03*m2.Data[3][0] + m13*m2.Data[3][1] + m23*m2.Data[3][2] + m33*m2.Data[3][3],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user