Optimize mat4 mul

This commit is contained in:
bloeys
2021-11-09 09:29:45 +04:00
parent 4c30b8b6d3
commit 9282567928

View File

@ -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],
}, },
}, },
} }