diff --git a/gglm/mat2.go b/gglm/mat2.go index af0ce32..705f972 100755 --- a/gglm/mat2.go +++ b/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, + }, + } +} diff --git a/gglm/mat3.go b/gglm/mat3.go index ee0a8d5..220b0b4 100755 --- a/gglm/mat3.go +++ b/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, + }, + } +} diff --git a/gglm/mat4.go b/gglm/mat4.go index ede259c..ea31f27 100755 --- a/gglm/mat4.go +++ b/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, + }, + } +} diff --git a/gglm/vec2.go b/gglm/vec2.go index 12323c8..9a66abf 100755 --- a/gglm/vec2.go +++ b/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, + } +} diff --git a/gglm/vec3.go b/gglm/vec3.go index ec0fe88..785ff8f 100755 --- a/gglm/vec3.go +++ b/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, + } +} diff --git a/gglm/vec4.go b/gglm/vec4.go index 56e1236..883ff98 100755 --- a/gglm/vec4.go +++ b/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, + } +}