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 :)
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]
Coef03 := m.Data[1][2]*m.Data[2][3] - m.Data[2][2]*m.Data[1][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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1]
Fac0 := NewVec4(Coef00, Coef00, Coef02, Coef03)
Fac1 := NewVec4(Coef04, Coef04, Coef06, Coef07)
Fac2 := NewVec4(Coef08, Coef08, Coef10, Coef11)
Fac3 := NewVec4(Coef12, Coef12, Coef14, Coef15)
Fac4 := NewVec4(Coef16, Coef16, Coef18, Coef19)
Fac5 := NewVec4(Coef20, Coef20, Coef22, Coef23)
fac0 := NewVec4(coef00, coef00, coef02, coef03)
fac1 := NewVec4(coef04, coef04, coef06, coef07)
fac2 := NewVec4(coef08, coef08, coef10, coef11)
fac3 := NewVec4(coef12, coef12, coef14, coef15)
fac4 := NewVec4(coef16, coef16, coef18, coef19)
fac5 := NewVec4(coef20, coef20, coef22, coef23)
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])
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])
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])
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])
Inv0 := NewVec4(
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.Z()*Fac0.Z()-Vec2.Z()*Fac1.Z()+Vec3.Z()*Fac2.Z(),
Vec1.W()*Fac0.W()-Vec2.W()*Fac1.W()+Vec3.W()*Fac2.W(),
inv0 := NewVec4(
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.Z()*fac0.Z()-vec2.Z()*fac1.Z()+vec3.Z()*fac2.Z(),
vec1.W()*fac0.W()-vec2.W()*fac1.W()+vec3.W()*fac2.W(),
)
Inv1 := NewVec4(
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.Z()*Fac0.Z()-Vec2.Z()*Fac3.Z()+Vec3.Z()*Fac4.Z(),
Vec0.W()*Fac0.W()-Vec2.W()*Fac3.W()+Vec3.W()*Fac4.W(),
inv1 := NewVec4(
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.Z()*fac0.Z()-vec2.Z()*fac3.Z()+vec3.Z()*fac4.Z(),
vec0.W()*fac0.W()-vec2.W()*fac3.W()+vec3.W()*fac4.W(),
)
Inv2 := NewVec4(
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.Z()*Fac1.Z()-Vec1.Z()*Fac3.Z()+Vec3.Z()*Fac5.Z(),
Vec0.W()*Fac1.W()-Vec1.W()*Fac3.W()+Vec3.W()*Fac5.W(),
inv2 := NewVec4(
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.Z()*fac1.Z()-vec1.Z()*fac3.Z()+vec3.Z()*fac5.Z(),
vec0.W()*fac1.W()-vec1.W()*fac3.W()+vec3.W()*fac5.W(),
)
Inv3 := NewVec4(
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.Z()*Fac2.Z()-Vec1.Z()*Fac4.Z()+Vec2.Z()*Fac5.Z(),
Vec0.W()*Fac2.W()-Vec1.W()*Fac4.W()+Vec2.W()*Fac5.W(),
inv3 := NewVec4(
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.Z()*fac2.Z()-vec1.Z()*fac4.Z()+vec2.Z()*fac5.Z(),
vec0.W()*fac2.W()-vec1.W()*fac4.W()+vec2.W()*fac5.W(),
)
SignA := NewVec4(+1, -1, +1, -1)
SignB := NewVec4(-1, +1, -1, +1)
signA := NewVec4(+1, -1, +1, -1)
signB := NewVec4(-1, +1, -1, +1)
Inverse := NewMat4Id()
Inverse.Data = [4][4]float32{
{Inv0.X() * SignA.X(), Inv0.Y() * SignA.Y(), Inv0.Z() * SignA.Z(), Inv0.W() * SignA.W()},
{Inv1.X() * SignB.X(), Inv1.Y() * SignB.Y(), Inv1.Z() * SignB.Z(), Inv1.W() * SignB.W()},
{Inv2.X() * SignA.X(), Inv2.Y() * SignA.Y(), Inv2.Z() * SignA.Z(), Inv2.W() * SignA.W()},
{Inv3.X() * SignB.X(), Inv3.Y() * SignB.Y(), Inv3.Z() * SignB.Z(), Inv3.W() * SignB.W()},
}
inverse := NewMat4Arr(
inv0.ScaleVec(signA).Data,
inv1.ScaleVec(signB).Data,
inv2.ScaleVec(signA).Data,
inv3.ScaleVec(signB).Data,
)
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])
Dot1 := (Dot0.X() + Dot0.Y()) + (Dot0.Z() + Dot0.W())
row0 := NewVec4(inverse.Data[0][0], inverse.Data[1][0], inverse.Data[2][0], inverse.Data[3][0])
dot0 := NewVec4Arr(row0.ScaleArr(m.Data[0]).Data)
det := (dot0.X() + dot0.Y()) + (dot0.Z() + dot0.W())
return Dot1
return det
}
// Invert inverts this matrix.
@ -286,88 +285,87 @@ func (m *Mat4) Invert() *Mat4 {
// 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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
coef23 := m.Data[1][0]*m.Data[2][1] - m.Data[2][0]*m.Data[1][1]
Fac0 := NewVec4(Coef00, Coef00, Coef02, Coef03)
Fac1 := NewVec4(Coef04, Coef04, Coef06, Coef07)
Fac2 := NewVec4(Coef08, Coef08, Coef10, Coef11)
Fac3 := NewVec4(Coef12, Coef12, Coef14, Coef15)
Fac4 := NewVec4(Coef16, Coef16, Coef18, Coef19)
Fac5 := NewVec4(Coef20, Coef20, Coef22, Coef23)
fac0 := NewVec4(coef00, coef00, coef02, coef03)
fac1 := NewVec4(coef04, coef04, coef06, coef07)
fac2 := NewVec4(coef08, coef08, coef10, coef11)
fac3 := NewVec4(coef12, coef12, coef14, coef15)
fac4 := NewVec4(coef16, coef16, coef18, coef19)
fac5 := NewVec4(coef20, coef20, coef22, coef23)
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])
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])
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])
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])
Inv0 := NewVec4(
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.Z()*Fac0.Z()-Vec2.Z()*Fac1.Z()+Vec3.Z()*Fac2.Z(),
Vec1.W()*Fac0.W()-Vec2.W()*Fac1.W()+Vec3.W()*Fac2.W(),
inv0 := NewVec4(
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.Z()*fac0.Z()-vec2.Z()*fac1.Z()+vec3.Z()*fac2.Z(),
vec1.W()*fac0.W()-vec2.W()*fac1.W()+vec3.W()*fac2.W(),
)
Inv1 := NewVec4(
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.Z()*Fac0.Z()-Vec2.Z()*Fac3.Z()+Vec3.Z()*Fac4.Z(),
Vec0.W()*Fac0.W()-Vec2.W()*Fac3.W()+Vec3.W()*Fac4.W(),
inv1 := NewVec4(
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.Z()*fac0.Z()-vec2.Z()*fac3.Z()+vec3.Z()*fac4.Z(),
vec0.W()*fac0.W()-vec2.W()*fac3.W()+vec3.W()*fac4.W(),
)
Inv2 := NewVec4(
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.Z()*Fac1.Z()-Vec1.Z()*Fac3.Z()+Vec3.Z()*Fac5.Z(),
Vec0.W()*Fac1.W()-Vec1.W()*Fac3.W()+Vec3.W()*Fac5.W(),
inv2 := NewVec4(
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.Z()*fac1.Z()-vec1.Z()*fac3.Z()+vec3.Z()*fac5.Z(),
vec0.W()*fac1.W()-vec1.W()*fac3.W()+vec3.W()*fac5.W(),
)
Inv3 := NewVec4(
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.Z()*Fac2.Z()-Vec1.Z()*Fac4.Z()+Vec2.Z()*Fac5.Z(),
Vec0.W()*Fac2.W()-Vec1.W()*Fac4.W()+Vec2.W()*Fac5.W(),
inv3 := NewVec4(
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.Z()*fac2.Z()-vec1.Z()*fac4.Z()+vec2.Z()*fac5.Z(),
vec0.W()*fac2.W()-vec1.W()*fac4.W()+vec2.W()*fac5.W(),
)
SignA := NewVec4(+1, -1, +1, -1)
SignB := NewVec4(-1, +1, -1, +1)
signA := NewVec4(+1, -1, +1, -1)
signB := NewVec4(-1, +1, -1, +1)
Inverse := NewMat4Id()
Inverse.Data = [4][4]float32{
{Inv0.X() * SignA.X(), Inv0.Y() * SignA.Y(), Inv0.Z() * SignA.Z(), Inv0.W() * SignA.W()},
{Inv1.X() * SignB.X(), Inv1.Y() * SignB.Y(), Inv1.Z() * SignB.Z(), Inv1.W() * SignB.W()},
{Inv2.X() * SignA.X(), Inv2.Y() * SignA.Y(), Inv2.Z() * SignA.Z(), Inv2.W() * SignA.W()},
{Inv3.X() * SignB.X(), Inv3.Y() * SignB.Y(), Inv3.Z() * SignB.Z(), Inv3.W() * SignB.W()},
}
inverse := NewMat4Arr(
inv0.ScaleVec(signA).Data,
inv1.ScaleVec(signB).Data,
inv2.ScaleVec(signA).Data,
inv3.ScaleVec(signB).Data,
)
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])
Dot1 := (Dot0.X() + Dot0.Y()) + (Dot0.Z() + Dot0.W())
row0 := NewVec4(inverse.Data[0][0], inverse.Data[1][0], inverse.Data[2][0], inverse.Data[3][0])
dot0 := NewVec4Arr(row0.ScaleArr(m.Data[0]).Data)
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
}
@ -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
}
// 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
func (v *Vec2) Add(v2 *Vec2) *Vec2 {
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
}
// 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 {
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
}
// 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 {
v.Data[0] += v2.X()
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,
}
}