mirror of
https://github.com/bloeys/gglm.git
synced 2025-12-29 05:28:20 +00:00
NewXYZ funcs for ease of use and new ScaleXYZ funcs for vectors
This commit is contained in:
36
gglm/mat2.go
36
gglm/mat2.go
@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
40
gglm/mat3.go
40
gglm/mat3.go
@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
288
gglm/mat4.go
288
gglm/mat4.go
@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
20
gglm/vec2.go
20
gglm/vec2.go
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
22
gglm/vec3.go
22
gglm/vec3.go
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
24
gglm/vec4.go
24
gglm/vec4.go
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user