NewXYZ funcs for ease of use and new ScaleXYZ funcs for vectors

This commit is contained in:
bloeys
2024-05-04 21:10:57 +04:00
parent cc5e7dcbce
commit c08e9d8610
6 changed files with 307 additions and 123 deletions

View File

@ -180,3 +180,39 @@ func NewMat2Id() *Mat2 {
}, },
} }
} }
func NewMat2Diag(diagVal float32) *Mat2 {
return &Mat2{
Data: [2][2]float32{
{diagVal, 0},
{0, diagVal},
},
}
}
func NewMat2DiagArr(diag [2]float32) *Mat2 {
return &Mat2{
Data: [2][2]float32{
{diag[0], 0},
{0, diag[1]},
},
}
}
func NewMat2Vec2(col0, col1 *Vec2) *Mat2 {
return &Mat2{
Data: [2][2]float32{
col0.Data,
col1.Data,
},
}
}
func NewMat2Arr(col0, col1 [2]float32) *Mat2 {
return &Mat2{
Data: [2][2]float32{
col0,
col1,
},
}
}

View File

@ -296,3 +296,43 @@ func NewMat3Id() *Mat3 {
}, },
} }
} }
func NewMat3Diag(diagVal float32) *Mat3 {
return &Mat3{
Data: [3][3]float32{
{diagVal, 0, 0},
{0, diagVal, 0},
{0, 0, diagVal},
},
}
}
func NewMat3DiagArr(diag [3]float32) *Mat3 {
return &Mat3{
Data: [3][3]float32{
{diag[0], 0, 0},
{0, diag[1], 0},
{0, 0, diag[2]},
},
}
}
func NewMat3Vec3(col0, col1, col2 *Vec3) *Mat3 {
return &Mat3{
Data: [3][3]float32{
col0.Data,
col1.Data,
col2.Data,
},
}
}
func NewMat3Arr(col0, col1, col2 [3]float32) *Mat3 {
return &Mat3{
Data: [3][3]float32{
col0,
col1,
col2,
},
}
}

View File

@ -196,86 +196,85 @@ func (m *Mat4) Determinant() float32 {
// Many thanks to the C++ GLM project here :) // Many thanks to the C++ GLM project here :)
Coef00 := m.Data[2][2]*m.Data[3][3] - m.Data[3][2]*m.Data[2][3] coef00 := m.Data[2][2]*m.Data[3][3] - m.Data[3][2]*m.Data[2][3]
Coef02 := m.Data[1][2]*m.Data[3][3] - m.Data[3][2]*m.Data[1][3] coef02 := m.Data[1][2]*m.Data[3][3] - m.Data[3][2]*m.Data[1][3]
Coef03 := m.Data[1][2]*m.Data[2][3] - m.Data[2][2]*m.Data[1][3] coef03 := m.Data[1][2]*m.Data[2][3] - m.Data[2][2]*m.Data[1][3]
Coef04 := m.Data[2][1]*m.Data[3][3] - m.Data[3][1]*m.Data[2][3] coef04 := m.Data[2][1]*m.Data[3][3] - m.Data[3][1]*m.Data[2][3]
Coef06 := m.Data[1][1]*m.Data[3][3] - m.Data[3][1]*m.Data[1][3] coef06 := m.Data[1][1]*m.Data[3][3] - m.Data[3][1]*m.Data[1][3]
Coef07 := m.Data[1][1]*m.Data[2][3] - m.Data[2][1]*m.Data[1][3] coef07 := m.Data[1][1]*m.Data[2][3] - m.Data[2][1]*m.Data[1][3]
Coef08 := m.Data[2][1]*m.Data[3][2] - m.Data[3][1]*m.Data[2][2] coef08 := m.Data[2][1]*m.Data[3][2] - m.Data[3][1]*m.Data[2][2]
Coef10 := m.Data[1][1]*m.Data[3][2] - m.Data[3][1]*m.Data[1][2] coef10 := m.Data[1][1]*m.Data[3][2] - m.Data[3][1]*m.Data[1][2]
Coef11 := m.Data[1][1]*m.Data[2][2] - m.Data[2][1]*m.Data[1][2] coef11 := m.Data[1][1]*m.Data[2][2] - m.Data[2][1]*m.Data[1][2]
Coef12 := m.Data[2][0]*m.Data[3][3] - m.Data[3][0]*m.Data[2][3] coef12 := m.Data[2][0]*m.Data[3][3] - m.Data[3][0]*m.Data[2][3]
Coef14 := m.Data[1][0]*m.Data[3][3] - m.Data[3][0]*m.Data[1][3] coef14 := m.Data[1][0]*m.Data[3][3] - m.Data[3][0]*m.Data[1][3]
Coef15 := m.Data[1][0]*m.Data[2][3] - m.Data[2][0]*m.Data[1][3] coef15 := m.Data[1][0]*m.Data[2][3] - m.Data[2][0]*m.Data[1][3]
Coef16 := m.Data[2][0]*m.Data[3][2] - m.Data[3][0]*m.Data[2][2] coef16 := m.Data[2][0]*m.Data[3][2] - m.Data[3][0]*m.Data[2][2]
Coef18 := m.Data[1][0]*m.Data[3][2] - m.Data[3][0]*m.Data[1][2] coef18 := m.Data[1][0]*m.Data[3][2] - m.Data[3][0]*m.Data[1][2]
Coef19 := m.Data[1][0]*m.Data[2][2] - m.Data[2][0]*m.Data[1][2] coef19 := m.Data[1][0]*m.Data[2][2] - m.Data[2][0]*m.Data[1][2]
Coef20 := m.Data[2][0]*m.Data[3][1] - m.Data[3][0]*m.Data[2][1] coef20 := m.Data[2][0]*m.Data[3][1] - m.Data[3][0]*m.Data[2][1]
Coef22 := m.Data[1][0]*m.Data[3][1] - m.Data[3][0]*m.Data[1][1] coef22 := m.Data[1][0]*m.Data[3][1] - m.Data[3][0]*m.Data[1][1]
Coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1] coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1]
Fac0 := NewVec4(Coef00, Coef00, Coef02, Coef03) fac0 := NewVec4(coef00, coef00, coef02, coef03)
Fac1 := NewVec4(Coef04, Coef04, Coef06, Coef07) fac1 := NewVec4(coef04, coef04, coef06, coef07)
Fac2 := NewVec4(Coef08, Coef08, Coef10, Coef11) fac2 := NewVec4(coef08, coef08, coef10, coef11)
Fac3 := NewVec4(Coef12, Coef12, Coef14, Coef15) fac3 := NewVec4(coef12, coef12, coef14, coef15)
Fac4 := NewVec4(Coef16, Coef16, Coef18, Coef19) fac4 := NewVec4(coef16, coef16, coef18, coef19)
Fac5 := NewVec4(Coef20, Coef20, Coef22, Coef23) fac5 := NewVec4(coef20, coef20, coef22, coef23)
Vec0 := NewVec4(m.Data[1][0], m.Data[0][0], m.Data[0][0], m.Data[0][0]) vec0 := NewVec4(m.Data[1][0], m.Data[0][0], m.Data[0][0], m.Data[0][0])
Vec1 := NewVec4(m.Data[1][1], m.Data[0][1], m.Data[0][1], m.Data[0][1]) vec1 := NewVec4(m.Data[1][1], m.Data[0][1], m.Data[0][1], m.Data[0][1])
Vec2 := NewVec4(m.Data[1][2], m.Data[0][2], m.Data[0][2], m.Data[0][2]) vec2 := NewVec4(m.Data[1][2], m.Data[0][2], m.Data[0][2], m.Data[0][2])
Vec3 := NewVec4(m.Data[1][3], m.Data[0][3], m.Data[0][3], m.Data[0][3]) vec3 := NewVec4(m.Data[1][3], m.Data[0][3], m.Data[0][3], m.Data[0][3])
Inv0 := NewVec4( inv0 := NewVec4(
Vec1.X()*Fac0.X()-Vec2.X()*Fac1.X()+Vec3.X()*Fac2.X(), vec1.X()*fac0.X()-vec2.X()*fac1.X()+vec3.X()*fac2.X(),
Vec1.Y()*Fac0.Y()-Vec2.Y()*Fac1.Y()+Vec3.Y()*Fac2.Y(), vec1.Y()*fac0.Y()-vec2.Y()*fac1.Y()+vec3.Y()*fac2.Y(),
Vec1.Z()*Fac0.Z()-Vec2.Z()*Fac1.Z()+Vec3.Z()*Fac2.Z(), vec1.Z()*fac0.Z()-vec2.Z()*fac1.Z()+vec3.Z()*fac2.Z(),
Vec1.W()*Fac0.W()-Vec2.W()*Fac1.W()+Vec3.W()*Fac2.W(), vec1.W()*fac0.W()-vec2.W()*fac1.W()+vec3.W()*fac2.W(),
) )
Inv1 := NewVec4( inv1 := NewVec4(
Vec0.X()*Fac0.X()-Vec2.X()*Fac3.X()+Vec3.X()*Fac4.X(), vec0.X()*fac0.X()-vec2.X()*fac3.X()+vec3.X()*fac4.X(),
Vec0.Y()*Fac0.Y()-Vec2.Y()*Fac3.Y()+Vec3.Y()*Fac4.Y(), vec0.Y()*fac0.Y()-vec2.Y()*fac3.Y()+vec3.Y()*fac4.Y(),
Vec0.Z()*Fac0.Z()-Vec2.Z()*Fac3.Z()+Vec3.Z()*Fac4.Z(), vec0.Z()*fac0.Z()-vec2.Z()*fac3.Z()+vec3.Z()*fac4.Z(),
Vec0.W()*Fac0.W()-Vec2.W()*Fac3.W()+Vec3.W()*Fac4.W(), vec0.W()*fac0.W()-vec2.W()*fac3.W()+vec3.W()*fac4.W(),
) )
Inv2 := NewVec4( inv2 := NewVec4(
Vec0.X()*Fac1.X()-Vec1.X()*Fac3.X()+Vec3.X()*Fac5.X(), vec0.X()*fac1.X()-vec1.X()*fac3.X()+vec3.X()*fac5.X(),
Vec0.Y()*Fac1.Y()-Vec1.Y()*Fac3.Y()+Vec3.Y()*Fac5.Y(), vec0.Y()*fac1.Y()-vec1.Y()*fac3.Y()+vec3.Y()*fac5.Y(),
Vec0.Z()*Fac1.Z()-Vec1.Z()*Fac3.Z()+Vec3.Z()*Fac5.Z(), vec0.Z()*fac1.Z()-vec1.Z()*fac3.Z()+vec3.Z()*fac5.Z(),
Vec0.W()*Fac1.W()-Vec1.W()*Fac3.W()+Vec3.W()*Fac5.W(), vec0.W()*fac1.W()-vec1.W()*fac3.W()+vec3.W()*fac5.W(),
) )
Inv3 := NewVec4( inv3 := NewVec4(
Vec0.X()*Fac2.X()-Vec1.X()*Fac4.X()+Vec2.X()*Fac5.X(), vec0.X()*fac2.X()-vec1.X()*fac4.X()+vec2.X()*fac5.X(),
Vec0.Y()*Fac2.Y()-Vec1.Y()*Fac4.Y()+Vec2.Y()*Fac5.Y(), vec0.Y()*fac2.Y()-vec1.Y()*fac4.Y()+vec2.Y()*fac5.Y(),
Vec0.Z()*Fac2.Z()-Vec1.Z()*Fac4.Z()+Vec2.Z()*Fac5.Z(), vec0.Z()*fac2.Z()-vec1.Z()*fac4.Z()+vec2.Z()*fac5.Z(),
Vec0.W()*Fac2.W()-Vec1.W()*Fac4.W()+Vec2.W()*Fac5.W(), vec0.W()*fac2.W()-vec1.W()*fac4.W()+vec2.W()*fac5.W(),
) )
SignA := NewVec4(+1, -1, +1, -1) signA := NewVec4(+1, -1, +1, -1)
SignB := NewVec4(-1, +1, -1, +1) signB := NewVec4(-1, +1, -1, +1)
Inverse := NewMat4Id() inverse := NewMat4Arr(
Inverse.Data = [4][4]float32{ inv0.ScaleVec(signA).Data,
{Inv0.X() * SignA.X(), Inv0.Y() * SignA.Y(), Inv0.Z() * SignA.Z(), Inv0.W() * SignA.W()}, inv1.ScaleVec(signB).Data,
{Inv1.X() * SignB.X(), Inv1.Y() * SignB.Y(), Inv1.Z() * SignB.Z(), Inv1.W() * SignB.W()}, inv2.ScaleVec(signA).Data,
{Inv2.X() * SignA.X(), Inv2.Y() * SignA.Y(), Inv2.Z() * SignA.Z(), Inv2.W() * SignA.W()}, inv3.ScaleVec(signB).Data,
{Inv3.X() * SignB.X(), Inv3.Y() * SignB.Y(), Inv3.Z() * SignB.Z(), Inv3.W() * SignB.W()}, )
}
Row0 := NewVec4(Inverse.Data[0][0], Inverse.Data[1][0], Inverse.Data[2][0], Inverse.Data[3][0]) row0 := NewVec4(inverse.Data[0][0], inverse.Data[1][0], inverse.Data[2][0], inverse.Data[3][0])
Dot0 := NewVec4(Row0.X()*m.Data[0][0], Row0.Y()*m.Data[0][1], Row0.Z()*m.Data[0][2], Row0.W()*m.Data[0][3]) dot0 := NewVec4Arr(row0.ScaleArr(m.Data[0]).Data)
Dot1 := (Dot0.X() + Dot0.Y()) + (Dot0.Z() + Dot0.W()) det := (dot0.X() + dot0.Y()) + (dot0.Z() + dot0.W())
return Dot1 return det
} }
// Invert inverts this matrix. // Invert inverts this matrix.
@ -286,88 +285,87 @@ func (m *Mat4) Invert() *Mat4 {
// Many thanks to the C++ GLM project here :) // Many thanks to the C++ GLM project here :)
Coef00 := m.Data[2][2]*m.Data[3][3] - m.Data[3][2]*m.Data[2][3] coef00 := m.Data[2][2]*m.Data[3][3] - m.Data[3][2]*m.Data[2][3]
Coef02 := m.Data[1][2]*m.Data[3][3] - m.Data[3][2]*m.Data[1][3] coef02 := m.Data[1][2]*m.Data[3][3] - m.Data[3][2]*m.Data[1][3]
Coef03 := m.Data[1][2]*m.Data[2][3] - m.Data[2][2]*m.Data[1][3] coef03 := m.Data[1][2]*m.Data[2][3] - m.Data[2][2]*m.Data[1][3]
Coef04 := m.Data[2][1]*m.Data[3][3] - m.Data[3][1]*m.Data[2][3] coef04 := m.Data[2][1]*m.Data[3][3] - m.Data[3][1]*m.Data[2][3]
Coef06 := m.Data[1][1]*m.Data[3][3] - m.Data[3][1]*m.Data[1][3] coef06 := m.Data[1][1]*m.Data[3][3] - m.Data[3][1]*m.Data[1][3]
Coef07 := m.Data[1][1]*m.Data[2][3] - m.Data[2][1]*m.Data[1][3] coef07 := m.Data[1][1]*m.Data[2][3] - m.Data[2][1]*m.Data[1][3]
Coef08 := m.Data[2][1]*m.Data[3][2] - m.Data[3][1]*m.Data[2][2] coef08 := m.Data[2][1]*m.Data[3][2] - m.Data[3][1]*m.Data[2][2]
Coef10 := m.Data[1][1]*m.Data[3][2] - m.Data[3][1]*m.Data[1][2] coef10 := m.Data[1][1]*m.Data[3][2] - m.Data[3][1]*m.Data[1][2]
Coef11 := m.Data[1][1]*m.Data[2][2] - m.Data[2][1]*m.Data[1][2] coef11 := m.Data[1][1]*m.Data[2][2] - m.Data[2][1]*m.Data[1][2]
Coef12 := m.Data[2][0]*m.Data[3][3] - m.Data[3][0]*m.Data[2][3] coef12 := m.Data[2][0]*m.Data[3][3] - m.Data[3][0]*m.Data[2][3]
Coef14 := m.Data[1][0]*m.Data[3][3] - m.Data[3][0]*m.Data[1][3] coef14 := m.Data[1][0]*m.Data[3][3] - m.Data[3][0]*m.Data[1][3]
Coef15 := m.Data[1][0]*m.Data[2][3] - m.Data[2][0]*m.Data[1][3] coef15 := m.Data[1][0]*m.Data[2][3] - m.Data[2][0]*m.Data[1][3]
Coef16 := m.Data[2][0]*m.Data[3][2] - m.Data[3][0]*m.Data[2][2] coef16 := m.Data[2][0]*m.Data[3][2] - m.Data[3][0]*m.Data[2][2]
Coef18 := m.Data[1][0]*m.Data[3][2] - m.Data[3][0]*m.Data[1][2] coef18 := m.Data[1][0]*m.Data[3][2] - m.Data[3][0]*m.Data[1][2]
Coef19 := m.Data[1][0]*m.Data[2][2] - m.Data[2][0]*m.Data[1][2] coef19 := m.Data[1][0]*m.Data[2][2] - m.Data[2][0]*m.Data[1][2]
Coef20 := m.Data[2][0]*m.Data[3][1] - m.Data[3][0]*m.Data[2][1] coef20 := m.Data[2][0]*m.Data[3][1] - m.Data[3][0]*m.Data[2][1]
Coef22 := m.Data[1][0]*m.Data[3][1] - m.Data[3][0]*m.Data[1][1] coef22 := m.Data[1][0]*m.Data[3][1] - m.Data[3][0]*m.Data[1][1]
Coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1] coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1]
Fac0 := NewVec4(Coef00, Coef00, Coef02, Coef03) fac0 := NewVec4(coef00, coef00, coef02, coef03)
Fac1 := NewVec4(Coef04, Coef04, Coef06, Coef07) fac1 := NewVec4(coef04, coef04, coef06, coef07)
Fac2 := NewVec4(Coef08, Coef08, Coef10, Coef11) fac2 := NewVec4(coef08, coef08, coef10, coef11)
Fac3 := NewVec4(Coef12, Coef12, Coef14, Coef15) fac3 := NewVec4(coef12, coef12, coef14, coef15)
Fac4 := NewVec4(Coef16, Coef16, Coef18, Coef19) fac4 := NewVec4(coef16, coef16, coef18, coef19)
Fac5 := NewVec4(Coef20, Coef20, Coef22, Coef23) fac5 := NewVec4(coef20, coef20, coef22, coef23)
Vec0 := NewVec4(m.Data[1][0], m.Data[0][0], m.Data[0][0], m.Data[0][0]) vec0 := NewVec4(m.Data[1][0], m.Data[0][0], m.Data[0][0], m.Data[0][0])
Vec1 := NewVec4(m.Data[1][1], m.Data[0][1], m.Data[0][1], m.Data[0][1]) vec1 := NewVec4(m.Data[1][1], m.Data[0][1], m.Data[0][1], m.Data[0][1])
Vec2 := NewVec4(m.Data[1][2], m.Data[0][2], m.Data[0][2], m.Data[0][2]) vec2 := NewVec4(m.Data[1][2], m.Data[0][2], m.Data[0][2], m.Data[0][2])
Vec3 := NewVec4(m.Data[1][3], m.Data[0][3], m.Data[0][3], m.Data[0][3]) vec3 := NewVec4(m.Data[1][3], m.Data[0][3], m.Data[0][3], m.Data[0][3])
Inv0 := NewVec4( inv0 := NewVec4(
Vec1.X()*Fac0.X()-Vec2.X()*Fac1.X()+Vec3.X()*Fac2.X(), vec1.X()*fac0.X()-vec2.X()*fac1.X()+vec3.X()*fac2.X(),
Vec1.Y()*Fac0.Y()-Vec2.Y()*Fac1.Y()+Vec3.Y()*Fac2.Y(), vec1.Y()*fac0.Y()-vec2.Y()*fac1.Y()+vec3.Y()*fac2.Y(),
Vec1.Z()*Fac0.Z()-Vec2.Z()*Fac1.Z()+Vec3.Z()*Fac2.Z(), vec1.Z()*fac0.Z()-vec2.Z()*fac1.Z()+vec3.Z()*fac2.Z(),
Vec1.W()*Fac0.W()-Vec2.W()*Fac1.W()+Vec3.W()*Fac2.W(), vec1.W()*fac0.W()-vec2.W()*fac1.W()+vec3.W()*fac2.W(),
) )
Inv1 := NewVec4( inv1 := NewVec4(
Vec0.X()*Fac0.X()-Vec2.X()*Fac3.X()+Vec3.X()*Fac4.X(), vec0.X()*fac0.X()-vec2.X()*fac3.X()+vec3.X()*fac4.X(),
Vec0.Y()*Fac0.Y()-Vec2.Y()*Fac3.Y()+Vec3.Y()*Fac4.Y(), vec0.Y()*fac0.Y()-vec2.Y()*fac3.Y()+vec3.Y()*fac4.Y(),
Vec0.Z()*Fac0.Z()-Vec2.Z()*Fac3.Z()+Vec3.Z()*Fac4.Z(), vec0.Z()*fac0.Z()-vec2.Z()*fac3.Z()+vec3.Z()*fac4.Z(),
Vec0.W()*Fac0.W()-Vec2.W()*Fac3.W()+Vec3.W()*Fac4.W(), vec0.W()*fac0.W()-vec2.W()*fac3.W()+vec3.W()*fac4.W(),
) )
Inv2 := NewVec4( inv2 := NewVec4(
Vec0.X()*Fac1.X()-Vec1.X()*Fac3.X()+Vec3.X()*Fac5.X(), vec0.X()*fac1.X()-vec1.X()*fac3.X()+vec3.X()*fac5.X(),
Vec0.Y()*Fac1.Y()-Vec1.Y()*Fac3.Y()+Vec3.Y()*Fac5.Y(), vec0.Y()*fac1.Y()-vec1.Y()*fac3.Y()+vec3.Y()*fac5.Y(),
Vec0.Z()*Fac1.Z()-Vec1.Z()*Fac3.Z()+Vec3.Z()*Fac5.Z(), vec0.Z()*fac1.Z()-vec1.Z()*fac3.Z()+vec3.Z()*fac5.Z(),
Vec0.W()*Fac1.W()-Vec1.W()*Fac3.W()+Vec3.W()*Fac5.W(), vec0.W()*fac1.W()-vec1.W()*fac3.W()+vec3.W()*fac5.W(),
) )
Inv3 := NewVec4( inv3 := NewVec4(
Vec0.X()*Fac2.X()-Vec1.X()*Fac4.X()+Vec2.X()*Fac5.X(), vec0.X()*fac2.X()-vec1.X()*fac4.X()+vec2.X()*fac5.X(),
Vec0.Y()*Fac2.Y()-Vec1.Y()*Fac4.Y()+Vec2.Y()*Fac5.Y(), vec0.Y()*fac2.Y()-vec1.Y()*fac4.Y()+vec2.Y()*fac5.Y(),
Vec0.Z()*Fac2.Z()-Vec1.Z()*Fac4.Z()+Vec2.Z()*Fac5.Z(), vec0.Z()*fac2.Z()-vec1.Z()*fac4.Z()+vec2.Z()*fac5.Z(),
Vec0.W()*Fac2.W()-Vec1.W()*Fac4.W()+Vec2.W()*Fac5.W(), vec0.W()*fac2.W()-vec1.W()*fac4.W()+vec2.W()*fac5.W(),
) )
SignA := NewVec4(+1, -1, +1, -1) signA := NewVec4(+1, -1, +1, -1)
SignB := NewVec4(-1, +1, -1, +1) signB := NewVec4(-1, +1, -1, +1)
Inverse := NewMat4Id() inverse := NewMat4Arr(
Inverse.Data = [4][4]float32{ inv0.ScaleVec(signA).Data,
{Inv0.X() * SignA.X(), Inv0.Y() * SignA.Y(), Inv0.Z() * SignA.Z(), Inv0.W() * SignA.W()}, inv1.ScaleVec(signB).Data,
{Inv1.X() * SignB.X(), Inv1.Y() * SignB.Y(), Inv1.Z() * SignB.Z(), Inv1.W() * SignB.W()}, inv2.ScaleVec(signA).Data,
{Inv2.X() * SignA.X(), Inv2.Y() * SignA.Y(), Inv2.Z() * SignA.Z(), Inv2.W() * SignA.W()}, inv3.ScaleVec(signB).Data,
{Inv3.X() * SignB.X(), Inv3.Y() * SignB.Y(), Inv3.Z() * SignB.Z(), Inv3.W() * SignB.W()}, )
}
Row0 := NewVec4(Inverse.Data[0][0], Inverse.Data[1][0], Inverse.Data[2][0], Inverse.Data[3][0]) row0 := NewVec4(inverse.Data[0][0], inverse.Data[1][0], inverse.Data[2][0], inverse.Data[3][0])
Dot0 := NewVec4(Row0.X()*m.Data[0][0], Row0.Y()*m.Data[0][1], Row0.Z()*m.Data[0][2], Row0.W()*m.Data[0][3]) dot0 := NewVec4Arr(row0.ScaleArr(m.Data[0]).Data)
Dot1 := (Dot0.X() + Dot0.Y()) + (Dot0.Z() + Dot0.W()) det := (dot0.X() + dot0.Y()) + (dot0.Z() + dot0.W())
inverseDet := 1.0 / Dot1 inverseDet := 1.0 / det
m.Data = Inverse.Scale(inverseDet).Data m.Data = inverse.Scale(inverseDet).Data
return m return m
} }
@ -511,3 +509,47 @@ func NewMat4Id() *Mat4 {
}, },
} }
} }
func NewMat4Diag(diagVal float32) *Mat4 {
return &Mat4{
Data: [4][4]float32{
{diagVal, 0, 0, 0},
{0, diagVal, 0, 0},
{0, 0, diagVal, 0},
{0, 0, 0, diagVal},
},
}
}
func NewMat4DiagArr(diag [4]float32) *Mat4 {
return &Mat4{
Data: [4][4]float32{
{diag[0], 0, 0, 0},
{0, diag[1], 0, 0},
{0, 0, diag[2], 0},
{0, 0, 0, diag[3]},
},
}
}
func NewMat4Vec4(col0, col1, col2, col3 *Vec4) *Mat4 {
return &Mat4{
Data: [4][4]float32{
col0.Data,
col1.Data,
col2.Data,
col3.Data,
},
}
}
func NewMat4Arr(col0, col1, col2, col3 [4]float32) *Mat4 {
return &Mat4{
Data: [4][4]float32{
col0,
col1,
col2,
col3,
},
}
}

View File

@ -93,6 +93,20 @@ func (v *Vec2) Scale(x float32) *Vec2 {
return v return v
} }
// ScaleVec v *= v2 (element wise multiplication)
func (v *Vec2) ScaleVec(v2 *Vec2) *Vec2 {
v.Data[0] *= v2.X()
v.Data[1] *= v2.Y()
return v
}
// ScaleArr v *= arr (element wise multiplication)
func (v *Vec2) ScaleArr(arr [2]float32) *Vec2 {
v.Data[0] *= arr[0]
v.Data[1] *= arr[1]
return v
}
// Add v += v2 // Add v += v2
func (v *Vec2) Add(v2 *Vec2) *Vec2 { func (v *Vec2) Add(v2 *Vec2) *Vec2 {
v.Data[0] += v2.X() v.Data[0] += v2.X()
@ -164,3 +178,9 @@ func NewVec2(x, y float32) *Vec2 {
}, },
} }
} }
func NewVec2Arr(arr [2]float32) *Vec2 {
return &Vec2{
Data: arr,
}
}

View File

@ -140,6 +140,22 @@ func (v *Vec3) Scale(x float32) *Vec3 {
return v return v
} }
// ScaleVec v *= v2 (element wise multiplication)
func (v *Vec3) ScaleVec(v2 *Vec3) *Vec3 {
v.Data[0] *= v2.X()
v.Data[1] *= v2.Y()
v.Data[2] *= v2.Z()
return v
}
// ScaleArr v *= arr (element wise multiplication)
func (v *Vec3) ScaleArr(arr [3]float32) *Vec3 {
v.Data[0] *= arr[0]
v.Data[1] *= arr[1]
v.Data[2] *= arr[2]
return v
}
func (v *Vec3) Add(v2 *Vec3) *Vec3 { func (v *Vec3) Add(v2 *Vec3) *Vec3 {
v.Data[0] += v2.X() v.Data[0] += v2.X()
@ -251,3 +267,9 @@ func NewVec3(x, y, z float32) *Vec3 {
}, },
} }
} }
func NewVec3Arr(arr [3]float32) *Vec3 {
return &Vec3{
Data: arr,
}
}

View File

@ -193,6 +193,24 @@ func (v *Vec4) Scale(x float32) *Vec4 {
return v return v
} }
// ScaleVec v *= v2 (element wise multiplication)
func (v *Vec4) ScaleVec(v2 *Vec4) *Vec4 {
v.Data[0] *= v2.X()
v.Data[1] *= v2.Y()
v.Data[2] *= v2.Z()
v.Data[3] *= v2.W()
return v
}
// ScaleArr v *= arr (element wise multiplication)
func (v *Vec4) ScaleArr(arr [4]float32) *Vec4 {
v.Data[0] *= arr[0]
v.Data[1] *= arr[1]
v.Data[2] *= arr[2]
v.Data[3] *= arr[3]
return v
}
func (v *Vec4) Add(v2 *Vec4) *Vec4 { func (v *Vec4) Add(v2 *Vec4) *Vec4 {
v.Data[0] += v2.X() v.Data[0] += v2.X()
v.Data[1] += v2.Y() v.Data[1] += v2.Y()
@ -277,3 +295,9 @@ func NewVec4(x, y, z, w float32) *Vec4 {
}, },
} }
} }
func NewVec4Arr(arr [4]float32) *Vec4 {
return &Vec4{
Data: arr,
}
}