diff --git a/README.md b/README.md index e874d5f..3c5239f 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Fast OpenGL/Graphics focused Mathematics library in Go inspired by the c++ libra gglm currently has the following: +- Matrices are stored column major - `Vec2`, `Vec3` and `Vec4` structs that implement vector (x,y,z,w) operations - `Mat2`, `Mat3`, `Mat4` structs that implement square matrix operations - `Quat` struct that implements quaternion operations diff --git a/gglm/mat2.go b/gglm/mat2.go index 9ea72ec..9c92176 100755 --- a/gglm/mat2.go +++ b/gglm/mat2.go @@ -75,14 +75,24 @@ func (m *Mat2) Scale(x float32) *Mat2 { return m } -func (v *Mat2) Clone() *Mat2 { - return &Mat2{Data: v.Data} +func (m *Mat2) Clone() *Mat2 { + return &Mat2{Data: m.Data} } func (m *Mat2) Eq(m2 *Mat2) bool { return m.Data == m2.Data } +func (m *Mat2) Transpose() *Mat2 { + + m.Data = [2][2]float32{ + {m.Data[0][0], m.Data[1][0]}, + {m.Data[0][1], m.Data[1][1]}, + } + + return m +} + // AddMat2 m3 = m1 + m2 func AddMat2(m1, m2 *Mat2) *Mat2 { return &Mat2{ diff --git a/gglm/mat2_test.go b/gglm/mat2_test.go index 8de9935..0192d90 100755 --- a/gglm/mat2_test.go +++ b/gglm/mat2_test.go @@ -147,6 +147,38 @@ func TestMulMat2Vec2(t *testing.T) { } } +func TestTransposeMat2(t *testing.T) { + + m := gglm.NewMat2Id() + ans := gglm.NewMat2Id() + + if !m.Transpose().Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + m = &gglm.Mat2{ + Data: [2][2]float32{ + {00, 01}, + {10, 11}, + }, + } + + ans = &gglm.Mat2{ + Data: [2][2]float32{ + {00, 10}, + {01, 11}, + }, + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } +} + func BenchmarkMulMat2(b *testing.B) { m1 := gglm.NewMat2Id() diff --git a/gglm/mat3.go b/gglm/mat3.go index 46be1dc..ad374f4 100755 --- a/gglm/mat3.go +++ b/gglm/mat3.go @@ -126,14 +126,25 @@ func (m *Mat3) Scale(x float32) *Mat3 { return m } -func (v *Mat3) Clone() *Mat3 { - return &Mat3{Data: v.Data} +func (m *Mat3) Clone() *Mat3 { + return &Mat3{Data: m.Data} } func (m *Mat3) Eq(m2 *Mat3) bool { return m.Data == m2.Data } +func (m *Mat3) Transpose() *Mat3 { + + m.Data = [3][3]float32{ + {m.Data[0][0], m.Data[1][0], m.Data[2][0]}, + {m.Data[0][1], m.Data[1][1], m.Data[2][1]}, + {m.Data[0][2], m.Data[1][2], m.Data[2][2]}, + } + + return m +} + // AddMat3 m3 = m1 + m2 func AddMat3(m1, m2 *Mat3) *Mat3 { return &Mat3{ diff --git a/gglm/mat3_test.go b/gglm/mat3_test.go index d575e27..873b65e 100755 --- a/gglm/mat3_test.go +++ b/gglm/mat3_test.go @@ -162,6 +162,40 @@ func TestMulMat3Vec3(t *testing.T) { } } +func TestTransposeMat3(t *testing.T) { + + m := gglm.NewMat3Id() + ans := gglm.NewMat3Id() + + if !m.Transpose().Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + m = &gglm.Mat3{ + Data: [3][3]float32{ + {00, 01, 02}, + {10, 11, 12}, + {20, 21, 22}, + }, + } + + ans = &gglm.Mat3{ + Data: [3][3]float32{ + {00, 10, 20}, + {01, 11, 21}, + {02, 12, 22}, + }, + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } +} + func BenchmarkMulMat3(b *testing.B) { m1 := gglm.NewMat3Id() diff --git a/gglm/mat4.go b/gglm/mat4.go index 81236a3..4650ac2 100755 --- a/gglm/mat4.go +++ b/gglm/mat4.go @@ -180,6 +180,18 @@ func (m *Mat4) Eq(m2 *Mat4) bool { return m.Data == m2.Data } +func (m *Mat4) Transpose() *Mat4 { + + m.Data = [4][4]float32{ + {m.Data[0][0], m.Data[1][0], m.Data[2][0], m.Data[3][0]}, + {m.Data[0][1], m.Data[1][1], m.Data[2][1], m.Data[3][1]}, + {m.Data[0][2], m.Data[1][2], m.Data[2][2], m.Data[3][2]}, + {m.Data[0][3], m.Data[1][3], m.Data[2][3], m.Data[3][3]}, + } + + return m +} + // AddMat4 m3 = m1 + m2 func AddMat4(m1, m2 *Mat4) *Mat4 { return &Mat4{ diff --git a/gglm/mat4_test.go b/gglm/mat4_test.go index bb343c8..47bd463 100755 --- a/gglm/mat4_test.go +++ b/gglm/mat4_test.go @@ -182,6 +182,42 @@ func TestMulMat4Vec4(t *testing.T) { } } +func TestTransposeMat4(t *testing.T) { + + m := gglm.NewMat4Id() + ans := gglm.NewMat4Id() + + if !m.Transpose().Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } + + m = &gglm.Mat4{ + Data: [4][4]float32{ + {00, 01, 02, 03}, + {10, 11, 12, 13}, + {20, 21, 22, 23}, + {30, 31, 32, 33}, + }, + } + + ans = &gglm.Mat4{ + Data: [4][4]float32{ + {00, 10, 20, 30}, + {01, 11, 21, 31}, + {02, 12, 22, 32}, + {03, 13, 23, 33}, + }, + } + + if !m.Transpose().Eq(ans) { + t.Errorf("Got: %v; Expected: %v", m.String(), ans.String()) + } +} + func BenchmarkMulMat4(b *testing.B) { m1 := gglm.NewMat4Id()