From 818bda4882e5dd4a913e17d6d2ee415f5271e80b Mon Sep 17 00:00:00 2001 From: bloeys Date: Thu, 4 Nov 2021 22:49:20 +0400 Subject: [PATCH] Vec2&Mat2 add/sub functions+mat size enum --- gglm/mat.go | 11 ++++++++++- gglm/mat2.go | 40 ++++++++++++++++++++++++++++++++++++++-- gglm/vec2.go | 10 ++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/gglm/mat.go b/gglm/mat.go index d559117..ac0d8a2 100755 --- a/gglm/mat.go +++ b/gglm/mat.go @@ -1,7 +1,16 @@ package gglm +type MatSize int + +const ( + MatSizeUnknown MatSize = iota + MatSize2x2 + MatSize3x3 + MatSize4x4 +) + type Mat interface { At(row, col int) float32 Set(row, col int, val float32) - Size() int + Size() MatSize } diff --git a/gglm/mat2.go b/gglm/mat2.go index 0a2a73a..193e99c 100755 --- a/gglm/mat2.go +++ b/gglm/mat2.go @@ -21,14 +21,30 @@ func (m *Mat2) Set(row, col int, val float32) { m.Data[row*2+col] = val } -func (m *Mat2) Size() int { - return 2 +func (m *Mat2) Size() MatSize { + return MatSize2x2 } func (m *Mat2) String() string { return fmt.Sprintf("| %f %f |\n| %f %f |", m.Data[0], m.Data[1], m.Data[2], m.Data[3]) } +//Add m += m2 +func (m *Mat2) Add(m2 *Mat2) { + m.Data[0] += m2.Data[0] + m.Data[1] += m2.Data[1] + m.Data[2] += m2.Data[2] + m.Data[3] += m2.Data[3] +} + +//Add m -= m2 +func (m *Mat2) Sub(m2 *Mat2) { + m.Data[0] -= m2.Data[0] + m.Data[1] -= m2.Data[1] + m.Data[2] -= m2.Data[2] + m.Data[3] -= m2.Data[3] +} + //Scale m *= x (element wise multiplication) func (m *Mat2) Scale(x float32) { m.Data[0] *= x @@ -37,6 +53,26 @@ func (m *Mat2) Scale(x float32) { m.Data[3] *= x } +//AddMat2 m3 = m1 + m2 +func AddMat2(m1, m2 *Mat2) *Mat2 { + return NewMat2([]float32{ + m1.Data[0] + m2.Data[0], + m1.Data[1] + m2.Data[1], + m1.Data[2] + m2.Data[2], + m1.Data[3] + m2.Data[3], + }) +} + +//SubMat2 m3 = m1 - m2 +func SubMat2(m1, m2 *Mat2) *Mat2 { + return NewMat2([]float32{ + m1.Data[0] - m2.Data[0], + m1.Data[1] - m2.Data[1], + m1.Data[2] - m2.Data[2], + m1.Data[3] - m2.Data[3], + }) +} + //NewMat2 returns the identity matrix if data=nil, otherwise data is used //as the backing array. // diff --git a/gglm/vec2.go b/gglm/vec2.go index a25852e..195acbb 100755 --- a/gglm/vec2.go +++ b/gglm/vec2.go @@ -60,6 +60,16 @@ func (v *Vec2) SqrMag() float32 { return v.X()*v.X() + v.Y()*v.Y() } +//AddVec2 v3 = v1 + v2 +func AddVec2(v1 *Vec2, v2 *Vec2) *Vec2 { + return NewVec2([]float32{v1.X() + v2.X(), v1.Y() + v2.Y()}) +} + +//SubVec2 v3 = v1 + v2 +func SubVec2(v1, v2 *Vec2) *Vec2 { + return NewVec2([]float32{v1.X() - v2.X(), v1.Y() - v2.Y()}) +} + func NewVec2(data []float32) *Vec2 { if data == nil {