mirror of
https://github.com/bloeys/gglm.git
synced 2025-12-29 13:38: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,
|
// 02, 12, 22, 32,
|
||||||
// 03, 13, 23, 33,
|
// 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 = [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],
|
m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*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],
|
m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*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],
|
m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*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],
|
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],
|
m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*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],
|
m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*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],
|
m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*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],
|
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],
|
m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*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],
|
m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*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],
|
m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*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],
|
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],
|
m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*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],
|
m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*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],
|
m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*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],
|
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
|
//MulMat4 m3 = m1 * m2
|
||||||
func MulMat4(m1, m2 *Mat4) *Mat4 {
|
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{
|
return &Mat4{
|
||||||
Data: [4][4]float32{
|
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],
|
m00*m2.Data[0][0] + m10*m2.Data[0][1] + m20*m2.Data[0][2] + m30*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],
|
m01*m2.Data[0][0] + m11*m2.Data[0][1] + m21*m2.Data[0][2] + m31*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],
|
m02*m2.Data[0][0] + m12*m2.Data[0][1] + m22*m2.Data[0][2] + m32*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],
|
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],
|
m00*m2.Data[1][0] + m10*m2.Data[1][1] + m20*m2.Data[1][2] + m30*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],
|
m01*m2.Data[1][0] + m11*m2.Data[1][1] + m21*m2.Data[1][2] + m31*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],
|
m02*m2.Data[1][0] + m12*m2.Data[1][1] + m22*m2.Data[1][2] + m32*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],
|
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],
|
m00*m2.Data[2][0] + m10*m2.Data[2][1] + m20*m2.Data[2][2] + m30*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],
|
m01*m2.Data[2][0] + m11*m2.Data[2][1] + m21*m2.Data[2][2] + m31*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],
|
m02*m2.Data[2][0] + m12*m2.Data[2][1] + m22*m2.Data[2][2] + m32*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],
|
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],
|
m00*m2.Data[3][0] + m10*m2.Data[3][1] + m20*m2.Data[3][2] + m30*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],
|
m01*m2.Data[3][0] + m11*m2.Data[3][1] + m21*m2.Data[3][2] + m31*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],
|
m02*m2.Data[3][0] + m12*m2.Data[3][1] + m22*m2.Data[3][2] + m32*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],
|
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